Honest numbers

What actually got tested, what broke, and what got fixed. No rounding up.

28
historical bugs fixed
55
real and real-based datasets tested
109
automated tests, all passing
55/55
final dataset gates passed
FINAL LAUNCH GATE
  • 55 of 55 historical dataset gates passed with exact record counts, explicit limits, or safe rejection
  • CLI median: 117ms; p95: 705ms; slowest: 2.49s for a 1,559-column CSV
  • Regression preflight verified CSV, COCO, YOLO detection, segmentation, pose, OBB, Pascal VOC, LabelMe, single-page TIFF, folder layouts, and rejection flows
  • 15 of 15 boundary and concurrency checks passed, including JSONL line validation, 200,000 rows, and eight simultaneous 100,000-row analyses
PERFORMANCE, MEASURED NOT ASSUMED
  • Live production, 5,000 requests at concurrency 100: 100% succeeded at 1,552 requests/second
  • Live homepage latency: p50 40ms, p95 74ms, p99 860ms
  • Compare, Honest Numbers, and Docs each handled another 1,000 requests at concurrency 50 without failure
  • Vercel serves Brotli-compressed assets from an immutable CDN cache
  • labelyst.com permanently redirects to the canonical www.labelyst.com deployment
WHAT THE FINAL GATE PROVES
  • Record fidelity held from 8-shape LabelMe files through a 145,411-annotation labels-only archive
  • Single-page TIFF pixels and oriented boxes receive full checks; specialist image formats and semantic masks without a class schema remain disclosed and capped
  • JSONL and NDJSON have exact line errors; conservative class folders and paired image/mask layouts work without a manifest
  • This is a broad launch gate, not proof that every future dataset dialect is supported
EVERY FIXED BUG, IN ORDER
#1Duplicate detection scored every normal dataset as broken
Flagged repeated correct labels as duplicates. A perfectly clean 217-row dataset scored 0/100. Fixed: only flags actual spelling inconsistency.
#2Bounding box detection missed the most common real-world format
Only recognized x/y/width/height. Most real exports use xmin/ymin/xmax/ymax. Fixed: corner format detected first.
#3Label column detection missed unconventional column names
A real dataset's "cell_type" column fell back to "filename," turning 4,888 rows into fake per-image classes. Fixed: broader detection with a lowest-cardinality fallback.
#4Taxonomy suggestions had no output cap
The bug 3 failure alone produced 65,967 near-meaningless matches in one run. Fixed: capped and explained instead of dumped.
#5Exact duplicate annotation rows were invisible
Same image, same label, same box, submitted twice, a real data-entry error, went undetected once bug 1 stopped flagging spelling matches.
#6Duplicate-row check produced false positives without an image column
A clean 12,000-row synthetic file scored 0/100 because different rows shared coordinates with no filename to distinguish them.
#7x1/y1/x2/y2 corner format wasn't recognized
A common naming convention alongside xmin/ymin/xmax/ymax. Bbox checks silently didn't run at all on files using it.
#8Spreadsheet formula injection passed through unescaped
A label like =SUM(1+1) survived into the exported CSV untouched. Opened in Excel, it could execute as a formula. Fixed: flagged and sanitized on export.
#9Mixed line endings silently dropped rows
A file mixing \r\n and \n lost more than half its rows with no error shown. Fixed: line endings normalized before parsing.
#10Taxonomy clustering was 4x+ slower than benchmarked in a real worst case
Same-length labels defeat the length-based pruning. Cap tightened from 500 to 300 with a confirmed safety margin.
#11Cleaned exports dropped valid repeated annotations
The exporter kept only the first row for each class. A dataset with 5,000 valid car annotations could export one row. Fixed: only empty-label and exact duplicate annotations are removed.
#12Duplicate keys could collide on separator characters
Filenames and labels containing a pipe character could produce the same internal key. Fixed: annotation identity now uses structured values instead of joined text.
#13Nested YOLO files could overwrite each other's identity
Train and validation annotations with the same basename both became one image ID. Fixed: subset paths are preserved through analysis and cleanup.
#14An entirely unlabeled dataset scored Good
Checks with nothing to evaluate still contributed perfect points. Fixed: a dataset with no valid labels now scores 0 and Poor.
#15YOLO segmentation rows were silently read as boxes
Polygon coordinates were truncated to the first five values. Fixed: polygons are detected separately and their point structure and normalized bounds are validated.
#16ZIP limits only measured compressed size
A small archive could expand far beyond the upload limit. Fixed: archives are capped at 5,000 files and 200MB after decompression.
#17Valid one-column CSV files were rejected
A parser delimiter warning was treated like malformed structure. Fixed: harmless delimiter warnings no longer reject label-only files.
#18Compare could select a constant metadata column
A review-status field could beat the real label field during inference. Fixed: semantic hints improved and both comparison inputs now expose a label-column selector.
#19Cleanup could promote an outlier spelling
Equal-length variants were resolved by input order. Fixed: the most frequent spelling becomes canonical and class balance groups spelling variants correctly.
#20Sparse YOLO class maps produced blank labels
Missing numeric class entries became empty strings. Fixed: undefined entries receive readable class_N labels.
#21BOM-prefixed JSON failed to parse
A valid UTF-8 marker at the beginning of a JSON file caused a syntax failure. Fixed: the marker is removed before parsing.
#22Headerless CSV lost its first record
The parser assumed every first row was a header. Fixed: clear headerless data is preserved, and ambiguous files require confirmation before scoring.
#23Documentation text became YOLO annotations
README and license text could be read as labels. Fixed: YOLO discovery is restricted to labels directories or strictly validated numeric files backed by metadata.
#24Pose and oriented boxes became polygons
Every YOLO row longer than five values was called segmentation. Fixed: metadata and archive structure distinguish pose, OBB, segmentation, and detection.
#25TIFF images disappeared from high-scoring reports
TIFF files were excluded from media inventory. Fixed: they are counted, disclosed as not pixel-decoded, and force limited coverage.
#26Labels-only archives could score 100
Missing media was ignored when an archive contained zero images. Fixed: every orphan annotation is an integrity error and partial reports are capped at 60.
#27Empty COCO segmentation arrays became polygons
An empty array was treated as a real mask. Fixed: only valid non-empty polygons or RLE objects are segmentation.
#28Pose archives without metadata were rejected
A valid YOLO pose export omitted data.yaml, so its 21 annotations were rejected. Fixed: pose rows are inferred conservatively from keypoint visibility triplets.
KNOWN, DISCLOSED, NOT HIDDEN

Two transitive dependencies (not this project's own code) carry high-severity advisories. Checked what they actually affect: one is Next.js's image-optimization library, and this app never uses that feature, so the vulnerable code path never runs. The other is a build-time-only concern, not something a visitor can trigger. Fixing both means a major framework version bump that hasn't been tested against this codebase, so it was left alone rather than force-upgraded untested.

Full detail, including the test suite itself, lives in the project README on GitHub.