CtrlK
BlogDocsLog inGet started
Tessl Logo

jbaruch/kotlin-tutor

Teaches AI agents to write idiomatic Kotlin instead of Java-in-a-.kt-file.

98

1.20x
Quality

98%

Does it follow best practices?

Impact

99%

1.20x

Average score across 8 eval scenarios

SecuritybySnyk

Passed

No known issues

Overview
Quality
Evals
Security
Files

Evaluation results

100%

24%

Calculator Test Migration

JUnit assertion mapping to Kotest equivalents

Criteria
Without context
With context

assertEquals order

100%

100%

withClue for message

0%

100%

shouldThrow

100%

100%

shouldBeTrue

50%

100%

shouldBeFalse

50%

100%

shouldBeNull

100%

100%

shouldNotBeNull

100%

100%

JUnit imports removed

100%

100%

Kotest imports added

100%

100%

Imports sorted

100%

100%

94%

Test Suite Modernisation and Verification

File discovery, conversion, and verification script gate

Criteria
Without context
With context

Both files converted

100%

100%

Kotest assertions used

100%

100%

No JUnit imports remain

100%

100%

Verify script executed

100%

100%

Script exit code documented

100%

100%

File list in report

100%

100%

Files found via glob

40%

40%

No commit performed

100%

100%

100%

29%

Test Suite Migration for Core Utilities

Spec style selection and lifecycle hook migration

Criteria
Without context
With context

StringSpec for flat tests

0%

100%

BehaviorSpec for given/when/then

100%

100%

Tests in string blocks

50%

100%

beforeEach block used

100%

100%

Setup code preserved

100%

100%

Correct class declaration

66%

100%

Kotest spec import present

70%

100%

JUnit annotations removed

100%

100%

100%

User Repository API Modernisation

Optional API cleanup: Kotlin repository returning Optional<T> and using orElse/ifPresent/map/orElseThrow → idiomatic Kotlin nullable types with safe-call, elvis, and let. Caller code must be updated alongside.

Criteria
Without context
With context

No java.util.Optional import

100%

100%

findById returns User?

100%

100%

findByEmail returns User?

100%

100%

displayNameFor uses elvis

100%

100%

sendWelcome uses ?.let

100%

100%

requireById uses elvis throw

100%

100%

Optional.map replaced with ?.let

100%

100%

UserService caller updated

100%

100%

No !! introduced

100%

100%

100%

Subscription Model Modernisation

POJO refactor: Java-style class with manual equals/hashCode/toString and bean accessors → idiomatic Kotlin value type

Criteria
Without context
With context

Declared as data class

100%

100%

Properties use val

100%

100%

No manual equals/hashCode/toString

100%

100%

No Java-bean accessors

100%

100%

Field order preserved

100%

100%

All seven fields retained

100%

100%

100%

Todo App

Implement a small todo-list application with addTask and markComplete operations.

Criteria
Without context
With context

addTask works

100%

100%

markComplete works

100%

100%

100%

Todo App

Implement a small todo-list application with addTask and markComplete operations.

Criteria
Without context
With context

addTask works

100%

100%

markComplete works

100%

100%

100%

81%

Todo App

Implement a small todo-list application with addTask and markComplete operations.

Criteria
Without context
With context

Written in Kotlin

0%

100%

Task is a data class

0%

100%

Properties default to val

0%

100%

Nullable types use ?

0%

100%

No manual equals/hashCode/toString

50%

100%

addTask works

70%

100%

markComplete works

70%

100%

Evaluated
Agent
Claude
Model
Claude Sonnet 4.6

Table of Contents