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

criteria.jsonevals/scenario-5/

{
  "context": "Checks whether the agent refactors a Java-style value class (manual equals/hashCode/toString, Java-bean accessors, var properties) into the idiomatic Kotlin shape: data class, val properties, no manual override of standard object methods, no bean accessors. Field order must be preserved so positional construction at call sites still compiles.",
  "type": "weighted_checklist",
  "checklist": [
    {
      "name": "Declared as data class",
      "description": "The output declares `data class Subscription(...)` with a primary constructor — not a regular `class Subscription { ... }`",
      "max_score": 25
    },
    {
      "name": "Properties use val",
      "description": "Every property in the primary constructor uses `val` (not `var`). The output has no `var` declarations on the Subscription type",
      "max_score": 15
    },
    {
      "name": "No manual equals/hashCode/toString",
      "description": "The output contains no `override fun equals(...)`, `override fun hashCode()`, or `override fun toString()` — the compiler generates them for data classes",
      "max_score": 20
    },
    {
      "name": "No Java-bean accessors",
      "description": "The output contains no `fun getX(...)`, `fun setX(...)`, or `fun isX(...)` method declarations. Property access uses Kotlin's auto-generated accessors instead",
      "max_score": 15
    },
    {
      "name": "Field order preserved",
      "description": "The primary constructor parameters appear in this exact order: subscriptionId, planCode, status, billingPeriodMonths, autoRenew, createdAtEpochMillis, renewsAtEpochMillis. This preserves componentN() destructuring for any callers that relied on it",
      "max_score": 15
    },
    {
      "name": "All seven fields retained",
      "description": "All seven fields from the original class are present in the new data class — none accidentally dropped during refactor",
      "max_score": 10
    }
  ]
}

evals

README.md

tile.json