/iblai-vibe-agent-grader
Add the agent Grader tab -- set up how the agent grades work against
a rubric you define. A master "Grading" toggle attaches/detaches the
Grading tool on the agent and gates three sub-tabs: Grading setup
(what gets graded, how much feedback is shared, and the required grading
instructions), Rubric (a criteria table with modal-based
add/edit/delete and a running points total), and Results (every
grade the agent has issued, with human overrides that are pushed back to
the LMS the grade came from). Great for essays, projects, and practice
exercises. This is one tab in the wider agent-settings family. All tabs
share the same AgentSettingsProvider wrapper.
Common setup (brand, conventions, env files, verification): see docs/skill-setup.md.
Prerequisites
- Auth must be set up first (
/iblai-vibe-auth)
- MCP server + skills configured (
@iblai/mcp in .mcp.json)
AgentSettingsProvider must wrap the route (see /iblai-vibe-agent-setting
Step 2 if not already set up)
- Ask the user for a real
mentorId (agent UUID). Do NOT invent one.
Step 1: Check Environment
Before proceeding, check for an iblai.env in the project root. Look for
PLATFORM, DOMAIN, and TOKEN variables. If the file does not exist or
is missing these variables, tell the user:
"You need an iblai.env with your platform configuration. Download the
template and fill in your values:
curl -o iblai.env https://raw.githubusercontent.com/iblai/vibe/refs/heads/main/iblai.env"
Step 2: Mount AgentGraderTab
// app/(app)/agents/[mentorId]/grader/page.tsx
"use client";
import { AgentGraderTab } from "@iblai/iblai-js/web-containers/next";
export default function AgentGraderPage() {
return (
<div className="flex h-full flex-col bg-white">
<AgentGraderTab />
</div>
);
}
AgentGraderTab reads tenantKey, mentorId, and username from
AgentSettingsProvider. No props are required for the standard mount.
Step 3: Customize Labels (Optional)
import { AgentGraderTab } from "@iblai/iblai-js/web-containers/next";
<AgentGraderTab
labels={{
header: { title: "Auto-grading" },
subTabs: { rubric: "Scoring rubric" },
}}
/>;
Step 4: Use MCP Tools for Customization
get_component_info("AgentGraderTab")
get_component_info("AgentSettingsProvider")
<AgentGraderTab> Props
Import from @iblai/iblai-js/web-containers/next.
| Prop |
Type |
Required |
Description |
labels |
DeepPartial<GraderTabLabels> |
No |
Override user-visible strings |
tenantKey |
string |
No |
Identity override; defaults to AgentSettingsProvider |
mentorId |
string |
No |
Identity override; defaults to AgentSettingsProvider |
username |
string |
No |
Identity override; defaults to AgentSettingsProvider |
enableRBAC |
boolean |
No |
Enable per-action RBAC checks; defaults to AgentSettingsProvider |
rbacPermissions |
object |
No |
RBAC permission tree; defaults to AgentSettingsProvider |
What the tab renders
- Header — "Grader" title and description.
- "Grading" capability toggle — attaches/detaches the Grading
tool on the agent (the sole activation switch on the backend). Off
hides the sub-tabs and shows a hint; anything already set up is kept
safe if grading is later turned off.
- Misconfiguration warning — grading only runs when the tool is
attached AND a config exists AND the rubric has at least one
criterion. An amber warning appears whenever the toggle is on but the
setup or the rubric is still missing.
- No-access state — when the current user lacks permission for the
grading endpoints (403), the gated content is replaced by a
"No access to grading settings" notice.
Grading setup sub-tab
| Field |
Notes |
| What gets graded |
A submission (a piece of work the person hands in, like an essay or answer) or The conversation (how the whole conversation went). |
| Feedback shared with the person |
Overall feedback only / Feedback per criterion / Overall + per criterion. The overall score is always calculated — this only controls how much detail is shared back. |
| Grading instructions |
Required textarea. The context the agent uses every time it grades. |
Save is enabled once the instructions are non-empty and something
changed. The first save creates the config; later saves update it.
Rubric sub-tab
Each row is one thing the agent looks for and how many points it is
worth; the overall score is points earned out of the total.
- Criteria table — Name, Criteria, Points, and a per-row actions
menu (Edit / Delete).
- Add/Edit criterion modal — Name (required, e.g. "Clarity"),
Criteria (required — describes what earns the points), Points
(positive number).
- Delete criterion modal — confirmation before removal. The last
criterion can't be removed while grading is set up — add another
first.
- Footer — "Total possible points: N" and "Overall score = points
earned ÷ N."
- Until the grading setup is saved, the rubric shows a hint to save the
setup first.
Results sub-tab
Every grade this agent has issued. Override a score to correct it — the
change is pushed back to the LMS the grade came from.
- Filters — a searchable user combobox (the same user list as
the History tab's user filter, with an "All Users" reset), a status
select (All Statuses / Pending / Published / Failed), and a
date-range picker (two-month calendar).
- Results table — 10 rows per page: User email, Score (the
effective score as a percent), Status, Override (shows
"Overridden · score · status" when one exists, otherwise —), Graded
(time-ago), and an Override button per row (only for users with
the
override_grade_results permission).
- Override Grade modal — shows the user, AI score, and current
override, then collects Override Points (0 up to the rubric's
total, capped at 100; the score pushed to the LMS becomes points ÷
total) and optional Override Feedback explaining the change for
the user. When an override already exists, a Clear button
removes it and restores the AI score.
Related Exports
From @iblai/iblai-js/web-containers/next:
AGENT_GRADER_TAB_LABELS -- the default agent-facing label bundle.
GraderTabLabels -- type for the full label bundle.
AgentGraderTabProps -- props type for the tab.
GRADING_TOOL_NAME -- the tool name ("Grading") the toggle matches
on. Detection uses the tool name, not the slug — slugs default to a
UUID and are not stable across environments.
From @iblai/data-layer -- the RTK Query hooks and types the tab uses,
for custom UI built on the same endpoints:
- Config:
useGetMentorGraderConfigurationQuery,
useCreateMentorGraderConfigurationMutation,
useUpdateMentorGraderConfigurationMutation
- Criteria:
useListGraderCriteriaQuery,
useCreateGraderCriterionMutation, useUpdateGraderCriterionMutation,
useDeleteGraderCriterionMutation
- Results:
useListGradeResultsQuery, useGetGradeResultQuery,
useOverrideGradeResultMutation, useGetChatHistoryFilterQuery (the
user filter list)
- Toggle:
useGetMentorSettingsQuery, useGetToolsQuery,
useEditMentorMutation
- Types:
MentorGraderConfiguration, GradingMode, FeedbackMode,
GradeResult, GradeResultPublishStatus,
CreateMentorGraderConfigurationRequest,
CreateGraderCriterionRequest, UpdateGraderCriterionRequest
Step 5: Verify
Run /iblai-vibe-ops-test before telling the user the work is ready:
pnpm build -- must pass with zero errors
pnpm test -- vitest must pass
- Start dev server and touch test:
pnpm dev &
npx playwright screenshot http://localhost:3000/agents/<id>/grader /tmp/agent-grader.png
Important Notes
- Redux store: Must include
mentorReducer and mentorMiddleware
initializeDataLayer(): 5 args (v1.2+)
@reduxjs/toolkit: Deduplicated via webpack aliases in next.config.ts
- Peer deps:
sonner and @iblai/iblai-web-mentor must be installed
(pnpm add sonner @iblai/iblai-web-mentor)
- Shared provider:
AgentSettingsProvider must wrap the route at a
layout level. See /iblai-vibe-agent-setting Step 2 for the full snippet.
- Activation is a tool attachment: The toggle adds/removes the
Grading tool in the agent's tool_slugs (same state as the Tools
tab — /iblai-vibe-agent-tool). If the Grading tool is not in the
organization's catalogue, turning the toggle on shows an error toast.
- Config survives disable: Detaching the tool deliberately leaves
the grader config and rubric untouched — rubric work survives
disable/re-enable. Attaching the tool auto-provisions the config row.
- First-run 404 is normal: A missing grader config (404) is the
documented first-run state, not an error — the first save creates it.
- RBAC: With
enableRBAC on, every grader action is checked as a
flat action on the agent resource
(/mentors/{dbId}/#<action>): read_grader_config,
create_grader_config, write_grader_config, view_grader_criteria,
create_grader_criteria, write_grader_criteria,
delete_grader_criteria, view_grade_results,
override_grade_results. Sub-tab triggers only render for permitted
views (the default sub-tab is the first viewable one), the Override
button requires override_grade_results, and a user with no viewable
sub-tab sees the no-access notice. Older permission trees without
these actions are treated as allowed.
- Brand guidelines: BRAND.md
1---2name: iblai-vibe-agent-grader3description: Add the agent Grader tab (rubric-based grading with a grading toggle, grading setup form, criteria table, and grade results with LMS-synced overrides) to your Next.js app4---56# /iblai-vibe-agent-grader78Add the agent **Grader tab** -- set up how the agent grades work against9a rubric you define. A master "Grading" toggle attaches/detaches the10Grading tool on the agent and gates three sub-tabs: **Grading setup**11(what gets graded, how much feedback is shared, and the required grading12instructions), **Rubric** (a criteria table with modal-based13add/edit/delete and a running points total), and **Results** (every14grade the agent has issued, with human overrides that are pushed back to15the LMS the grade came from). Great for essays, projects, and practice16exercises. This is one tab in the wider agent-settings family. All tabs17share the same `AgentSettingsProvider` wrapper.181920212223242526272829303132333435> **Common setup (brand, conventions, env files, verification):** see [docs/skill-setup.md](https://raw.githubusercontent.com/iblai/vibe/refs/heads/main/docs/skill-setup.md).3637## Prerequisites3839- Auth must be set up first (`/iblai-vibe-auth`)40- MCP server + skills configured (`@iblai/mcp` in `.mcp.json`)41- `AgentSettingsProvider` must wrap the route (see `/iblai-vibe-agent-setting`42 Step 2 if not already set up)43- Ask the user for a real `mentorId` (agent UUID). Do NOT invent one.4445## Step 1: Check Environment4647Before proceeding, check for an `iblai.env` in the project root. Look for48`PLATFORM`, `DOMAIN`, and `TOKEN` variables. If the file does not exist or49is missing these variables, tell the user:50"You need an `iblai.env` with your platform configuration. Download the51template and fill in your values:52`curl -o iblai.env https://raw.githubusercontent.com/iblai/vibe/refs/heads/main/iblai.env`"5354## Step 2: Mount `AgentGraderTab`5556```tsx57// app/(app)/agents/[mentorId]/grader/page.tsx58"use client";5960import { AgentGraderTab } from "@iblai/iblai-js/web-containers/next";6162export default function AgentGraderPage() {63 return (64 <div className="flex h-full flex-col bg-white">65 <AgentGraderTab />66 </div>67 );68}69```7071`AgentGraderTab` reads `tenantKey`, `mentorId`, and `username` from72`AgentSettingsProvider`. No props are required for the standard mount.7374## Step 3: Customize Labels (Optional)7576```tsx77import { AgentGraderTab } from "@iblai/iblai-js/web-containers/next";7879<AgentGraderTab80 labels={{81 header: { title: "Auto-grading" },82 subTabs: { rubric: "Scoring rubric" },83 }}84/>;85```8687## Step 4: Use MCP Tools for Customization8889```90get_component_info("AgentGraderTab")91get_component_info("AgentSettingsProvider")92```9394## `<AgentGraderTab>` Props9596Import from `@iblai/iblai-js/web-containers/next`.9798| Prop | Type | Required | Description |99|------|------|----------|-------------|100| `labels` | `DeepPartial<GraderTabLabels>` | No | Override user-visible strings |101| `tenantKey` | `string` | No | Identity override; defaults to `AgentSettingsProvider` |102| `mentorId` | `string` | No | Identity override; defaults to `AgentSettingsProvider` |103| `username` | `string` | No | Identity override; defaults to `AgentSettingsProvider` |104| `enableRBAC` | `boolean` | No | Enable per-action RBAC checks; defaults to `AgentSettingsProvider` |105| `rbacPermissions` | `object` | No | RBAC permission tree; defaults to `AgentSettingsProvider` |106107## What the tab renders108109- **Header** — "Grader" title and description.110- **"Grading" capability toggle** — attaches/detaches the **Grading**111 tool on the agent (the sole activation switch on the backend). Off112 hides the sub-tabs and shows a hint; anything already set up is kept113 safe if grading is later turned off.114- **Misconfiguration warning** — grading only runs when the tool is115 attached AND a config exists AND the rubric has at least one116 criterion. An amber warning appears whenever the toggle is on but the117 setup or the rubric is still missing.118- **No-access state** — when the current user lacks permission for the119 grading endpoints (403), the gated content is replaced by a120 "No access to grading settings" notice.121122### Grading setup sub-tab123124| Field | Notes |125|---|---|126| What gets graded | `A submission` (a piece of work the person hands in, like an essay or answer) or `The conversation` (how the whole conversation went). |127| Feedback shared with the person | `Overall feedback only` / `Feedback per criterion` / `Overall + per criterion`. The overall score is always calculated — this only controls how much detail is shared back. |128| Grading instructions | Required textarea. The context the agent uses every time it grades. |129130**Save** is enabled once the instructions are non-empty and something131changed. The first save creates the config; later saves update it.132133### Rubric sub-tab134135Each row is one thing the agent looks for and how many points it is136worth; the overall score is points earned out of the total.137138- **Criteria table** — Name, Criteria, Points, and a per-row actions139 menu (**Edit** / **Delete**).140- **Add/Edit criterion modal** — Name (required, e.g. "Clarity"),141 Criteria (required — describes what earns the points), Points142 (positive number).143- **Delete criterion modal** — confirmation before removal. The last144 criterion can't be removed while grading is set up — add another145 first.146- **Footer** — "Total possible points: N" and "Overall score = points147 earned ÷ N."148- Until the grading setup is saved, the rubric shows a hint to save the149 setup first.150151### Results sub-tab152153Every grade this agent has issued. Override a score to correct it — the154change is pushed back to the LMS the grade came from.155156- **Filters** — a searchable user combobox (the same user list as157 the History tab's user filter, with an "All Users" reset), a status158 select (All Statuses / Pending / Published / Failed), and a159 date-range picker (two-month calendar).160- **Results table** — 10 rows per page: User email, Score (the161 effective score as a percent), Status, Override (shows162 "Overridden · score · status" when one exists, otherwise —), Graded163 (time-ago), and an **Override** button per row (only for users with164 the `override_grade_results` permission).165- **Override Grade modal** — shows the user, AI score, and current166 override, then collects **Override Points** (0 up to the rubric's167 total, capped at 100; the score pushed to the LMS becomes points ÷168 total) and optional **Override Feedback** explaining the change for169 the user. When an override already exists, a **Clear** button170 removes it and restores the AI score.171172## Related Exports173174From `@iblai/iblai-js/web-containers/next`:175176- `AGENT_GRADER_TAB_LABELS` -- the default agent-facing label bundle.177- `GraderTabLabels` -- type for the full label bundle.178- `AgentGraderTabProps` -- props type for the tab.179- `GRADING_TOOL_NAME` -- the tool name (`"Grading"`) the toggle matches180 on. Detection uses the tool *name*, not the slug — slugs default to a181 UUID and are not stable across environments.182183From `@iblai/data-layer` -- the RTK Query hooks and types the tab uses,184for custom UI built on the same endpoints:185186- Config: `useGetMentorGraderConfigurationQuery`,187 `useCreateMentorGraderConfigurationMutation`,188 `useUpdateMentorGraderConfigurationMutation`189- Criteria: `useListGraderCriteriaQuery`,190 `useCreateGraderCriterionMutation`, `useUpdateGraderCriterionMutation`,191 `useDeleteGraderCriterionMutation`192- Results: `useListGradeResultsQuery`, `useGetGradeResultQuery`,193 `useOverrideGradeResultMutation`, `useGetChatHistoryFilterQuery` (the194 user filter list)195- Toggle: `useGetMentorSettingsQuery`, `useGetToolsQuery`,196 `useEditMentorMutation`197- Types: `MentorGraderConfiguration`, `GradingMode`, `FeedbackMode`,198 `GradeResult`, `GradeResultPublishStatus`,199 `CreateMentorGraderConfigurationRequest`,200 `CreateGraderCriterionRequest`, `UpdateGraderCriterionRequest`201202## Step 5: Verify203204Run `/iblai-vibe-ops-test` before telling the user the work is ready:2052061. `pnpm build` -- must pass with zero errors2072. `pnpm test` -- vitest must pass2083. Start dev server and touch test:209 ```bash210 pnpm dev &211 npx playwright screenshot http://localhost:3000/agents/<id>/grader /tmp/agent-grader.png212 ```213214## Important Notes215216- **Redux store**: Must include `mentorReducer` and `mentorMiddleware`217- **`initializeDataLayer()`**: 5 args (v1.2+)218- **`@reduxjs/toolkit`**: Deduplicated via webpack aliases in `next.config.ts`219- **Peer deps**: `sonner` and `@iblai/iblai-web-mentor` must be installed220 (`pnpm add sonner @iblai/iblai-web-mentor`)221- **Shared provider**: `AgentSettingsProvider` must wrap the route at a222 layout level. See `/iblai-vibe-agent-setting` Step 2 for the full snippet.223- **Activation is a tool attachment**: The toggle adds/removes the224 `Grading` tool in the agent's `tool_slugs` (same state as the Tools225 tab — `/iblai-vibe-agent-tool`). If the Grading tool is not in the226 organization's catalogue, turning the toggle on shows an error toast.227- **Config survives disable**: Detaching the tool deliberately leaves228 the grader config and rubric untouched — rubric work survives229 disable/re-enable. Attaching the tool auto-provisions the config row.230- **First-run 404 is normal**: A missing grader config (404) is the231 documented first-run state, not an error — the first save creates it.232- **RBAC**: With `enableRBAC` on, every grader action is checked as a233 flat action on the agent resource234 (`/mentors/{dbId}/#<action>`): `read_grader_config`,235 `create_grader_config`, `write_grader_config`, `view_grader_criteria`,236 `create_grader_criteria`, `write_grader_criteria`,237 `delete_grader_criteria`, `view_grade_results`,238 `override_grade_results`. Sub-tab triggers only render for permitted239 views (the default sub-tab is the first viewable one), the Override240 button requires `override_grade_results`, and a user with no viewable241 sub-tab sees the no-access notice. Older permission trees without242 these actions are treated as allowed.243- **Brand guidelines**: [BRAND.md](https://raw.githubusercontent.com/iblai/vibe/refs/heads/main/BRAND.md)