codereason.org Research · SATD in Rails

Self-Admitted Technical Debt · Ruby on Rails

Where Rails hides its technical debt

The SATD literature built on Java says developers write TODO, FIXME, HACK to flag debt. Rails developers don’t. Across 1.55 million lines of Ruby in five major projects, over half of acknowledged technical debt takes a different form — rubocop:disable — a category absent from every SATD taxonomy published so far.

1,546,031
lines of Ruby
5
projects
907
raw comments
400
read by hand
361
validated SATD
DecidimDiscourseSolidusSpreeMastodon

How this was made

From 1.55 million lines of Ruby to a typology

  1. 1
    1,546,031 lines · 5 projects

    Every .rb file in the repositories of Decidim, Discourse, Solidus, Spree, and Mastodon, scanned for ten SATD keywords – TODO, FIXME, HACK, rubocop:disable, and six more.

  2. 2
    907 raw comments extracted

    Keyword matching produces noise – the word “review” appears in feature names, rubocop:disable hides inside test fixtures. A stratified sample of 400 comments was read by hand to measure per-keyword false-positive rates.

  3. 3
    775 / 398 validated · Scenario A / B

    False-positive rates are projected back onto the full dataset. Results are reported twice – once including rubocop:disable as formalized SATD, once excluding it – because the literature disagrees on whether linter suppressions count as debt.

Snapshot

Data was extracted in March 2026 from the default branch of each repository – no feature branches, forks, or tags. Every GitHub link in the browser below is pinned to the exact commit analyzed on that date, so lines and files stay frozen in time.

Reproducibility

The scripts, raw 907-comment dataset, the 400-comment validated sample, and per-module statistics are all archived on Zenodo under a permanent DOI. Any number on this page can be reproduced from that archive.

The scenario story

Projects diverge when rubocop:disable leaves the table

View

Decidim’s corrected density drops from 0.59 to 0.04 when linter suppressions are excluded – 91% of its formalized debt lives in rubocop:disable. Mastodon stays high. Flip the toggle to see it.

Corrected SATD density per KLOC across the five studied projects, under both reporting scenarios. Italic = modular project, bold = monolithic. Architecture in the label, not in color.

Explore the dataset

400 comments, read by hand

The keyword scan returned 907 candidate comments across five projects. 400 of them – a stratified sample covering every keyword and every project – were then read and classified manually. Those 400 are the ones you can browse below. Filter, search, and click through to the exact line on GitHub.

Showing 361 validated SATD comments

Cite & use

Everything is reproducible

The full peer-reviewed paper is published in American Impact Review. The dataset (907 raw SATD comments, 400 manually classified), all Python analysis scripts, and the per-module statistics live on Zenodo under a permanent DOI. Any number shown here comes directly from that archive – no post-hoc adjustments.

Anna Topalidi · ORCID · codereason.org

chat with anna

> introduce yourself

no account needed. leave a name and, if you like, a way to reach you back.

// conversation started
say hi – i read every message. replies aren't instant.

replies can take a while – this isn't live support.

enter to send · shift+enter for a newline

// no cookies, no tracking – privacy