← SkillSafe / Clj Desk

Your namespace, read the way the reviewer at the next desk reads it

Paste your .clj — and the _test.clj beside it if you have one. The browser reads both for free: it parses the file with a real Clojure reader, names the delimiter that never closed, inventories every definition with its arglists and docstring, and counts the mutable decisions in each function. Then pick a lane.

Both examples ship with a saved result for every lane, so you can see a whole lane — findings, tables, rewritten docstrings, schemas and killing tests — without signing in and without spending a credit.

nothing pasted yet
Drag files in, or or a whole source folder Everything is read in your browser. Nothing uploads until you run a lane.
Style review  

What the free reader does, before any model runs

It actually reads Clojure

Its own tokenizer and form reader, not a regex. A string full of closing parens, a \( character literal, a #"\)+" regex, a #_ discard, a #?(:clj ...) reader conditional, a #:ns{} map — each is read as what it is, which is why the delimiter count can be trusted.

The delimiter that went missing

When a file does not balance, the compiler reports the end of the file. The reader reports the line and column of the opener that was never closed, and whether a ) is closing something that was opened with a [.

The ns form, resolved

Every require with its alias; a :refer :all that makes every unqualified symbol ambiguous; a libspec declared twice, where the later one silently wins; a deprecated :use; and every alias declared in the ns form that nothing in the pasted code uses.

The mutation surface, counted

Every branch, comparison, arithmetic operator and literal in each function — the exact set a mutation runner would rewrite. Beside it, which functions the pasted test namespace never names. A function with twenty-seven generatable mutants and no test is not a feeling; it is a number.