Datasets · Multi-label classification
JS/TS Code Review Decisions
12,000 JavaScript and TypeScript snippets labeled for 10 code review flaws. A 13-question benchmark scores small models on the test split.
import { z } from 'zod';const bankAccountSchema = z.object({routingNumber: z.string().regex(/^\d{9}$/),accountSuffix: z.string().regex(/^\d{4}$/)});export type PayrollBankAccount = z.infer<typeof bankAccountSchema>;export function decodeBankAccount(serialized: string): PayrollBankAccount {const account_payload = JSON.parse(serialized);return account_payload;}
d1-3BP(yes) · one pass
- Unclear naming0.00
- Noise comments0.00
- Dead code0.03
- Inconsistent style0.99
- Over-abstraction0.00
- Too clever0.00
- Duplicated logic0.00
- Error handling0.01
- Type safety hole0.01
- Unsafe input0.99
Primary flawunsafe_input0.98
Overview
The dataset has training data and a benchmark for small models that review JavaScript and TypeScript code. Each of 3,000 coding tasks was written four times, once clean and three times with planted flaws. The decisions config turns each snippet into 13 questions, and the model returns a probability for each answer.
- Snippets
- 12,000
- Line-level findings
- 27,450
- Questions per snippet
- 13
- Best macro F1
- 0.917
- Task
- Multi-label classification
- Splits
- train 9,600 · val 1,200 · test 1,200
- Format
- Parquet · 12.9 MB
- Published
- Downloads
- 200 all time
Benchmark
Each model was fine-tuned on the same 9,600 training snippets. The dataset’s score_decisions.py scored it on the 1,200-snippet test split, and each request held all 13 questions. All four variants of a task are in the same split, and no test task appears in training.
Higher is better. The mean F1 over the 10 flaw questions at a 0.5 cutoff. It is the primary metric.
- d1-3B on Hugging Face (opens in a new tab)3.1B · LFM2.5-VL-3B with Liquid AI’s d1 decision readout0.917
- d1-omni-600M on Hugging Face (opens in a new tab)587M · LFM2.5 encoder with a decision head0.771
- GLiNER2.5-Decide on Hugging Face (opens in a new tab)486M · GLiNER2 DeBERTa-v3 encoder with a classification head0.687
- TF-IDF + logistic regressionBaseline fitted on the train split0.502
- NanoJev on Hugging Face (opens in a new tab)596M · Qwen3-0.6B with a choice head0.452
- UniformGives every option the same probability0.237
- PriorPredicts the train label frequencies and ignores the input0.000
- Fine-tuned on train
- Baseline
- Reference
Fine-tuning
Macro F1 for each base model before training and after one pass over the 9,600 training snippets.
- d1-3BZero-shot 0.220fine-tuned 0.917
- d1-omni-600MZero-shot 0.175fine-tuned 0.771
- GLiNER2.5-DecideZero-shot 0.071fine-tuned 0.687
- NanoJevZero-shot 0.237fine-tuned 0.452
- Base model, zero-shot
- Fine-tuned
Scores by question
Every model scores above 0.91 on naming and comments. NanoJev scores 0 on over-abstraction and duplicated logic. The other three differ most on dead code, inconsistent style, and unsafe input.
| Question | d1-3B3.1B | d1-omni-600M587M | GLiNER2.5-Decide486M | NanoJev596M |
|---|---|---|---|---|
| Unclear namingF1 · 139 positives | 0.964 | 0.917 | 0.926 | 0.933 |
| Noise commentsF1 · 178 positives | 0.997 | 0.997 | 0.962 | 0.992 |
| Dead codeF1 · 223 positives | 0.886 | 0.632 | 0.432 | 0.414 |
| Inconsistent styleF1 · 147 positives | 0.903 | 0.538 | 0.478 | 0.428 |
| Over-abstractionF1 · 145 positives | 0.952 | 0.855 | 0.831 | 0.000 |
| Too cleverF1 · 164 positives | 0.929 | 0.854 | 0.657 | 0.185 |
| Duplicated logicF1 · 171 positives | 0.867 | 0.720 | 0.634 | 0.000 |
| Error handlingF1 · 140 positives | 0.946 | 0.905 | 0.780 | 0.792 |
| Type safety holeF1 · 148 positives | 0.879 | 0.742 | 0.670 | 0.527 |
| Unsafe inputF1 · 165 positives | 0.845 | 0.546 | 0.496 | 0.252 |
| Has any flawF1 · 900 positives | 0.963 | 0.879 | 0.860 | 0.857 |
| Primary flawAccuracy · choice | 0.812 | 0.642 | 0.593 | 0.491 |
| QualityAccuracy · score | 0.684 | 0.529 | 0.529 | 0.446 |
Macro F1 against CPU time
On 16 CPU cores, the fine-tuned models take 6 to 18 seconds per snippet and TF-IDF takes 1.2 ms. On one H100, d1-3B takes 30.5 ms, d1-omni-600M 41.2 ms, and NanoJev 115.4 ms.
| Model | 16 Neoverse V3 cores | GPU |
|---|---|---|
| d1-3B | 8.9 s | 30.5 ms on one H100 SXM |
| d1-omni-600M | 6.3 s | 41.2 ms on one H100 SXM |
| GLiNER2.5-Decide | 6.0 s | 107.7 ms on one RTX PRO 6000 |
| NanoJev | 18.2 s | 115.4 ms on one H100 SXM |
| TF-IDF + logistic regression | 1.2 ms | — |
Snippets
The 12,000 snippets come from 3,000 tasks across 40 domains and 13 code contexts. The packaging script fails if a task appears in two splits or two snippets are identical.
Flaws
Each bar counts the snippets with that flaw, out of 12,000. A snippet can have more than one flaw.
Quality
Quality runs from 1 (should not merge) to 5 (exemplary). Every clean variant scores 4 or 5.
- 1,2501: Should not merge, 0 clean
- 3,1182: Needs significant changes, 0 clean
- 3,6123: Mergeable with review comments, 0 clean
- 1,1004: Mergeable with minor comments, 80 clean
- 2,9205: Exemplary, 2,920 clean
Languages
Each bar is a share of all 12,000 snippets.
Difficulty
Example row
This training row has two findings. Each finding has a line range, an explanation, and the auditor’s verdict. Hover over a finding to highlight its lines.
const { CartLineItem, ProductVariant } = require('../models');const cartReaders = {active: async (cartId) => await CartLineItem.findAll({where: { cartId, active: true },attributes: ['id', 'variantId', 'quantity', 'unitPrice'],include: [{ model: ProductVariant, as: 'variant', required: true, attributes: ['id', 'sku', 'color', 'size'] }],order: [['id', 'ASC']]})};const selectCartReader = (mode) => cartReaders[mode];async function fetchActiveCartItems(cartId = Number(process.env.CART_ID)) {return await selectCartReader('active')(cartId);}module.exports = { fetchActiveCartItems };
TaskQuery the relational database to fetch active cart line items and join product variant attributes
Over-abstractionLines 2-12
The reader registry and mode selector implement only one strategy, and the sole call always selects ‘active’, so put the query directly in fetchActiveCartItems rather than routing through a single-case dispatch layer.
Unsafe inputLine 11
The environment-derived cart ID reaches the database query after numeric conversion alone, which does not validate an identifier and can produce NaN or turn empty input into zero.
How it was made
Three rounds
Language models wrote the snippets against a fixed set of tasks and flaw definitions, in three rounds of 1,000 tasks.
Blind review
Model reviewers read the code without seeing the planned labels, recorded findings, and sent failed examples back for repair and another review.
Small edits
In rounds 2 and 3, each flawed variant is a small edit of the clean variant of its task.
Audit
A separate model audited all 27,450 findings. It accepted 26,984 (98.3%) and challenged 466. Each finding records the verdict.
Limitations
- Models set and audited the gold labels. No person reviewed them.
- Clean snippets are a fixed 25% of the data.
- Any comment other than a tool directive or commented-out code sets
noise_comments. - Validation checked syntax and annotation consistency. No snippet was executed or type-checked.
- There was no check for near-duplicates across tasks or for overlap with public benchmarks.
Load the dataset
The splits are Parquet files on Hugging Face, released under CC BY 4.0.
from datasets import load_dataset
import json
snippets = load_dataset("yannelli/js-ts-code-review-decisions", "default")
example = snippets["train"][0]
print(example["code"])
print(example["findings"])
decisions = load_dataset("yannelli/js-ts-code-review-decisions", "decisions", split="test")
row = decisions[0]
state, questions, gold = (json.loads(row[k]) for k in ("state", "questions", "gold"))Fields
codestring- The snippet, used as model input.
descriptionstring- One-sentence task description all 4 variants implement.
langstringjs,jsx,ts, ortsx.unclear_naming … unsafe_input10 × bool- One Boolean per flaw. True when the snippet has a finding with that flag.
primary_flawstring- The most important flag, or
nonefor the clean variant. qualityint64- Mergeability from 1 (should not merge) to 5 (exemplary).
difficultystringobvious,subtle, orborderline.findingslist<struct>- Line-level annotations. Each has a flag, start and end lines, an excerpt, an explanation, and an audit verdict.
task_slugstring- Shared by the 4 variants of a task.
state · questions · goldJSON- In the
decisionsconfig, the request body for a System One API and the gold answers.
@misc{yannelli2026jstscodereviewdecisions,
title = {JS/TS Code Review Decisions},
author = {Ryan Yannelli},
year = {2026},
publisher = {Hugging Face},
howpublished = {\url{https://huggingface.co/datasets/yannelli/js-ts-code-review-decisions}}
}Models
- Safetensors3.1Bd1-3B Code Review DecisionsLFM2.5-VL-3B with a decision readout. It has the highest macro F1 (0.917) and accuracy (0.940) of the four and takes 30.5 ms per snippet on one H100. (opens Hugging Face in a new tab)
- Safetensors587Md1-omni-600M Code Review DecisionsAn LFM2.5 encoder with a decision head. Macro F1 is 0.771, and it takes 41.2 ms per snippet on one H100. (opens Hugging Face in a new tab)
- Safetensors486MGLiNER2.5-Decide Code Review DecisionsA DeBERTa-v3 encoder with a classification head, released under Apache 2.0. Macro F1 is 0.687. (opens Hugging Face in a new tab)
- Safetensors596MNanoJev Code Review DecisionsQwen3-0.6B with a choice head. Macro F1 is 0.452, and it flagged all 300 clean test snippets. (opens Hugging Face in a new tab)
- GGUFCode Review Decisions GGUFllama.cpp builds of d1-3B (BF16, Q8_0, Q4_K_M) and d1-omni-600M (F16, Q8_0). Q8_0 scores the same as PyTorch. Q4_K_M loses 0.004 macro F1. (opens Hugging Face in a new tab)
- GGUF3.1Bd1-3B Code Review Decisions for OllamaThe d1-3B weights packaged for Ollama. A terminal UI shows the probability of each flaw. (opens Hugging Face in a new tab)
More datasets
All datasetsCLI Command Risk
124,923 shell commands in five shells, labeled from safe to critical with risk categories, for classifiers that check a command before a terminal or coding agent runs it.
124,923 rowsCC BY 4.048 downloads
View datasetLaravel 11 QA Legacy
12,649 question and answer pairs generated from the official Laravel 11 documentation, for fine-tuning and evaluating small models on Laravel.
12,649 rowsMIT1,248 downloads
View datasetLaravel 11 QA Long Form Legacy
1,453 Laravel 11 questions with long, step-by-step answers, generated from the official documentation.
1,453 rowsMIT747 downloads
View dataset