Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Build custom annotation UIs for human review of agent traces, LLM outputs, and labeled data. Generates a self-contained HTML interface for reviewing, labeling, comparing, and exporting judgments. For calibrating evals, auditing agent behavior, and building gold-standard datasets. Triggers on: "review interface", "annotation ui", "labeling interface", "review ui", "human review"
.claude/skills/miosa-osa-review-interface/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | 19% | 0% |
| case-11 | ✗→✓ | ▲ Improved | -26% | 0% |
| case-12 | ✗→✓ | ▲ Improved | -3% | 0% |
| case-15 | ✗→✓ | ▲ Improved | 51% | 0% |
| case-16 | ✗→✓ | ▲ Improved | 56% | 0% |
> Build custom annotation UIs for human review of agent outputs and traces.
Generate a self-contained HTML annotation interface tailored to a specific review task. Supports reviewing LLM outputs, agent execution traces, side-by-side comparisons, and data labeling. The interface loads data from a JSONL file, presents items one at a time with the configured annotation controls, tracks progress, and exports labeled results. No server required — runs entirely in the browser from a single HTML file.
bash# Build review UI for eval outputs /review-interface --data eval-results.jsonl --task "rate output quality" --labels pass,fail # Build comparison UI (A vs B) /review-interface --data comparisons.jsonl --task "which response is better" --mode compare # Build trace review UI /review-interface --data agent-traces.jsonl --task "identify failure point" --mode trace # Custom annotation schema /review-interface --data outputs.jsonl --schema annotation-schema.yaml # Build with pre-filled labels (for review/correction) /review-interface --data labeled.jsonl --labels pass,fail --prefilled
| Flag | Type | Default | Description | |------|------|---------|-------------| | --data | string | required | Path to JSONL data file to review | | --task | string | required | Description of the review task (shown in UI header) | | --labels | string | — | Comma-separated label options (e.g., pass,fail or good,okay,bad) | | --mode | enum | single | Review mode: single (one item), compare (A vs B), trace (step-by-step) | | --schema | string | — | Path to custom annotation schema (YAML) | | --prefilled | flag | false | Load existing labels for review/correction | | --output | string | review-interface.html | Output HTML file path | | --items-per-page | int | 1 | Items shown per page | | --randomize | flag | false | Randomize item presentation order | | --blind | flag | false | Hide metadata (model name, config) to reduce bias |
--labels, --schema, or --mode, define the annotation controls: radio buttons (categorical), text input (free-form notes), sliders (continuous), checkboxes (multi-label), or side-by-side selectors (comparison).--blind is set, strip model identifiers, configuration details, and any metadata that could bias the reviewer. Randomize A/B order in comparison mode./review-interface --data eval-results.jsonl --task "Is this summary accurate?" --labels pass,fail
## Review Interface Generated
### Configuration
- Task: "Is this summary accurate?"
- Items: 200
- Labels: pass, fail
- Mode: single
- Keyboard: 1=pass, 2=fail, Enter=next, Backspace=prev
### Data Fields
- Input: source document (scrollable)
- Output: generated summary
- Annotation: pass/fail + optional notes
### Estimated Review Time
- At 30s per item: ~100 minutes
- At 15s per item: ~50 minutes
### Output: review-interface.html (82 KB)/review-interface --data comparisons.jsonl --task "Which response is better?" --mode compare --blind
## Review Interface Generated
### Configuration
- Task: "Which response is better?"
- Items: 150
- Mode: compare (A vs B, blinded)
- Labels: A is better, B is better, Tie
- Keyboard: 1=A, 2=B, 3=Tie, Enter=next
### Blind Mode
- Model names hidden
- Response order randomized per item
- No metadata visible during reviewyaml# annotation-schema.yaml fields: - name: quality type: radio options: [excellent, good, acceptable, poor] required: true - name: errors type: checkbox options: [factual-error, hallucination, incomplete, off-topic, formatting] required: false - name: notes type: text placeholder: "Optional notes..." required: false - name: confidence type: slider min: 1 max: 5 default: 3
markdown## Review Interface Generated ### File: <output>.html ### Size: N KB (self-contained, no dependencies) ### Configuration - Task: <task description> - Items: N - Mode: <mode> - Labels/Schema: <description> ### Features - Progress persistence (localStorage) - Keyboard shortcuts - Export to JSONL - Filter by label status - Blind mode: <on/off> ### Estimated Review Time - N items at ~Ns per item: ~N minutes
/judge-prompt — Upstream if building labels for judge calibration/validate-evaluator — Downstream consumer of exported human labels/error-analysis — Upstream if trace review is needed for failure diagnosis| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→pass | 38,767 | 35,714 | -8% | 1 | 1 | 0% | 8,216 | 9,794 | +19% | 0 | 0 | — |
case-02 | fail→fail | 37,476 | 35,930 | -4% | 1 | 1 | 0% | 8,244 | 9,784 | +19% | 0 | 0 | — |
case-03 | fail→fail | 29,159 | 27,060 | -7% | 1 | 1 | 0% | 6,578 | 7,804 | +19% | 0 | 0 | — |
case-04 | pass→pass | 19,943 | 24,952 | +25% | 1 | 1 | 0% | 4,085 | 6,923 | +69% | 0 | 0 | — |
case-05 | pass→pass | 15,959 | 16,705 | +5% | 1 | 1 | 0% | 3,291 | 5,100 | +55% | 0 | 0 | — |
case-11 | fail→pass | 20,046 | 8,521 | -57% | 1 | 1 | 0% | 4,146 | 3,048 | -26% | 0 | 0 | — |
case-06 | pass→fail | 24,822 | 17,804 | -28% | 1 | 1 | 0% | 4,176 | 5,297 | +27% | 0 | 0 | — |
case-07 | pass→pass | 15,944 | 22,741 | +43% | 1 | 1 | 0% | 3,346 | 5,471 | +64% | 0 | 0 | — |
case-08 | pass→pass | 21,897 | 41,826 | +91% | 1 | 1 | 0% | 4,388 | 8,795 | +100% | 0 | 0 | — |
case-09 | fail→fail | 15,604 | 35,069 | +125% | 1 | 1 | 0% | 3,009 | 9,482 | +215% | 0 | 0 | — |
case-10 | pass→pass | 33,930 | 6,456 | -81% | 1 | 1 | 0% | 8,242 | 2,517 | -69% | 0 | 0 | — |
case-12 | fail→pass | 20,426 | 13,045 | -36% | 1 | 1 | 0% | 4,223 | 4,077 | -3% | 0 | 0 | — |
case-13 | pass→pass | 16,901 | 10,506 | -38% | 1 | 1 | 0% | 2,467 | 3,518 | +43% | 0 | 0 | — |
case-14 | pass→pass | 16,474 | 31,284 | +90% | 1 | 1 | 0% | 2,400 | 8,842 | +268% | 0 | 0 | — |
case-15 | fail→pass | 9,541 | 7,952 | -17% | 1 | 1 | 0% | 1,767 | 2,673 | +51% | 0 | 0 | — |
case-16 | fail→pass | 12,106 | 8,550 | -29% | 1 | 1 | 0% | 1,776 | 2,773 | +56% | 0 | 0 | — |
case-17 | pass→pass | 21,373 | 9,899 | -54% | 1 | 1 | 0% | 4,333 | 2,994 | -31% | 0 | 0 | — |
case-18 | fail→pass | 38,852 | 11,660 | -70% | 1 | 1 | 0% | 8,234 | 3,579 | -57% | 0 | 0 | — |
case-19 | pass→pass | 19,891 | 6,143 | -69% | 1 | 1 | 0% | 2,989 | 2,676 | -10% | 0 | 0 | — |
case-20 | pass→pass | 10,029 | 7,627 | -24% | 1 | 1 | 0% | 1,737 | 2,920 | +68% | 0 | 0 | — |
case-21 | pass→pass | 12,685 | 7,751 | -39% | 1 | 1 | 0% | 2,683 | 3,081 | +15% | 0 | 0 | — |
case-22 | fail→fail | 13,087 | 10,415 | -20% | 1 | 1 | 0% | 2,318 | 3,369 | +45% | 0 | 0 | — |
case-23 | fail→pass | 22,282 | 14,536 | -35% | 1 | 1 | 0% | 3,595 | 4,090 | +14% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 23 cases were attempted. The headline lift of +26 percentage points is the difference between those two pass rates over the 23 comparable cases. 1 case got worse with the skill loaded, and it is included in that figure.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.