Review schemas define how the SME review page looks and behaves. Each schema is a JSON document stored in the form_schemas collection. Schemas are assigned to managers, and their SMEs inherit them.
A schema has three top-level keys:
{
"fields": { ... }, // Field definitions (what exists)
"tabs": [ ... ] // Layout structure (how it's arranged)
}
Plus metadata stored alongside:
name — unique slug (e.g. ots_qsa_review)title — display name (e.g. "OTS QSA Review")source_collection — the MongoDB collection this form reviews (e.g. qsa)The fields object defines every field available in the form. Each key is a unique field identifier, and the value describes how it behaves.
"fields": {
"question": {
"label": "Question",
"type": "display",
"editable": true,
"katex": true
},
"is_google_proof": {
"label": "Google-proof?",
"type": "boolean"
},
"feedback_comment": {
"label": "Feedback",
"type": "text",
"placeholder": "Optional comments..."
}
}
Every field must have label and type. Additional options depend on the type.
Set "approval_field" at the top level of the schema (alongside fields and tabs) to indicate which boolean field represents the final approval decision. This is used by the Reports dashboard to calculate approved/rejected counts.
"approval_field": "good_to_go"
If not set, the system defaults to looking for a field named good_to_go.
Shows content from the reviewed item (e.g., question, solution, answer). Supports mathematical notation rendering, inline editing with word-level diff, and tool buttons.
| Option | Value Type | Default | Description |
|---|---|---|---|
editable | boolean | false | Show edit button. SME can modify the text. |
katex | boolean | false | Render mathematical notation using KaTeX, a math typesetting library (e.g. $x^2$ displays as x²). Enable this for fields that contain math formulas or equations. |
collapsible | boolean | false | Section can be collapsed/expanded. |
The field key must match a field name in the source document (e.g., "question" reads from the item's question property). If you need to show related data (e.g., book info), ensure the data pipeline flattens it into the document as a top-level field.
A standard checkbox for yes/no criteria. Checked = Yes, unchecked = No. Supports keyboard shortcuts: Tab to cycle between checkboxes, Y/N to check/uncheck.
| Option | Value Type | Default | Description |
|---|---|---|---|
label | string | — | The label shown next to the checkbox. |
All boolean fields are collected as criteria in the review submission. Checked = "Yes", unchecked = "No".
A dropdown menu for choosing from a predefined list of options.
| Option | Value Type | Default | Description |
|---|---|---|---|
options | array | [] | List of choices shown in the dropdown. |
"difficulty": {
"label": "Difficulty Level",
"type": "select",
"options": ["Easy", "Medium", "Hard"]
}
A multi-line textarea for free-form input (e.g., feedback comments).
| Option | Value Type | Default | Description |
|---|---|---|---|
placeholder | string | "" | Placeholder text shown when empty. |
Tabs split the review form into steps. The SME progresses through tabs using Previous/Next buttons. The submit button appears on the last tab.
"tabs": [
{
"key": "review",
"label": "Review",
"layout": "split",
"groups": [ ... ]
},
{
"key": "decision",
"label": "Decision",
"layout": "single",
"groups": [ ... ]
}
]
| Property | Type | Description |
|---|---|---|
key | string | Unique identifier for the tab. |
label | string | Display name shown in the tab bar. |
layout | string | Panel layout: "split" or "single". See Layouts. |
groups | array | Groups of fields within this tab. |
If the schema has no tabs, the review page renders all fields in a single split view (display fields on the left, input fields on the right).
Groups organize fields within a tab. Each group has a heading and a position that determines where it appears on screen.
"groups": [
{
"key": "qsa",
"label": "QSA",
"position": "left",
"fields": ["question", "solution", "answer", "book_info", "passage"]
},
{
"key": "rubric",
"label": "Quality Checklist",
"position": "right",
"fields": ["is_google_proof", "is_target_level", "..."]
}
]
| Property | Type | Description |
|---|---|---|
key | string | Unique identifier for the group. |
label | string | Heading shown above the group. Leave empty for no heading. |
position | string | "left", "right", or "full". See Layouts. |
fields | array | Ordered list of field keys to render in this group. |
"split" — Two-column layout. Groups with position: "left" appear on the left, "right" on the right. Use this for side-by-side content + rubric views."single" — Full-width single column. All groups stack vertically, centered. Use this for focused tasks like the final decision."left" — Left column in a split layout. Scrollable, flexible width."right" — Right column in a split layout. Fixed 340px width, gray background."full" — Full width (max 800px, centered). Used in single-column tabs.A complete OTS QSA Review schema with two tabs:
{
"fields": {
"question": {"label": "Question", "type": "display", "editable": true, "katex": true},
"solution": {"label": "Solution", "type": "display", "editable": true, "katex": true, "collapsible": true},
"answer": {"label": "Answer", "type": "display", "editable": true, "katex": true},
"book_info": {"label": "Book", "type": "display"},
"passage": {"label": "Concept Passage", "type": "display", "collapsible": true, "katex": true},
"is_google_proof": {"label": "Google-proof?", "type": "boolean"},
"is_target_level": {"label": "Target level?", "type": "boolean"},
"is_self_contained": {"label": "Self-contained?", "type": "boolean"},
"conditions_stated": {"label": "Conditions stated?", "type": "boolean"},
"factually_correct": {"label": "Factually correct?", "type": "boolean"},
"detailed_reasoning": {"label": "Detailed reasoning?","type": "boolean"},
"latex_correct": {"label": "LaTeX correct?", "type": "boolean"},
"grammar_correct": {"label": "Grammar correct?", "type": "boolean"},
"structure_correct": {"label": "Structure correct?", "type": "boolean"},
"feedback_comment": {"label": "Feedback", "type": "text", "placeholder": "Optional comments or suggestions..."},
"good_to_go": {"label": "Good to Go?", "type": "boolean"}
},
"tabs": [
{
"key": "review",
"label": "Review",
"layout": "split",
"groups": [
{
"key": "qsa",
"label": "QSA",
"position": "left",
"fields": ["question", "solution", "answer", "book_info", "passage"]
},
{
"key": "rubric",
"label": "Quality Checklist",
"position": "right",
"fields": [
"is_google_proof", "is_target_level", "is_self_contained",
"conditions_stated", "factually_correct", "detailed_reasoning",
"latex_correct", "grammar_correct", "structure_correct"
]
}
]
},
{
"key": "decision",
"label": "Decision",
"layout": "single",
"groups": [
{
"key": "final",
"label": "Final Review",
"position": "full",
"fields": ["feedback_comment", "good_to_go"]
}
]
}
]
}