> For the complete documentation index, see [llms.txt](https://docs.mymedtrics.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.mymedtrics.com/get-started/classic-data-mapping/evaluations-and-grades.md).

# Evaluations and grades

Evaluations & Assessments, Grade Books: 31 Medtrics Classic tables and their confirmed Oracle fields.

Evaluations & Assessments, Grade Books — 31 Medtrics Classic tables with 247 confirmed fields (18% of the mapping): Unchanged 56 · Renamed 107 · ID changed 84. Each table below lists where its confirmed fields went, what to change in a query, and a starter query. Back to the [map of the data](/get-started/classic-data-mapping.md).

![Evaluations and grades: 31 Medtrics Classic tables; the number is confirmed fields, the bar is the outcome mix](https://2912658775-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxpbJErq8GWWHPPkzmpv3%2Fuploads%2FgNu3l88XPhnK1exbeO5s%2Fmap-evals.png?alt=media)

### Evaluations & Assessments

24 tables, 180 confirmed fields: Unchanged 26 · Renamed 87 · ID changed 67.

#### forms\_classification

**forms\_classification** → `form_classifications` · *renamed* · 4 confirmed fields (Unchanged 2 · Renamed 1 · ID changed 1)

Classification/category lookup for forms.

> Straight rename with a code column added. Medtrics Classic identified it by slug, Oracle by code.

![Where the 4 confirmed fields of forms\_classification went](https://2912658775-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxpbJErq8GWWHPPkzmpv3%2Fuploads%2FzBNuV61dHDrWQ3MR6gK5%2Fflow-forms-classification.png?alt=media)

| Medtrics Classic field | Oracle             | Outcome    | Note                |
| ---------------------- | ------------------ | ---------- | ------------------- |
| `id` integer           | `id` UUID          | ID changed | Integer link → UUID |
| `slug` text            | `code` TEXT        | Renamed    |                     |
| `name` text            | `name` TEXT        | Unchanged  |                     |
| `description` text     | `description` TEXT | Unchanged  |                     |

* Swap the 1 renamed field and point `FROM` at `form_classifications`.
* Re-key 1 ID field. Join people on `email`, not on old IDs.
* Add `WHERE deleted_at IS NULL`: `form_classifications` keeps deleted rows.

```sql
-- Starter query: confirmed fields only. Was forms_classification.
SELECT
  t.id,          -- was id
  t.name,        -- was name
  t.description, -- was description
  t.code         -- was slug
FROM form_classifications t
WHERE t.deleted_at IS NULL;
```

#### forms\_comment

**forms\_comment** → `form_response_comments` · *split* · 5 confirmed fields (Renamed 2 · ID changed 3)

Threaded comments on form responses.

> Medtrics Classic had one comment table that could attach to a question, a choice, a question response or a form response. Oracle splits it: threaded discussion on the response goes to form\_response\_comments, and a comment about a single answer is now a column on the answer row.

![Where the 5 confirmed fields of forms\_comment went](https://2912658775-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxpbJErq8GWWHPPkzmpv3%2Fuploads%2FxhGO2zAJ7oBgiN5VmLVO%2Fflow-forms-comment.png?alt=media)

| Medtrics Classic field     | Oracle                   | Outcome    | Note                                            |
| -------------------------- | ------------------------ | ---------- | ----------------------------------------------- |
| `id` integer               | `id` UUID                | ID changed | Integer link → UUID                             |
| `commenter_id` integer     | `author_id` UUID         | ID changed | Integer link → UUID pointing to profiles        |
| `form_response_id` integer | `form_response_id` UUID  | ID changed | Integer link → UUID pointing to form\_responses |
| `name` text                | `content` TEXT           | Renamed    |                                                 |
| `created_date` timestamptz | `created_at` TIMESTAMPTZ | Renamed    |                                                 |

* Swap the 2 renamed fields and point `FROM` at `form_response_comments`.
* Re-key 3 ID fields. Join people on `email`, not on old IDs.

```sql
-- Starter query: confirmed fields only. Was forms_comment.
SELECT
  t.id,               -- was id
  t.content,          -- was name
  t.created_at,       -- was created_date
  t.author_id,        -- was commenter_id
  t.form_response_id  -- was form_response_id
FROM form_response_comments t;
```

#### forms\_form

**forms\_form** → `form_sections`, `forms` · *merged* · 20 confirmed fields (Unchanged 8 · Renamed 8 · ID changed 4)

Sections within forms for grouping questions. Split table: each field names its new table.

> The separate FormHeader image table collapsed into forms.header\_image\_url. The programs many-to-many became form\_programs. Anonymity stayed its own table but changed meaning: Medtrics Classic counted submissions before reveal, Oracle counts min\_responses and adds reveal\_reference.

![Where the 20 confirmed fields of forms\_form went](https://2912658775-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxpbJErq8GWWHPPkzmpv3%2Fuploads%2FKcIxtXGxgs2yLH2lVmmW%2Fflow-forms-form.png?alt=media)

| Medtrics Classic field                    | Oracle                                                           | Outcome    | Note                                                             |
| ----------------------------------------- | ---------------------------------------------------------------- | ---------- | ---------------------------------------------------------------- |
| `id` integer                              | form\_sections.`form_id` UUID                                    | ID changed | Integer link → UUID pointing to forms (Split)                    |
| `id` integer                              | form\_sections.`id` UUID                                         | ID changed | Integer link → UUID (Split)                                      |
| `id` integer                              | forms.`id` UUID                                                  | ID changed | Integer link → UUID (Split)                                      |
| `created_by_id` integer                   | forms.`created_by` UUID                                          | ID changed | Integer link → UUID pointing to profiles                         |
| `active` boolean                          | forms.`is_published` BOOLEAN                                     | Renamed    | (Split)                                                          |
| `active` boolean                          | forms.`status` enum:form\_status                                 | Renamed    | Now a fixed value list (form\_status) (Split, Value list)        |
| `activation_date` timestamptz             | forms.`published_at` TIMESTAMPTZ                                 | Renamed    | (Split)                                                          |
| `created_date` timestamptz                | form\_sections.`created_at` TIMESTAMPTZ                          | Renamed    | (Split)                                                          |
| `created_date` timestamptz                | forms.`created_at` TIMESTAMPTZ                                   | Renamed    | (Split)                                                          |
| `updated_date` timestamptz                | form\_sections.`updated_at` TIMESTAMPTZ                          | Renamed    | (Split)                                                          |
| `updated_date` timestamptz                | forms.`updated_at` TIMESTAMPTZ                                   | Renamed    | (Split)                                                          |
| `signature_required` boolean              | forms.`requires_signature` BOOLEAN                               | Renamed    |                                                                  |
| `name` text                               | forms.`name` TEXT                                                | Unchanged  |                                                                  |
| `description` text                        | forms.`description` TEXT                                         | Unchanged  |                                                                  |
| `activation_date` timestamptz             | forms.`activation_date` TIMESTAMPTZ                              | Unchanged  | (Split)                                                          |
| `summative_evaluation` boolean            | forms.`summative_evaluation` BOOLEAN                             | Unchanged  |                                                                  |
| `display_grade_score_information` boolean | forms.`display_grade_score_information` BOOLEAN                  | Unchanged  |                                                                  |
| `display_score_values` boolean            | forms.`display_score_values` BOOLEAN                             | Unchanged  |                                                                  |
| `review_process_initiator` varchar        | forms.`review_process_initiator` enum:review\_process\_initiator | Unchanged  | Now a fixed value list (review\_process\_initiator) (Value list) |
| `disable_unable_to_assess` boolean        | forms.`disable_unable_to_assess` BOOLEAN                         | Unchanged  |                                                                  |

* Swap the 8 renamed fields and point `FROM` at `form_sections` (and the other new tables).
* Re-key 4 ID fields. Join people on `email`, not on old IDs.
* Add `WHERE deleted_at IS NULL`: `form_sections`, `forms` keep deleted rows.

#### forms\_form\_programs

**forms\_form\_programs** → `form_programs`, `forms` · 1 confirmed field (ID changed 1)

Form-program associations. Split table: each field names its new table.

| Medtrics Classic field | Oracle                        | Outcome    | Note                                  |
| ---------------------- | ----------------------------- | ---------- | ------------------------------------- |
| `form_id` integer      | form\_programs.`form_id` UUID | ID changed | Integer link → UUID pointing to forms |

* Re-key 1 ID field. Join people on `email`, not on old IDs.
* Add `WHERE deleted_at IS NULL`: `form_programs`, `forms` keep deleted rows.

#### forms\_formanonymousrule

**forms\_formanonymousrule** → `forms` · *merged* · 2 confirmed fields (Renamed 1 · ID changed 1)

Core form definitions.

> The separate FormHeader image table collapsed into forms.header\_image\_url. The programs many-to-many became form\_programs. Anonymity stayed its own table but changed meaning: Medtrics Classic counted submissions before reveal, Oracle counts min\_responses and adds reveal\_reference.

![Where the 2 confirmed fields of forms\_formanonymousrule went](https://2912658775-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxpbJErq8GWWHPPkzmpv3%2Fuploads%2FTDGSJz1vbaSXT1OQoUbw%2Fflow-forms-formanonymousrule.png?alt=media)

| Medtrics Classic field | Oracle                 | Outcome    | Note                                                                                                                |
| ---------------------- | ---------------------- | ---------- | ------------------------------------------------------------------------------------------------------------------- |
| `id` integer           | `id` UUID              | ID changed | Integer ID replaced by a new UUID. Medtrics Classic → new ID crosswalk is kept by the migration (see Keys & joins). |
| `anonymous` boolean    | `is_anonymous` BOOLEAN | Renamed    |                                                                                                                     |

* Swap the 1 renamed field and point `FROM` at `forms`.
* Re-key 1 ID field. Join people on `email`, not on old IDs.
* Add `WHERE deleted_at IS NULL`: `forms` keeps deleted rows.

```sql
-- Starter query: confirmed fields only. Was forms_formanonymousrule.
SELECT
  t.id,           -- was id
  t.is_anonymous  -- was anonymous
FROM forms t
WHERE t.deleted_at IS NULL;
```

#### forms\_formassignment

**forms\_formassignment** → `form_assignments` · *same* · 22 confirmed fields (Renamed 13 · ID changed 9)

Individual form assignments to users.

> Same concept - the evaluation task on someone's list. Oracle renames evaluator to responder and evaluatee to recipient, replaces the rotation and user\_schedule anchors with clinical\_rotation\_instance\_id and block\_schedule\_id, and adds automation provenance columns.

![Where the 22 confirmed fields of forms\_formassignment went](https://2912658775-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxpbJErq8GWWHPPkzmpv3%2Fuploads%2FuB4UZ09QXN4i9cEweE7D%2Fflow-forms-formassignment.png?alt=media)

| Medtrics Classic field            | Oracle                                 | Outcome    | Note                                                                          |
| --------------------------------- | -------------------------------------- | ---------- | ----------------------------------------------------------------------------- |
| `id` integer                      | `id` UUID                              | ID changed | Integer link → UUID                                                           |
| `assigned_by_id` integer          | `assigned_by` UUID                     | ID changed | Integer link → UUID pointing to profiles                                      |
| `course_id` integer               | `course_id` UUID                       | ID changed | Integer link → UUID pointing to curriculum\_courses                           |
| `evaluatee_id` integer            | `recipient_id` UUID                    | ID changed | Integer link → UUID pointing to profiles                                      |
| `evaluator_id` integer            | `responder_id` UUID                    | ID changed | Integer link → UUID pointing to profiles                                      |
| `event_id` integer                | `event_id` UUID                        | ID changed | Integer link → UUID pointing to events                                        |
| `form_id` integer                 | `form_id` UUID                         | ID changed | Integer link → UUID pointing to forms                                         |
| `program_id` integer              | `program_id` UUID                      | ID changed | Integer link → UUID pointing to programs                                      |
| `user_schedule_id` integer        | `block_schedule_id` UUID               | ID changed | Integer link → UUID pointing to block\_schedules                              |
| `deadline` timestamptz            | `due_date` DATE                        | Renamed    | timestamp → date (Type changed)                                               |
| `system_created_date` timestamptz | `created_at` TIMESTAMPTZ               | Renamed    |                                                                               |
| `created_date` timestamptz        | `assigned_at` TIMESTAMPTZ              | Renamed    |                                                                               |
| `updated_date` timestamptz        | `updated_at` TIMESTAMPTZ               | Renamed    |                                                                               |
| `automatically_assigned` boolean  | `metadata` JSONB                       | Renamed    | bool → json (Merged, Type changed)                                            |
| `completed` boolean               | `is_locked` BOOLEAN                    | Renamed    | (Split)                                                                       |
| `completed` boolean               | `status` enum:form\_assignment\_status | Renamed    | Now a fixed value list (form\_assignment\_status) (Split, Merged, Value list) |
| `done_date` timestamptz           | `completed_at` TIMESTAMPTZ             | Renamed    |                                                                               |
| `canceled` boolean                | `status` enum:form\_assignment\_status | Renamed    | Now a fixed value list (form\_assignment\_status) (Merged, Value list)        |
| `unable_to_assess` boolean        | `is_unable_to_assess` BOOLEAN          | Renamed    | (Split)                                                                       |
| `unable_to_assess` boolean        | `status` enum:form\_assignment\_status | Renamed    | Now a fixed value list (form\_assignment\_status) (Split, Merged, Value list) |
| `comment` text                    | `notes` TEXT                           | Renamed    |                                                                               |
| `evaluation_subject` varchar      | `metadata` JSONB                       | Renamed    | text → json (Merged, Type changed)                                            |

* Swap the 13 renamed fields and point `FROM` at `form_assignments`.
* Re-key 9 ID fields. Join people on `email`, not on old IDs.
* Add `WHERE deleted_at IS NULL`: `form_assignments` keeps deleted rows.

```sql
-- Starter query: confirmed fields only. Was forms_formassignment.
SELECT
  t.id,                  -- was id
  t.due_date,            -- was deadline
  t.created_at,          -- was system_created_date
  t.assigned_at,         -- was created_date
  t.updated_at,          -- was updated_date
  t.metadata,            -- was automatically_assigned
  t.is_locked,           -- was completed
  t.status,              -- was completed
  t.completed_at,        -- was done_date
  t.is_unable_to_assess, -- was unable_to_assess
  t.notes,               -- was comment
  t.assigned_by,         -- was assigned_by_id
  t.course_id,           -- was course_id
  t.recipient_id         -- was evaluatee_id
FROM form_assignments t
WHERE t.deleted_at IS NULL;
```

#### forms\_formassignmentdate

**forms\_formassignmentdate** → `form_assignment_triggers` · *replaced* · 7 confirmed fields (Unchanged 2 · Renamed 3 · ID changed 2)

Multiple trigger timings per assignment rule, replacing single trigger\_timing column.

> Medtrics Classic stored one timing row per rule with the lists of objects it had already used. Oracle stores timings as triggers with recurrence, and keeps the 'already done' record separately in rule\_processed\_objects.

![Where the 7 confirmed fields of forms\_formassignmentdate went](https://2912658775-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxpbJErq8GWWHPPkzmpv3%2Fuploads%2FITbQVnECGypZtvAUBwby%2Fflow-forms-formassignmentdate.png?alt=media)

| Medtrics Classic field      | Oracle                   | Outcome    | Note                                                    |
| --------------------------- | ------------------------ | ---------- | ------------------------------------------------------- |
| `id` integer                | `id` UUID                | ID changed | Integer link → UUID                                     |
| `rule_id` integer           | `rule_id` UUID           | ID changed | Integer link → UUID pointing to form\_assignment\_rules |
| `type` varchar              | `trigger_type` TEXT      | Renamed    |                                                         |
| `created_date` timestamptz  | `created_at` TIMESTAMPTZ | Renamed    |                                                         |
| `updated_date` timestamptz  | `updated_at` TIMESTAMPTZ | Renamed    |                                                         |
| `adjusted_days` integer     | `adjusted_days` INTEGER  | Unchanged  |                                                         |
| `specific_date` timestamptz | `specific_date` DATE     | Unchanged  | timestamp → date (Type changed)                         |

* Swap the 3 renamed fields and point `FROM` at `form_assignment_triggers`.
* Re-key 2 ID fields. Join people on `email`, not on old IDs.

```sql
-- Starter query: confirmed fields only. Was forms_formassignmentdate.
SELECT
  t.id,            -- was id
  t.trigger_type,  -- was type
  t.adjusted_days, -- was adjusted_days
  t.specific_date, -- was specific_date
  t.created_at,    -- was created_date
  t.updated_at,    -- was updated_date
  t.rule_id        -- was rule_id
FROM form_assignment_triggers t;
```

#### forms\_formassignmentnotloggeddownload

**forms\_formassignmentnotloggeddownload** → `form_download_history` · *replaced* · 4 confirmed fields (Renamed 1 · ID changed 3)

Audit trail for form response downloads and prints.

> Medtrics Classic's two 'do this without logging in' token tables became a whole no-login capability: single-use completion tokens, reusable public links, person QR badges, and a separate external submission record with its own audit trail.

![Where the 4 confirmed fields of forms\_formassignmentnotloggeddownload went](https://2912658775-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxpbJErq8GWWHPPkzmpv3%2Fuploads%2FDLOgap2YhG8GiTyyqO58%2Fflow-forms-formassignmentnotloggeddownload.png?alt=media)

| Medtrics Classic field     | Oracle                   | Outcome    | Note                                            |
| -------------------------- | ------------------------ | ---------- | ----------------------------------------------- |
| `id` integer               | `id` UUID                | ID changed | Integer link → UUID                             |
| `form_response_id` integer | `form_response_id` UUID  | ID changed | Integer link → UUID pointing to form\_responses |
| `user_id` integer          | `downloaded_by` UUID     | ID changed | Integer link → UUID pointing to profiles        |
| `download_at` timestamptz  | `created_at` TIMESTAMPTZ | Renamed    |                                                 |

* Swap the 1 renamed field and point `FROM` at `form_download_history`.
* Re-key 3 ID fields. Join people on `email`, not on old IDs.

```sql
-- Starter query: confirmed fields only. Was forms_formassignmentnotloggeddownload.
SELECT
  t.id,               -- was id
  t.created_at,       -- was download_at
  t.form_response_id, -- was form_response_id
  t.downloaded_by     -- was user_id
FROM form_download_history t;
```

#### forms\_formassignmentnotloggingtoanswer

**forms\_formassignmentnotloggingtoanswer** → `form_completion_tokens` · *replaced* · 6 confirmed fields (Unchanged 1 · Renamed 3 · ID changed 2)

Tokens granting time-limited, unauthenticated access to complete a form assignment.

> Medtrics Classic's two 'do this without logging in' token tables became a whole no-login capability: single-use completion tokens, reusable public links, person QR badges, and a separate external submission record with its own audit trail.

![Where the 6 confirmed fields of forms\_formassignmentnotloggingtoanswer went](https://2912658775-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxpbJErq8GWWHPPkzmpv3%2Fuploads%2F5lX1TFyo4PoojaxFhAx0%2Fflow-forms-formassignmentnotloggingtoanswer.png?alt=media)

| Medtrics Classic field     | Oracle                   | Outcome    | Note                                              |
| -------------------------- | ------------------------ | ---------- | ------------------------------------------------- |
| `id` integer               | `id` UUID                | ID changed | Integer link → UUID (Split)                       |
| `assignment_id` integer    | `assignment_id` UUID     | ID changed | Integer link → UUID pointing to form\_assignments |
| `id` integer               | `token` TEXT             | Renamed    | int → text (Split, Type changed)                  |
| `created_date` timestamptz | `created_at` TIMESTAMPTZ | Renamed    |                                                   |
| `submited_at` timestamptz  | `used_at` TIMESTAMPTZ    | Renamed    |                                                   |
| `expires_at` timestamptz   | `expires_at` TIMESTAMPTZ | Unchanged  |                                                   |

* Swap the 3 renamed fields and point `FROM` at `form_completion_tokens`.
* Re-key 2 ID fields. Join people on `email`, not on old IDs.

```sql
-- Starter query: confirmed fields only. Was forms_formassignmentnotloggingtoanswer.
SELECT
  t.id,            -- was id
  t.token,         -- was id
  t.created_at,    -- was created_date
  t.used_at,       -- was submited_at
  t.assignment_id, -- was assignment_id
  t.expires_at     -- was expires_at
FROM form_completion_tokens t;
```

#### forms\_formassignmentrule

**forms\_formassignmentrule** → `form_assignment_rule_recipient_roles`, `form_assignment_rule_responder_roles`, `form_assignment_rules` · *split* · 22 confirmed fields (Unchanged 5 · Renamed 13 · ID changed 4)

Roles that receive forms under a rule. Split table: each field names its new table.

> The single wide rule row exploded into a rule plus about twenty junction tables. Targeting is now readable, and shifts and graded courses are new target types. Medtrics Classic's user\_schedules target is gone, replaced by rotation-template targeting.

![Where the 22 confirmed fields of forms\_formassignmentrule went](https://2912658775-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxpbJErq8GWWHPPkzmpv3%2Fuploads%2FxGO1XwBWiP4AbnsQPEC4%2Fflow-forms-formassignmentrule.png?alt=media)

| Medtrics Classic field                          | Oracle                                                                  | Outcome    | Note                                                            |
| ----------------------------------------------- | ----------------------------------------------------------------------- | ---------- | --------------------------------------------------------------- |
| `id` integer                                    | form\_assignment\_rule\_recipient\_roles.`rule_id` UUID                 | ID changed | Integer link → UUID pointing to form\_assignment\_rules (Split) |
| `id` integer                                    | form\_assignment\_rule\_responder\_roles.`rule_id` UUID                 | ID changed | Integer link → UUID pointing to form\_assignment\_rules (Split) |
| `id` integer                                    | form\_assignment\_rules.`id` UUID                                       | ID changed | Integer link → UUID (Split)                                     |
| `form_id` integer                               | form\_assignment\_rules.`form_id` UUID                                  | ID changed | Integer link → UUID pointing to forms                           |
| `evaluate_self` boolean                         | form\_assignment\_rules.`allow_self_evaluation` BOOLEAN                 | Renamed    |                                                                 |
| `evaluation_subject` varchar                    | form\_assignment\_rules.`form_target` enum:form\_target\_type           | Renamed    | Now a fixed value list (form\_target\_type) (Value list)        |
| `include_supervisors_in_evaluators` boolean     | form\_assignment\_rules.`include_supervisors_in_responders` BOOLEAN     | Renamed    |                                                                 |
| `include_supervisors_in_evaluatees` boolean     | form\_assignment\_rules.`include_supervisors_in_recipients` BOOLEAN     | Renamed    |                                                                 |
| `include_speakers_in_evaluators` boolean        | form\_assignment\_rules.`include_speakers_in_responders` BOOLEAN        | Renamed    |                                                                 |
| `include_speakers_in_evaluatees` boolean        | form\_assignment\_rules.`include_speakers_in_recipients` BOOLEAN        | Renamed    |                                                                 |
| `overdue_after_days` integer                    | form\_assignment\_rules.`deadline_days` INTEGER                         | Renamed    | (Split)                                                         |
| `auto_cancel_specific_date` timestamptz         | form\_assignment\_rules.`auto_cancel_type` TEXT                         | Renamed    | timestamp → text (Split, Merged, Type changed)                  |
| `auto_cancel_after_days` integer                | form\_assignment\_rules.`auto_cancel_type` TEXT                         | Renamed    | int → text (Split, Merged, Type changed)                        |
| `created_date` timestamptz                      | form\_assignment\_rules.`created_at` TIMESTAMPTZ                        | Renamed    |                                                                 |
| `updated_date` timestamptz                      | form\_assignment\_rules.`updated_at` TIMESTAMPTZ                        | Renamed    |                                                                 |
| `include_block_directors_in_evaluatees` boolean | form\_assignment\_rules.`include_block_directors_in_recipients` BOOLEAN | Renamed    |                                                                 |
| `include_block_directors_in_evaluators` boolean | form\_assignment\_rules.`include_block_directors_in_responders` BOOLEAN | Renamed    |                                                                 |
| `open_form` boolean                             | form\_assignment\_rules.`open_form` BOOLEAN                             | Unchanged  |                                                                 |
| `respect_groups` boolean                        | form\_assignment\_rules.`respect_groups` BOOLEAN                        | Unchanged  |                                                                 |
| `overdue_after_days` integer                    | form\_assignment\_rules.`overdue_after_days` INTEGER                    | Unchanged  | (Split)                                                         |
| `auto_cancel_specific_date` timestamptz         | form\_assignment\_rules.`auto_cancel_specific_date` DATE                | Unchanged  | timestamp → date (Split, Type changed)                          |
| `auto_cancel_after_days` integer                | form\_assignment\_rules.`auto_cancel_after_days` INTEGER                | Unchanged  | (Split)                                                         |

* Swap the 13 renamed fields and point `FROM` at `form_assignment_rule_recipient_roles` (and the other new tables).
* Re-key 4 ID fields. Join people on `email`, not on old IDs.
* Add `WHERE deleted_at IS NULL`: `form_assignment_rules` keeps deleted rows.

#### forms\_formassignmentrule\_evaluatee\_groups

**forms\_formassignmentrule\_evaluatee\_groups** → `form_assignment_rule_recipient_groups` · 2 confirmed fields (ID changed 2)

Static recipient/evaluatee group allowlists for form assignment rules.

![Where the 2 confirmed fields of forms\_formassignmentrule\_evaluatee\_groups went](https://2912658775-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxpbJErq8GWWHPPkzmpv3%2Fuploads%2FWhWw5cw80bEXBIjms8j3%2Fflow-forms-formassignmentrule-evaluatee-groups.png?alt=media)

| Medtrics Classic field          | Oracle         | Outcome    | Note                                                                                                                |
| ------------------------------- | -------------- | ---------- | ------------------------------------------------------------------------------------------------------------------- |
| `id` integer                    | `id` UUID      | ID changed | Integer ID replaced by a new UUID. Medtrics Classic → new ID crosswalk is kept by the migration (see Keys & joins). |
| `formassignmentrule_id` integer | `rule_id` UUID | ID changed | Integer link → UUID pointing to form\_assignment\_rules                                                             |

* Re-key 2 ID fields. Join people on `email`, not on old IDs.

```sql
-- Starter query: confirmed fields only. Was forms_formassignmentrule_evaluatee_groups.
SELECT
  t.id,      -- was id
  t.rule_id  -- was formassignmentrule_id
FROM form_assignment_rule_recipient_groups t;
```

#### forms\_formassignmentrule\_evaluator\_groups

**forms\_formassignmentrule\_evaluator\_groups** → `form_assignment_rule_responder_groups` · 2 confirmed fields (ID changed 2)

Static responder/evaluator group allowlists for form assignment rules.

![Where the 2 confirmed fields of forms\_formassignmentrule\_evaluator\_groups went](https://2912658775-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxpbJErq8GWWHPPkzmpv3%2Fuploads%2FbRUFKNCAhiVOj1O6Ovmi%2Fflow-forms-formassignmentrule-evaluator-groups.png?alt=media)

| Medtrics Classic field          | Oracle         | Outcome    | Note                                                                                                                |
| ------------------------------- | -------------- | ---------- | ------------------------------------------------------------------------------------------------------------------- |
| `id` integer                    | `id` UUID      | ID changed | Integer ID replaced by a new UUID. Medtrics Classic → new ID crosswalk is kept by the migration (see Keys & joins). |
| `formassignmentrule_id` integer | `rule_id` UUID | ID changed | Integer link → UUID pointing to form\_assignment\_rules                                                             |

* Re-key 2 ID fields. Join people on `email`, not on old IDs.

```sql
-- Starter query: confirmed fields only. Was forms_formassignmentrule_evaluator_groups.
SELECT
  t.id,      -- was id
  t.rule_id  -- was formassignmentrule_id
FROM form_assignment_rule_responder_groups t;
```

#### forms\_formassignmentrule\_event\_types

**forms\_formassignmentrule\_event\_types** → `form_assignment_rule_event_types` · *split* · 3 confirmed fields (ID changed 3)

Through model for FormAssignmentRule <-> CustomEventType relationship.

> The single wide rule row exploded into a rule plus about twenty junction tables. Targeting is now readable, and shifts and graded courses are new target types. Medtrics Classic's user\_schedules target is gone, replaced by rotation-template targeting.

![Where the 3 confirmed fields of forms\_formassignmentrule\_event\_types went](https://2912658775-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxpbJErq8GWWHPPkzmpv3%2Fuploads%2FGwi776NBd8gWLSabdz9o%2Fflow-forms-formassignmentrule-event-types.png?alt=media)

| Medtrics Classic field          | Oracle               | Outcome    | Note                                                                                                                |
| ------------------------------- | -------------------- | ---------- | ------------------------------------------------------------------------------------------------------------------- |
| `id` integer                    | `id` UUID            | ID changed | Integer ID replaced by a new UUID. Medtrics Classic → new ID crosswalk is kept by the migration (see Keys & joins). |
| `formassignmentrule_id` integer | `rule_id` UUID       | ID changed | Integer link → UUID pointing to form\_assignment\_rules                                                             |
| `customeventtype_id` integer    | `event_type_id` UUID | ID changed | Integer link → UUID pointing to event\_types                                                                        |

* Re-key 3 ID fields. Join people on `email`, not on old IDs.

```sql
-- Starter query: confirmed fields only. Was forms_formassignmentrule_event_types.
SELECT
  t.id,            -- was id
  t.rule_id,       -- was formassignmentrule_id
  t.event_type_id  -- was customeventtype_id
FROM form_assignment_rule_event_types t;
```

#### forms\_formassignmentrule\_programs

**forms\_formassignmentrule\_programs** → `form_assignment_rule_programs` · *split* · 2 confirmed fields (ID changed 2)

Rule-program associations.

> The single wide rule row exploded into a rule plus about twenty junction tables. Targeting is now readable, and shifts and graded courses are new target types. Medtrics Classic's user\_schedules target is gone, replaced by rotation-template targeting.

![Where the 2 confirmed fields of forms\_formassignmentrule\_programs went](https://2912658775-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxpbJErq8GWWHPPkzmpv3%2Fuploads%2FwsBhh9cYEymI2n3dh9Ld%2Fflow-forms-formassignmentrule-programs.png?alt=media)

| Medtrics Classic field          | Oracle         | Outcome    | Note                                                                                                                |
| ------------------------------- | -------------- | ---------- | ------------------------------------------------------------------------------------------------------------------- |
| `id` integer                    | `id` UUID      | ID changed | Integer ID replaced by a new UUID. Medtrics Classic → new ID crosswalk is kept by the migration (see Keys & joins). |
| `formassignmentrule_id` integer | `rule_id` UUID | ID changed | Integer link → UUID pointing to form\_assignment\_rules                                                             |

* Re-key 2 ID fields. Join people on `email`, not on old IDs.

```sql
-- Starter query: confirmed fields only. Was forms_formassignmentrule_programs.
SELECT
  t.id,      -- was id
  t.rule_id  -- was formassignmentrule_id
FROM form_assignment_rule_programs t;
```

#### forms\_formassignmentrule\_rotations

**forms\_formassignmentrule\_rotations** → `form_assignment_rule_rotations` · *split* · 3 confirmed fields (ID changed 3)

Through model for FormAssignmentRule <-> Rotation relationship.

> The single wide rule row exploded into a rule plus about twenty junction tables. Targeting is now readable, and shifts and graded courses are new target types. Medtrics Classic's user\_schedules target is gone, replaced by rotation-template targeting.

![Where the 3 confirmed fields of forms\_formassignmentrule\_rotations went](https://2912658775-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxpbJErq8GWWHPPkzmpv3%2Fuploads%2FBsM3XU5NH6UDmsadvUir%2Fflow-forms-formassignmentrule-rotations.png?alt=media)

| Medtrics Classic field          | Oracle                      | Outcome    | Note                                                                                                                |
| ------------------------------- | --------------------------- | ---------- | ------------------------------------------------------------------------------------------------------------------- |
| `id` integer                    | `id` UUID                   | ID changed | Integer ID replaced by a new UUID. Medtrics Classic → new ID crosswalk is kept by the migration (see Keys & joins). |
| `formassignmentrule_id` integer | `rule_id` UUID              | ID changed | Integer link → UUID pointing to form\_assignment\_rules                                                             |
| `rotation_id` integer           | `rotation_template_id` UUID | ID changed | Integer link → UUID pointing to rotations                                                                           |

* Re-key 3 ID fields. Join people on `email`, not on old IDs.

```sql
-- Starter query: confirmed fields only. Was forms_formassignmentrule_rotations.
SELECT
  t.id,                   -- was id
  t.rule_id,              -- was formassignmentrule_id
  t.rotation_template_id  -- was rotation_id
FROM form_assignment_rule_rotations t;
```

#### forms\_formassignmentrule\_session\_event\_types

**forms\_formassignmentrule\_session\_event\_types** → `form_assignment_rule_session_event_types` · *split* · 3 confirmed fields (ID changed 3)

Through model for FormAssignmentRule <-> SessionEventType relationship.

> The single wide rule row exploded into a rule plus about twenty junction tables. Targeting is now readable, and shifts and graded courses are new target types. Medtrics Classic's user\_schedules target is gone, replaced by rotation-template targeting.

![Where the 3 confirmed fields of forms\_formassignmentrule\_session\_event\_types went](https://2912658775-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxpbJErq8GWWHPPkzmpv3%2Fuploads%2FZPVjE8gp1Fc4ZHkhibOM%2Fflow-forms-formassignmentrule-session-event-types.png?alt=media)

| Medtrics Classic field          | Oracle                       | Outcome    | Note                                                                                                                |
| ------------------------------- | ---------------------------- | ---------- | ------------------------------------------------------------------------------------------------------------------- |
| `id` integer                    | `id` UUID                    | ID changed | Integer ID replaced by a new UUID. Medtrics Classic → new ID crosswalk is kept by the migration (see Keys & joins). |
| `formassignmentrule_id` integer | `rule_id` UUID               | ID changed | Integer link → UUID pointing to form\_assignment\_rules                                                             |
| `sessioneventtype_id` integer   | `session_event_type_id` UUID | ID changed | Integer link → UUID                                                                                                 |

* Re-key 3 ID fields. Join people on `email`, not on old IDs.

```sql
-- Starter query: confirmed fields only. Was forms_formassignmentrule_session_event_types.
SELECT
  t.id,                    -- was id
  t.rule_id,               -- was formassignmentrule_id
  t.session_event_type_id  -- was sessioneventtype_id
FROM form_assignment_rule_session_event_types t;
```

#### forms\_formorderedquestion

**forms\_formorderedquestion** → `form_section_questions` · *replaced* · 4 confirmed fields (Unchanged 1 · Renamed 2 · ID changed 1)

Assignment of questions to form sections.

> Medtrics Classic's group-of-questions hop pair became a proper section plus a section-question link. This is a clear improvement, but the new link table is also the table that delete-cascades into stored answers.

![Where the 4 confirmed fields of forms\_formorderedquestion went](https://2912658775-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxpbJErq8GWWHPPkzmpv3%2Fuploads%2F5Zc5PHHR5cRVbYfH8adf%2Fflow-forms-formorderedquestion.png?alt=media)

| Medtrics Classic field   | Oracle                         | Outcome    | Note                                                                                                                |
| ------------------------ | ------------------------------ | ---------- | ------------------------------------------------------------------------------------------------------------------- |
| `id` integer             | `id` UUID                      | ID changed | Integer ID replaced by a new UUID. Medtrics Classic → new ID crosswalk is kept by the migration (see Keys & joins). |
| `not_applicable` boolean | `allow_not_applicable` BOOLEAN | Renamed    |                                                                                                                     |
| `required` boolean       | `is_required` BOOLEAN          | Renamed    |                                                                                                                     |
| `confidential` boolean   | `confidential` BOOLEAN         | Unchanged  |                                                                                                                     |

* Swap the 2 renamed fields and point `FROM` at `form_section_questions`.
* Re-key 1 ID field. Join people on `email`, not on old IDs.
* Add `WHERE deleted_at IS NULL`: `form_section_questions` keeps deleted rows.

```sql
-- Starter query: confirmed fields only. Was forms_formorderedquestion.
SELECT
  t.id,                   -- was id
  t.allow_not_applicable, -- was not_applicable
  t.is_required,          -- was required
  t.confidential          -- was confidential
FROM form_section_questions t
WHERE t.deleted_at IS NULL;
```

#### forms\_formresponse

**forms\_formresponse** → `form_responses` · *split* · 11 confirmed fields (Renamed 8 · ID changed 3)

Submitted form responses.

> Medtrics Classic kept about a dozen opened\_by / draft\_by / accepted\_by / rejected\_by who-and-when columns on the response. Oracle keeps only submitted\_by and moves the rest into an event log, which is cleaner but changes how 'who opened this' is queried.

![Where the 11 confirmed fields of forms\_formresponse went](https://2912658775-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxpbJErq8GWWHPPkzmpv3%2Fuploads%2FEb5rmoAS3t2NqbJ8TFUv%2Fflow-forms-formresponse.png?alt=media)

| Medtrics Classic field       | Oracle                       | Outcome    | Note                                              |
| ---------------------------- | ---------------------------- | ---------- | ------------------------------------------------- |
| `id` integer                 | `id` UUID                    | ID changed | Integer link → UUID                               |
| `assignment_id` integer      | `assignment_id` UUID         | ID changed | Integer link → UUID pointing to form\_assignments |
| `created_by_id` integer      | `created_by` UUID            | ID changed | Integer link → UUID pointing to profiles          |
| `score_received` double      | `overall_score` NUMERIC(5,2) | Renamed    |                                                   |
| `score_possible` double      | `metadata` JSONB             | Renamed    | number → json (Merged, Type changed)              |
| `status` varchar             | `is_published` BOOLEAN       | Renamed    | text → bool (Split, Type changed)                 |
| `status` varchar             | `metadata` JSONB             | Renamed    | text → json (Split, Merged, Type changed)         |
| `created_date` timestamptz   | `created_at` TIMESTAMPTZ     | Renamed    |                                                   |
| `updated_date` timestamptz   | `updated_at` TIMESTAMPTZ     | Renamed    |                                                   |
| `submitted_date` timestamptz | `published_at` TIMESTAMPTZ   | Renamed    | (Split)                                           |
| `submitted_date` timestamptz | `signed_at` TIMESTAMPTZ      | Renamed    | (Split)                                           |

* Swap the 8 renamed fields and point `FROM` at `form_responses`.
* Re-key 3 ID fields. Join people on `email`, not on old IDs.
* Add `WHERE deleted_at IS NULL`: `form_responses` keeps deleted rows.

```sql
-- Starter query: confirmed fields only. Was forms_formresponse.
SELECT
  t.id,            -- was id
  t.overall_score, -- was score_received
  t.metadata,      -- was score_possible
  t.is_published,  -- was status
  t.created_at,    -- was created_date
  t.updated_at,    -- was updated_date
  t.published_at,  -- was submitted_date
  t.signed_at,     -- was submitted_date
  t.assignment_id, -- was assignment_id
  t.created_by     -- was created_by_id
FROM form_responses t
WHERE t.deleted_at IS NULL;
```

#### forms\_formreveallog

**forms\_formreveallog** → `form_reveal_logs` · *same* · 5 confirmed fields (Renamed 2 · ID changed 3)

Audit trail for revealing anonymous/confidential form responders.

> Both audit tables survive, and Oracle adds detail: what was included in the download, the reveal reason, and IP/user-agent on both.

![Where the 5 confirmed fields of forms\_formreveallog went](https://2912658775-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxpbJErq8GWWHPPkzmpv3%2Fuploads%2FHyCS8zRpw0gcpvwyXkPi%2Fflow-forms-formreveallog.png?alt=media)

| Medtrics Classic field       | Oracle                       | Outcome    | Note                                            |
| ---------------------------- | ---------------------------- | ---------- | ----------------------------------------------- |
| `id` integer                 | `id` UUID                    | ID changed | Integer link → UUID                             |
| `form_response_id` integer   | `form_response_id` UUID      | ID changed | Integer link → UUID pointing to form\_responses |
| `viewed_by_id` integer       | `revealed_by` UUID           | ID changed | Integer link → UUID pointing to profiles        |
| `revealed_evaluator` boolean | `revealed_responder` BOOLEAN | Renamed    |                                                 |
| `created_date` timestamptz   | `created_at` TIMESTAMPTZ     | Renamed    |                                                 |

* Swap the 2 renamed fields and point `FROM` at `form_reveal_logs`.
* Re-key 3 ID fields. Join people on `email`, not on old IDs.

```sql
-- Starter query: confirmed fields only. Was forms_formreveallog.
SELECT
  t.id,                 -- was id
  t.revealed_responder, -- was revealed_evaluator
  t.created_at,         -- was created_date
  t.form_response_id,   -- was form_response_id
  t.revealed_by         -- was viewed_by_id
FROM form_reveal_logs t;
```

#### forms\_formreview

**forms\_formreview** → `form_reviews` · *split* · 8 confirmed fields (Unchanged 2 · Renamed 3 · ID changed 3)

Individual review records for completed form responses.

> Review rules gained proper reviewer junction tables and per-tier ownership. The evaluatee's agree/disagree attestation split out of FormReview\.acknowledgement into its own table.

![Where the 8 confirmed fields of forms\_formreview went](https://2912658775-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxpbJErq8GWWHPPkzmpv3%2Fuploads%2FZYxgsLakzJIDAKavDGe4%2Fflow-forms-formreview.png?alt=media)

| Medtrics Classic field     | Oracle                    | Outcome    | Note                                            |
| -------------------------- | ------------------------- | ---------- | ----------------------------------------------- |
| `id` integer               | `id` UUID                 | ID changed | Integer link → UUID                             |
| `form_response_id` integer | `form_response_id` UUID   | ID changed | Integer link → UUID pointing to form\_responses |
| `reviewed_by_id` integer   | `reviewed_by` UUID        | ID changed | Integer link → UUID pointing to profiles        |
| `reviewed_at` timestamptz  | `created_at` TIMESTAMPTZ  | Renamed    | (Split)                                         |
| `reviewed_at` timestamptz  | `updated_at` TIMESTAMPTZ  | Renamed    | (Split)                                         |
| `review_complete` boolean  | `is_complete` BOOLEAN     | Renamed    |                                                 |
| `reviewed_at` timestamptz  | `reviewed_at` TIMESTAMPTZ | Unchanged  | (Split)                                         |
| `comment` text             | `comment` TEXT            | Unchanged  |                                                 |

* Swap the 3 renamed fields and point `FROM` at `form_reviews`.
* Re-key 3 ID fields. Join people on `email`, not on old IDs.
* Add `WHERE deleted_at IS NULL`: `form_reviews` keeps deleted rows.

```sql
-- Starter query: confirmed fields only. Was forms_formreview.
SELECT
  t.id,               -- was id
  t.created_at,       -- was reviewed_at
  t.reviewed_at,      -- was reviewed_at
  t.updated_at,       -- was reviewed_at
  t.comment,          -- was comment
  t.form_response_id, -- was form_response_id
  t.reviewed_by,      -- was reviewed_by_id
  t.is_complete       -- was review_complete
FROM form_reviews t
WHERE t.deleted_at IS NULL;
```

#### forms\_orderedquestionbankobject

**forms\_orderedquestionbankobject** → `form_section_questions` · *replaced* · 6 confirmed fields (Renamed 3 · ID changed 3)

Assignment of questions to form sections.

> Medtrics Classic's group-of-questions hop pair became a proper section plus a section-question link. This is a clear improvement, but the new link table is also the table that delete-cascades into stored answers.

![Where the 6 confirmed fields of forms\_orderedquestionbankobject went](https://2912658775-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxpbJErq8GWWHPPkzmpv3%2Fuploads%2FJh170K1s1YhdEk8Jtjoz%2Fflow-forms-orderedquestionbankobject.png?alt=media)

| Medtrics Classic field     | Oracle                   | Outcome    | Note                                           |
| -------------------------- | ------------------------ | ---------- | ---------------------------------------------- |
| `id` integer               | `id` UUID                | ID changed | Integer link → UUID                            |
| `form_id` integer          | `section_id` UUID        | ID changed | Integer link → UUID pointing to form\_sections |
| `question_id` integer      | `question_id` UUID       | ID changed | Integer link → UUID pointing to questions      |
| `order` integer            | `display_order` INTEGER  | Renamed    |                                                |
| `created_date` timestamptz | `created_at` TIMESTAMPTZ | Renamed    |                                                |
| `updated_date` timestamptz | `updated_at` TIMESTAMPTZ | Renamed    |                                                |

* Swap the 3 renamed fields and point `FROM` at `form_section_questions`.
* Re-key 3 ID fields. Join people on `email`, not on old IDs.
* Add `WHERE deleted_at IS NULL`: `form_section_questions` keeps deleted rows.

```sql
-- Starter query: confirmed fields only. Was forms_orderedquestionbankobject.
SELECT
  t.id,            -- was id
  t.display_order, -- was order
  t.created_at,    -- was created_date
  t.updated_at,    -- was updated_date
  t.section_id,    -- was form_id
  t.question_id    -- was question_id
FROM form_section_questions t
WHERE t.deleted_at IS NULL;
```

#### question\_bank\_question

**question\_bank\_question** → `questions` · *same* · 15 confirmed fields (Unchanged 3 · Renamed 10 · ID changed 2)

Abstract base question class.

> Same question bank. Oracle adds versioning (version, parent\_version\_id), publishing, quiz fields and a contexts array. Medtrics Classic's expiration\_date has no Oracle equivalent.

![Where the 15 confirmed fields of question\_bank\_question went](https://2912658775-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxpbJErq8GWWHPPkzmpv3%2Fuploads%2FLutsikTWiJLtVRZ0rmGv%2Fflow-question-bank-question.png?alt=media)

| Medtrics Classic field     | Oracle                              | Outcome    | Note                                                        |
| -------------------------- | ----------------------------------- | ---------- | ----------------------------------------------------------- |
| `id` integer               | `id` UUID                           | ID changed | Integer link → UUID                                         |
| `category_id` integer      | `category_id` UUID                  | ID changed | Integer link → UUID pointing to question\_categories        |
| `name` text                | `title` TEXT                        | Renamed    |                                                             |
| `type` integer             | `has_correct_answer` BOOLEAN        | Renamed    | int → bool (Split, Type changed)                            |
| `type` integer             | `question_type` enum:question\_type | Renamed    | Now a fixed value list (question\_type) (Split, Value list) |
| `active` boolean           | `is_active` BOOLEAN                 | Renamed    | (Split)                                                     |
| `active` boolean           | `is_published` BOOLEAN              | Renamed    | (Split)                                                     |
| `order` integer            | `display_order` INTEGER             | Renamed    |                                                             |
| `points` double            | `weight` NUMERIC(10,2)              | Renamed    |                                                             |
| `created_date` timestamptz | `created_at` TIMESTAMPTZ            | Renamed    | (Split)                                                     |
| `created_date` timestamptz | `published_at` TIMESTAMPTZ          | Renamed    | (Split)                                                     |
| `updated_date` timestamptz | `updated_at` TIMESTAMPTZ            | Renamed    |                                                             |
| `description` text         | `description` TEXT                  | Unchanged  |                                                             |
| `confidential` boolean     | `confidential` BOOLEAN              | Unchanged  |                                                             |
| `help_text` text           | `help_text` TEXT                    | Unchanged  |                                                             |

* Swap the 10 renamed fields and point `FROM` at `questions`.
* Re-key 2 ID fields. Join people on `email`, not on old IDs.
* Add `WHERE deleted_at IS NULL`: `questions` keeps deleted rows.

```sql
-- Starter query: confirmed fields only. Was question_bank_question.
SELECT
  t.id,                 -- was id
  t.title,              -- was name
  t.description,        -- was description
  t.has_correct_answer, -- was type
  t.question_type,      -- was type
  t.is_active,          -- was active
  t.is_published,       -- was active
  t.confidential,       -- was confidential
  t.display_order,      -- was order
  t.weight,             -- was points
  t.help_text,          -- was help_text
  t.created_at,         -- was created_date
  t.published_at,       -- was created_date
  t.category_id         -- was category_id
FROM questions t
WHERE t.deleted_at IS NULL;
```

#### question\_bank\_questionresponse

**question\_bank\_questionresponse** → `form_response_answers`, `question_answer_documents`, `question_answers` · *split* · 16 confirmed fields (Unchanged 2 · Renamed 9 · ID changed 5)

Form response answers (current structure). Split table: each field names its new table.

> This is the risky mapping. Medtrics Classic had exactly one answer table. Oracle has two that both claim evaluation answers - form\_response\_answers (used by gradebook and analytics) and question\_answers (marked Medtrics Classic in the 07\_forms header but still fully indexed and policied). Documents hang off question\_answers only.

![Where the 16 confirmed fields of question\_bank\_questionresponse went](https://2912658775-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxpbJErq8GWWHPPkzmpv3%2Fuploads%2FM8apWc8ITRzuPLDthkkc%2Fflow-question-bank-questionresponse.png?alt=media)

| Medtrics Classic field          | Oracle                                              | Outcome    | Note                                             |
| ------------------------------- | --------------------------------------------------- | ---------- | ------------------------------------------------ |
| `id` integer                    | question\_answers.`id` UUID                         | ID changed | Integer link → UUID                              |
| `form_response_id` integer      | question\_answers.`form_response_id` UUID           | ID changed | Integer link → UUID pointing to form\_responses  |
| `question_id` integer           | question\_answers.`question_id` UUID                | ID changed | Integer link → UUID pointing to questions        |
| `responder_id` integer          | question\_answer\_documents.`uploaded_by` UUID      | ID changed | Integer link → UUID pointing to profiles (Split) |
| `responder_id` integer          | question\_answers.`answered_by` UUID                | ID changed | Integer link → UUID pointing to profiles (Split) |
| `answer_text` text              | question\_answers.`text_value` TEXT                 | Renamed    |                                                  |
| `answer_numeric` double         | form\_response\_answers.`is_not_applicable` BOOLEAN | Renamed    | number → bool (Split, Merged, Type changed)      |
| `answer_numeric` double         | form\_response\_answers.`numeric_value` NUMERIC     | Renamed    | (Split)                                          |
| `answer_numeric` double         | question\_answers.`numeric_value` NUMERIC(15,4)     | Renamed    | (Split)                                          |
| `answer_not_applicable` boolean | form\_response\_answers.`is_not_applicable` BOOLEAN | Renamed    | (Merged)                                         |
| `date_responded` timestamptz    | form\_response\_answers.`created_at` TIMESTAMPTZ    | Renamed    | (Split)                                          |
| `date_responded` timestamptz    | question\_answers.`created_at` TIMESTAMPTZ          | Renamed    | (Split)                                          |
| `date_modified` timestamptz     | question\_answers.`submitted_at` TIMESTAMPTZ        | Renamed    | (Split)                                          |
| `date_modified` timestamptz     | question\_answers.`updated_at` TIMESTAMPTZ          | Renamed    | (Split)                                          |
| `score` double                  | form\_response\_answers.`score` NUMERIC             | Unchanged  | (Split)                                          |
| `score` double                  | question\_answers.`score` NUMERIC(10,2)             | Unchanged  | (Split)                                          |

* Swap the 9 renamed fields and point `FROM` at `form_response_answers` (and the other new tables).
* Re-key 5 ID fields. Join people on `email`, not on old IDs.
* Add `WHERE deleted_at IS NULL`: `form_response_answers`, `question_answer_documents`, `question_answers` keep deleted rows.

#### question\_bank\_questionresponsedocument

**question\_bank\_questionresponsedocument** → `question_answer_documents` · *split* · 7 confirmed fields (Renamed 5 · ID changed 2)

Stores each instance of a file uploaded as part of a QuestionResponse.

> This is the risky mapping. Medtrics Classic had exactly one answer table. Oracle has two that both claim evaluation answers - form\_response\_answers (used by gradebook and analytics) and question\_answers (marked Medtrics Classic in the 07\_forms header but still fully indexed and policied). Documents hang off question\_answers only.

![Where the 7 confirmed fields of question\_bank\_questionresponsedocument went](https://2912658775-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxpbJErq8GWWHPPkzmpv3%2Fuploads%2FptjpTZcraKpiCNLK38Io%2Fflow-question-bank-questionresponsedocument.png?alt=media)

| Medtrics Classic field         | Oracle                   | Outcome    | Note                                              |
| ------------------------------ | ------------------------ | ---------- | ------------------------------------------------- |
| `id` integer                   | `id` UUID                | ID changed | Integer link → UUID                               |
| `question_response_id` integer | `answer_id` UUID         | ID changed | Integer link → UUID pointing to question\_answers |
| `document` varchar             | `file_name` TEXT         | Renamed    | (Split)                                           |
| `document` varchar             | `file_type` TEXT         | Renamed    | (Split)                                           |
| `document` varchar             | `file_url` TEXT          | Renamed    | (Split)                                           |
| `date_created` timestamptz     | `created_at` TIMESTAMPTZ | Renamed    |                                                   |
| `updated_date` timestamptz     | `updated_at` TIMESTAMPTZ | Renamed    |                                                   |

* Swap the 5 renamed fields and point `FROM` at `question_answer_documents`.
* Re-key 2 ID fields. Join people on `email`, not on old IDs.
* Add `WHERE deleted_at IS NULL`: `question_answer_documents` keeps deleted rows.

```sql
-- Starter query: confirmed fields only. Was question_bank_questionresponsedocument.
SELECT
  t.id,         -- was id
  t.file_name,  -- was document
  t.file_type,  -- was document
  t.file_url,   -- was document
  t.created_at, -- was date_created
  t.updated_at, -- was updated_date
  t.answer_id   -- was question_response_id
FROM question_answer_documents t
WHERE t.deleted_at IS NULL;
```

### Grade Books

7 tables, 67 confirmed fields: Unchanged 30 · Renamed 20 · ID changed 17.

#### gradebook\_gradedcourserotation

**gradebook\_gradedcourserotation** → `graded_course_rotations` · *same* · 11 confirmed fields (Unchanged 6 · Renamed 4 · ID changed 1)

Parent hub connecting rotations, curriculum courses, scores, and rubrics across sites and semesters.

> Same concept and almost the same columns, but Oracle added academic\_period\_id, weight, default\_rubric\_id and grade\_submission\_deadline, and changed code uniqueness from database-wide to per-program. Medtrics Classic case\_hours became required\_hours.

![Where the 11 confirmed fields of gradebook\_gradedcourserotation went](https://2912658775-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxpbJErq8GWWHPPkzmpv3%2Fuploads%2FV8xaClteDkmVNIqjYqEB%2Fflow-gradebook-gradedcourserotation.png?alt=media)

| Medtrics Classic field     | Oracle                   | Outcome    | Note                |
| -------------------------- | ------------------------ | ---------- | ------------------- |
| `id` integer               | `id` UUID                | ID changed | Integer link → UUID |
| `active` boolean           | `is_active` BOOLEAN      | Renamed    |                     |
| `type` text                | `gcr_type` TEXT          | Renamed    |                     |
| `created_date` timestamptz | `created_at` TIMESTAMPTZ | Renamed    |                     |
| `updated_date` timestamptz | `updated_at` TIMESTAMPTZ | Renamed    |                     |
| `name` text                | `name` TEXT              | Unchanged  |                     |
| `description` text         | `description` TEXT       | Unchanged  |                     |
| `code` text                | `code` TEXT              | Unchanged  |                     |
| `weeks` integer            | `weeks` INTEGER          | Unchanged  |                     |
| `credits` numeric          | `credits` NUMERIC(6,2)   | Unchanged  |                     |
| `is_required` boolean      | `is_required` BOOLEAN    | Unchanged  |                     |

* Swap the 4 renamed fields and point `FROM` at `graded_course_rotations`.
* Re-key 1 ID field. Join people on `email`, not on old IDs.
* Add `WHERE deleted_at IS NULL`: `graded_course_rotations` keeps deleted rows.

```sql
-- Starter query: confirmed fields only. Was gradebook_gradedcourserotation.
SELECT
  t.id,          -- was id
  t.is_active,   -- was active
  t.name,        -- was name
  t.description, -- was description
  t.code,        -- was code
  t.weeks,       -- was weeks
  t.credits,     -- was credits
  t.gcr_type,    -- was type
  t.created_at,  -- was created_date
  t.updated_at,  -- was updated_date
  t.is_required  -- was is_required
FROM graded_course_rotations t
WHERE t.deleted_at IS NULL;
```

#### gradebook\_graderubric

**gradebook\_graderubric** → `grade_rubrics` · *same* · 6 confirmed fields (Unchanged 3 · Renamed 2 · ID changed 1)

Convert numeric scores to letter grades via rubric\_ranges.

> Oracle added rubric\_role so one rubric drives the main status and a second drives an extra band such as honors, and moved letter\_grade and grade\_point onto the range row for GPA.

![Where the 6 confirmed fields of gradebook\_graderubric went](https://2912658775-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxpbJErq8GWWHPPkzmpv3%2Fuploads%2Fmy8RIbDKwx2z8AP8RAKy%2Fflow-gradebook-graderubric.png?alt=media)

| Medtrics Classic field     | Oracle                   | Outcome    | Note                                                                                                                |
| -------------------------- | ------------------------ | ---------- | ------------------------------------------------------------------------------------------------------------------- |
| `id` integer               | `id` UUID                | ID changed | Integer ID replaced by a new UUID. Medtrics Classic → new ID crosswalk is kept by the migration (see Keys & joins). |
| `created_date` timestamptz | `created_at` TIMESTAMPTZ | Renamed    |                                                                                                                     |
| `updated_date` timestamptz | `updated_at` TIMESTAMPTZ | Renamed    |                                                                                                                     |
| `name` varchar             | `name` TEXT              | Unchanged  |                                                                                                                     |
| `description` text         | `description` TEXT       | Unchanged  |                                                                                                                     |
| `version` integer          | `version` INTEGER        | Unchanged  |                                                                                                                     |

* Swap the 2 renamed fields and point `FROM` at `grade_rubrics`.
* Re-key 1 ID field. Join people on `email`, not on old IDs.
* Add `WHERE deleted_at IS NULL`: `grade_rubrics` keeps deleted rows.

```sql
-- Starter query: confirmed fields only. Was gradebook_graderubric.
SELECT
  t.id,          -- was id
  t.name,        -- was name
  t.description, -- was description
  t.version,     -- was version
  t.created_at,  -- was created_date
  t.updated_at   -- was updated_date
FROM grade_rubrics t
WHERE t.deleted_at IS NULL;
```

#### gradebook\_rubricrange

**gradebook\_rubricrange** → `rubric_ranges` · *same* · 6 confirmed fields (Unchanged 3 · Renamed 2 · ID changed 1)

Defines a score range within a rubric that maps to a specific ScoreStatus.

> Oracle added rubric\_role so one rubric drives the main status and a second drives an extra band such as honors, and moved letter\_grade and grade\_point onto the range row for GPA.

![Where the 6 confirmed fields of gradebook\_rubricrange went](https://2912658775-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxpbJErq8GWWHPPkzmpv3%2Fuploads%2FQqbZcSli0MG6gt4zhIOx%2Fflow-gradebook-rubricrange.png?alt=media)

| Medtrics Classic field     | Oracle                    | Outcome    | Note                                                                                                                |
| -------------------------- | ------------------------- | ---------- | ------------------------------------------------------------------------------------------------------------------- |
| `id` integer               | `id` UUID                 | ID changed | Integer ID replaced by a new UUID. Medtrics Classic → new ID crosswalk is kept by the migration (see Keys & joins). |
| `created_date` timestamptz | `created_at` TIMESTAMPTZ  | Renamed    |                                                                                                                     |
| `updated_date` timestamptz | `updated_at` TIMESTAMPTZ  | Renamed    |                                                                                                                     |
| `min_score` numeric        | `min_score` NUMERIC(10,2) | Unchanged  |                                                                                                                     |
| `max_score` numeric        | `max_score` NUMERIC(10,2) | Unchanged  |                                                                                                                     |
| `display_order` integer    | `display_order` INTEGER   | Unchanged  |                                                                                                                     |

* Swap the 2 renamed fields and point `FROM` at `rubric_ranges`.
* Re-key 1 ID field. Join people on `email`, not on old IDs.
* Add `WHERE deleted_at IS NULL`: `rubric_ranges` keeps deleted rows.

```sql
-- Starter query: confirmed fields only. Was gradebook_rubricrange.
SELECT
  t.id,            -- was id
  t.created_at,    -- was created_date
  t.updated_at,    -- was updated_date
  t.min_score,     -- was min_score
  t.max_score,     -- was max_score
  t.display_order  -- was display_order
FROM rubric_ranges t
WHERE t.deleted_at IS NULL;
```

#### gradebook\_score

**gradebook\_score** → `scores` · *same* · 14 confirmed fields (Unchanged 8 · ID changed 6)

Main grade storage - FERPA-compliant with program-level multi-tenancy.

> Oracle dropped the competing course / rotation / user\_schedule parents and kept graded\_course\_rotation\_id plus an optional block\_schedule\_id, so a grade now has one clear owner.

![Where the 14 confirmed fields of gradebook\_score went](https://2912658775-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxpbJErq8GWWHPPkzmpv3%2Fuploads%2FpDchPWAOKNEduFClD1Mv%2Fflow-gradebook-score.png?alt=media)

| Medtrics Classic field              | Oracle                           | Outcome    | Note                                                      |
| ----------------------------------- | -------------------------------- | ---------- | --------------------------------------------------------- |
| `id` integer                        | `id` UUID                        | ID changed | Integer link → UUID                                       |
| `graded_course_rotation_id` integer | `graded_course_rotation_id` UUID | ID changed | Integer link → UUID pointing to graded\_course\_rotations |
| `program_id` integer                | `program_id` UUID                | ID changed | Integer link → UUID pointing to programs                  |
| `status_id` integer                 | `status_id` UUID                 | ID changed | Integer link → UUID pointing to score\_statuses           |
| `form_assignment_id` integer        | `form_assignment_id` UUID        | ID changed | Integer link → UUID pointing to form\_assignments         |
| `other_status_id` integer           | `other_status_id` UUID           | ID changed | Integer link → UUID pointing to score\_statuses           |
| `percentile` numeric                | `percentile` NUMERIC             | Unchanged  |                                                           |
| `weeks` numeric                     | `weeks` NUMERIC                  | Unchanged  |                                                           |
| `start_date` date                   | `start_date` DATE                | Unchanged  |                                                           |
| `end_date` date                     | `end_date` DATE                  | Unchanged  |                                                           |
| `published_date` timestamptz        | `published_date` TIMESTAMPTZ     | Unchanged  |                                                           |
| `original_comment` text             | `original_comment` TEXT          | Unchanged  |                                                           |
| `calculated_raw_score` numeric      | `calculated_raw_score` NUMERIC   | Unchanged  |                                                           |
| `status_override` boolean           | `status_override` BOOLEAN        | Unchanged  |                                                           |

* Re-key 6 ID fields. Join people on `email`, not on old IDs.
* Add `WHERE deleted_at IS NULL`: `scores` keeps deleted rows.

```sql
-- Starter query: confirmed fields only. Was gradebook_score.
SELECT
  t.id,                        -- was id
  t.percentile,                -- was percentile
  t.weeks,                     -- was weeks
  t.start_date,                -- was start_date
  t.end_date,                  -- was end_date
  t.published_date,            -- was published_date
  t.graded_course_rotation_id, -- was graded_course_rotation_id
  t.program_id,                -- was program_id
  t.status_id,                 -- was status_id
  t.form_assignment_id,        -- was form_assignment_id
  t.other_status_id,           -- was other_status_id
  t.original_comment,          -- was original_comment
  t.calculated_raw_score,      -- was calculated_raw_score
  t.status_override            -- was status_override
FROM scores t
WHERE t.deleted_at IS NULL;
```

#### gradebook\_scorechart

**gradebook\_scorechart** → `score_charts` · *same* · 7 confirmed fields (Renamed 5 · ID changed 2)

Rendered or linked charts attached to individual scores (e.g. MSPE performance graphics).

> Moved out of the gradebook domain into a dedicated charts domain (27\_charts/02\_tables.sql:150) while still pointing at scores.

![Where the 7 confirmed fields of gradebook\_scorechart went](https://2912658775-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxpbJErq8GWWHPPkzmpv3%2Fuploads%2FQt3kh6ylRbxziT3eHNOy%2Fflow-gradebook-scorechart.png?alt=media)

| Medtrics Classic field     | Oracle                   | Outcome    | Note                                     |
| -------------------------- | ------------------------ | ---------- | ---------------------------------------- |
| `id` integer               | `id` UUID                | ID changed | Integer link → UUID (Split)              |
| `score_id` integer         | `score_id` UUID          | ID changed | Integer link → UUID pointing to scores   |
| `id` integer               | `metadata` JSONB         | Renamed    | int → json (Split, Merged, Type changed) |
| `file` varchar             | `file_path` TEXT         | Renamed    |                                          |
| `created_date` timestamptz | `created_at` TIMESTAMPTZ | Renamed    |                                          |
| `width` varchar            | `metadata` JSONB         | Renamed    | text → json (Merged, Type changed)       |
| `updated_date` timestamptz | `updated_at` TIMESTAMPTZ | Renamed    |                                          |

* Swap the 5 renamed fields and point `FROM` at `score_charts`.
* Re-key 2 ID fields. Join people on `email`, not on old IDs.
* Add `WHERE deleted_at IS NULL`: `score_charts` keeps deleted rows.

```sql
-- Starter query: confirmed fields only. Was gradebook_scorechart.
SELECT
  t.id,         -- was id
  t.metadata,   -- was id
  t.file_path,  -- was file
  t.created_at, -- was created_date
  t.score_id,   -- was score_id
  t.updated_at  -- was updated_date
FROM score_charts t
WHERE t.deleted_at IS NULL;
```

#### gradebook\_scorecomment

**gradebook\_scorecomment** → `score_comments` · 6 confirmed fields (Renamed 3 · ID changed 3)

Feedback on grades - is\_private flag controls learner visibility.

![Where the 6 confirmed fields of gradebook\_scorecomment went](https://2912658775-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxpbJErq8GWWHPPkzmpv3%2Fuploads%2FXV12jk2OxSN45RAFw5XF%2Fflow-gradebook-scorecomment.png?alt=media)

| Medtrics Classic field     | Oracle                   | Outcome    | Note                                     |
| -------------------------- | ------------------------ | ---------- | ---------------------------------------- |
| `id` integer               | `id` UUID                | ID changed | Integer link → UUID                      |
| `created_by_id` integer    | `created_by` UUID        | ID changed | Integer link → UUID pointing to profiles |
| `score_id` integer         | `score_id` UUID          | ID changed | Integer link → UUID pointing to scores   |
| `comment` text             | `comment_text` TEXT      | Renamed    |                                          |
| `created_date` timestamptz | `created_at` TIMESTAMPTZ | Renamed    |                                          |
| `updated_date` timestamptz | `updated_at` TIMESTAMPTZ | Renamed    |                                          |

* Swap the 3 renamed fields and point `FROM` at `score_comments`.
* Re-key 3 ID fields. Join people on `email`, not on old IDs.
* Add `WHERE deleted_at IS NULL`: `score_comments` keeps deleted rows.

```sql
-- Starter query: confirmed fields only. Was gradebook_scorecomment.
SELECT
  t.id,           -- was id
  t.comment_text, -- was comment
  t.created_at,   -- was created_date
  t.created_by,   -- was created_by_id
  t.score_id,     -- was score_id
  t.updated_at    -- was updated_date
FROM score_comments t
WHERE t.deleted_at IS NULL;
```

#### gradebook\_scoretype

**gradebook\_scoretype** → `score_types` · *same* · 17 confirmed fields (Unchanged 10 · Renamed 4 · ID changed 3)

> Re-homed from the curriculum course to the GCR and given a minimum\_required\_entries gate and a value\_mode flag for completion-only items with no number.

![Where the 17 confirmed fields of gradebook\_scoretype went](https://2912658775-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxpbJErq8GWWHPPkzmpv3%2Fuploads%2Fyi8VARLl9NSAqtfiXBau%2Fflow-gradebook-scoretype.png?alt=media)

| Medtrics Classic field             | Oracle                             | Outcome    | Note                                                |
| ---------------------------------- | ---------------------------------- | ---------- | --------------------------------------------------- |
| `id` integer                       | `id` UUID                          | ID changed | Integer link → UUID (Split)                         |
| `course_id` integer                | `course_id` UUID                   | ID changed | Integer link → UUID pointing to curriculum\_courses |
| `form_id` integer                  | `form_id` UUID                     | ID changed | Integer link → UUID pointing to forms               |
| `id` integer                       | `name` TEXT                        | Renamed    | int → text (Split, Merged, Type changed)            |
| `created_date` timestamptz         | `created_at` TIMESTAMPTZ           | Renamed    |                                                     |
| `active` boolean                   | `is_active` BOOLEAN                | Renamed    |                                                     |
| `updated_date` timestamptz         | `updated_at` TIMESTAMPTZ           | Renamed    |                                                     |
| `name` text                        | `name` TEXT                        | Unchanged  | (Merged)                                            |
| `description` text                 | `description` TEXT                 | Unchanged  |                                                     |
| `locked` boolean                   | `locked` BOOLEAN                   | Unchanged  |                                                     |
| `points` numeric                   | `points` NUMERIC(10,2)             | Unchanged  |                                                     |
| `publish_date` timestamptz         | `publish_date` TIMESTAMPTZ         | Unchanged  |                                                     |
| `allow_more_than_required` boolean | `allow_more_than_required` BOOLEAN | Unchanged  |                                                     |
| `auto_populate_grade` boolean      | `auto_populate_grade` BOOLEAN      | Unchanged  |                                                     |
| `is_final_grade` boolean           | `is_final_grade` BOOLEAN           | Unchanged  |                                                     |
| `required_entries` integer         | `required_entries` INTEGER         | Unchanged  |                                                     |
| `weight` numeric                   | `weight` NUMERIC(10,4)             | Unchanged  |                                                     |

* Swap the 4 renamed fields and point `FROM` at `score_types`.
* Re-key 3 ID fields. Join people on `email`, not on old IDs.
* Add `WHERE deleted_at IS NULL`: `score_types` keeps deleted rows.

```sql
-- Starter query: confirmed fields only. Was gradebook_scoretype.
SELECT
  t.id,                       -- was id
  t.name,                     -- was id
  t.description,              -- was description
  t.created_at,               -- was created_date
  t.course_id,                -- was course_id
  t.is_active,                -- was active
  t.locked,                   -- was locked
  t.points,                   -- was points
  t.publish_date,             -- was publish_date
  t.updated_at,               -- was updated_date
  t.allow_more_than_required, -- was allow_more_than_required
  t.auto_populate_grade,      -- was auto_populate_grade
  t.form_id,                  -- was form_id
  t.is_final_grade            -- was is_final_grade
FROM score_types t
WHERE t.deleted_at IS NULL;
```


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation by asking a question.

Perform an HTTP GET request on the following URL with the `ask` and `goal` query parameters:

```
GET https://docs.mymedtrics.com/get-started/classic-data-mapping/evaluations-and-grades.md?ask=<question>&goal=<user_goal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is what the user is ultimately trying to achieve, the reason they need the answer. Sharing it helps GitBook give you a better, more relevant answer. A goal is most helpful when it describes the outcome the user wants rather than restating the question. For example, with `ask=how do I create an API token`, a goal like `automate deployments from our CI pipeline` lets GitBook tailor the answer to that use case.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
