Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Review Clojure and ClojureScript code changes for compliance with Metabase coding standards, style violations, and code quality issues. Use when reviewing pull requests or diffs containing Clojure/ClojureScript code.
.claude/skills/microck-clojure-review/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | 99% | 0% |
| case-02 | ✗→✓ | ▲ Improved | 63% | 0% |
| case-06 | ✗→✓ | ▲ Improved | 40% | 0% |
| case-08 | ✗→✓ | ▲ Improved | 0% | 0% |
| case-10 | ✗→✓ | ▲ Improved | 104% | 0% |
@./../_shared/clojure-style-guide.md @./../_shared/clojure-commands.md
What to flag:
CLOJURE_STYLE_GUIDE.adoc exists in the working directory, also check compliance with the community Clojure style guideWhat NOT to post:
Example bad code review comments to avoid:
> This TODO comment is properly formatted with author and date - nice work!
> Good addition of limit 1 to the query - this makes the test more efficient without changing its behavior.
> The kondo ignore comment is appropriately placed here
> Test name properly ends with -test as required by the style guide.
Special cases:
Use this to scan through changes efficiently:
tbl, zs')kebab-case for all variables and functions!src or enterprise/backend/src have useful docstrings[[other-var]] not backticksTODO comments include author and date: ;; TODO (Name 1/1/25) -- description^:private unless used elsewheredeclare when avoidable (public functions near end)let/cond)deftest forms for distinct test cases^:parallel-test or -test-<number>metabase.<module>.*, EE: metabase-enterprise.<module>.*)<module>.api namespaces<module>.core with Potemkin:clj-kondo/ignore [:metabase/modules]:- <schema>)snake_case/api/dashboard/:id)GET has no side effects (except analytics)lib, lib-be, or query-processor modulest2/select-one-fn instead of selecting full rows for one columndocs/developers-guide/driver-changelog.mddriver argument to other driver methods (no hardcoded driver names)read-column-thunk#_:clj-kondo/ignore keyword form)Quick scan for common issues:
| Pattern | Issue | | -------------------------------------------- | ----------------------------------------------------------- | | calculate-age, get-user | Pure functions should be nouns: age, user | | update-db, save-model | Missing ! for side effects: update-db!, save-model! | | snake_case_var | Should use kebab-case | | Public var without docstring | Add docstring explaining purpose | | ;; TODO fix this | Missing author/date: ;; TODO (Name 1/1/25) -- description | | (defn foo ...) in namespace used elsewhere | Should be (defn ^:private foo ...) | | Function > 20 lines | Consider breaking up into smaller functions | | /api/dashboards/:id | Use singular: /api/dashboard/:id | | Query params with snake_case | Use kebab-case for query params | | New API endpoint without tests | Add tests for the endpoint |
For style violations:
> This pure function should be named as a noun describing its return value. Consider user instead of get-user.
For missing documentation:
> This public var needs a docstring explaining its purpose, inputs, and outputs.
For organization issues:
> This function is only used in this namespace, so it should be marked ^:private.
For API conventions:
> Query parameters should use kebab-case. Change user_id to user-id.
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→pass | 7,051 | 6,208 | -12% | 1 | 1 | 0% | 1,218 | 2,420 | +99% | 0 | 0 | — |
case-02 | fail→pass | 7,551 | 3,620 | -52% | 1 | 1 | 0% | 1,156 | 1,880 | +63% | 0 | 0 | — |
case-03 | pass→pass | 12,909 | 3,087 | -76% | 1 | 1 | 0% | 2,145 | 1,841 | -14% | 0 | 0 | — |
case-04 | pass→pass | 10,179 | 2,300 | -77% | 1 | 1 | 0% | 1,710 | 1,640 | -4% | 0 | 0 | — |
case-05 | pass→pass | 8,312 | 2,505 | -70% | 1 | 1 | 0% | 1,473 | 1,761 | +20% | 0 | 0 | — |
case-06 | fail→pass | 7,617 | 2,271 | -70% | 1 | 1 | 0% | 1,161 | 1,620 | +40% | 0 | 0 | — |
case-07 | pass→fail | 8,417 | 2,259 | -73% | 1 | 1 | 0% | 1,276 | 1,718 | +35% | 0 | 0 | — |
case-08 | fail→pass | 9,593 | 2,586 | -73% | 1 | 1 | 0% | 1,646 | 1,647 | +0% | 0 | 0 | — |
case-09 | pass→pass | 3,903 | 2,238 | -43% | 1 | 1 | 0% | 687 | 1,700 | +147% | 0 | 0 | — |
case-10 | fail→pass | 4,649 | 1,304 | -72% | 1 | 1 | 0% | 732 | 1,491 | +104% | 0 | 0 | — |
case-11 | pass→pass | 6,704 | 3,941 | -41% | 1 | 1 | 0% | 1,211 | 1,956 | +62% | 0 | 0 | — |
case-12 | pass→pass | 9,642 | 4,311 | -55% | 1 | 1 | 0% | 1,639 | 1,932 | +18% | 0 | 0 | — |
case-13 | fail→pass | 10,985 | 2,196 | -80% | 1 | 1 | 0% | 1,681 | 1,626 | -3% | 0 | 0 | — |
case-14 | fail→pass | 14,545 | 3,925 | -73% | 1 | 1 | 0% | 2,245 | 1,970 | -12% | 0 | 0 | — |
case-15 | pass→pass | 5,523 | 2,711 | -51% | 1 | 1 | 0% | 916 | 1,739 | +90% | 0 | 0 | — |
case-16 | pass→pass | 12,060 | 5,221 | -57% | 1 | 1 | 0% | 2,058 | 2,194 | +7% | 0 | 0 | — |
case-17 | fail→pass | 9,949 | 5,355 | -46% | 1 | 1 | 0% | 1,736 | 2,231 | +29% | 0 | 0 | — |
case-18 | pass→pass | 10,616 | 3,837 | -64% | 1 | 1 | 0% | 1,816 | 2,014 | +11% | 0 | 0 | — |
case-19 | pass→pass | 5,043 | 3,371 | -33% | 1 | 1 | 0% | 873 | 1,821 | +109% | 0 | 0 | — |
case-20 | pass→pass | 9,190 | 5,560 | -39% | 1 | 1 | 0% | 1,604 | 2,250 | +40% | 0 | 0 | — |
case-21 | pass→pass | 2,656 | 5,063 | +91% | 1 | 1 | 0% | 516 | 2,172 | +321% | 0 | 0 | — |
case-22 | pass→pass | 7,630 | 4,001 | -48% | 1 | 1 | 0% | 1,357 | 1,985 | +46% | 0 | 0 | — |
case-23 | pass→pass | 7,778 | 4,477 | -42% | 1 | 1 | 0% | 1,386 | 2,096 | +51% | 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 +30 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.