CtrlK
BlogDocsLog inGet started
Tessl Logo

aopab/jscad-codegen

Generate, validate, and render JSCAD v2 CAD scripts from natural language prompts

94

1.64x
Quality

94%

Does it follow best practices?

Impact

97%

1.64x

Average score across 3 eval scenarios

SecuritybySnyk

Passed

No known issues

Overview
Quality
Evals
Security
Files

criteria.jsonevals/scenario-3/

{
  "context": "Tests whether the agent decomposes the model into independently named feature constants, uses hull() of spheres for the organic handle shape, avoids excessive boolean nesting, and writes a pure function with no imports.",
  "type": "weighted_checklist",
  "checklist": [
    {
      "name": "Named feature constants",
      "description": "The body, handle, and base (or equivalent features) are each assigned to separate named const variables — not built inline inside a single return expression",
      "max_score": 12
    },
    {
      "name": "hull for handle",
      "description": "The handle is built using hulls.hull() or hulls.hullChain() of sphere or cylinder primitives — not as a torus or a boolean combination of primitives",
      "max_score": 15
    },
    {
      "name": "Boolean nesting depth",
      "description": "No boolean call (subtract, union, intersect) is nested more than 2 levels deep — e.g. subtract(union(a,b), subtract(c,d)) is 2 levels and acceptable, but further nesting is not",
      "max_score": 10
    },
    {
      "name": "Hollow body via subtract",
      "description": "The hollow mug body is created by subtracting an inner cylinder from an outer cylinder using booleans.subtract(), not a single primitive",
      "max_score": 10
    },
    {
      "name": "Cutter oversized",
      "description": "The inner cavity cutter cylinder's height is larger than the outer body height (at least wall thickness + 1mm extra) to avoid co-planar faces",
      "max_score": 8
    },
    {
      "name": "No imports or require",
      "description": "The script contains no import or require statements — all names (primitives, booleans, hulls, etc.) come from injected scope",
      "max_score": 10
    },
    {
      "name": "Pure function",
      "description": "main() has no side effects — no console.log, no file I/O, no global variable mutations",
      "max_score": 8
    },
    {
      "name": "main(params = {}) signature",
      "description": "Entry function is declared as main(params = {}) with a default parameter",
      "max_score": 7
    },
    {
      "name": "Correct v2 cylinder params",
      "description": "All cylinder calls use radius (not r or diameter) and height (not h or length)",
      "max_score": 8
    },
    {
      "name": "Named dimension constants",
      "description": "Key dimensions (outer radius, wall thickness, height) are declared as named constants — no bare magic numbers in primitive size arguments",
      "max_score": 12
    }
  ]
}

evals

tile.json