CtrlK
BlogDocsLog inGet started
Tessl Logo

tessl/review-plugin-creator

Create custom Tessl reviewer plugins – fork the default rubric, build one from scratch, or derive its rubrics from evidence (existing skills, PR review feedback, agent logs). Scaffolds the plugin directory structure, authors rubrics and config.json, and validates the result with tessl review run.

97

1.15x
Quality

96%

Does it follow best practices?

Impact

98%

1.15x

Average score across 6 eval scenarios

SecuritybySnyk

Advisory

Suggest reviewing before use

Overview
Quality
Evals
Security
Files

rubric.schema.jsonskills/create-review-plugin/references/schemas/

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "rubric.schema.json",
  "title": "SkillReviewRubric",
  "description": "JSON Schema for skill review rubric files (rubrics/description.json and rubrics/content.json).",
  "type": "object",
  "required": ["evaluation_target", "scale", "reference_examples", "dimensions"],
  "additionalProperties": false,
  "properties": {
    "evaluation_target": {
      "type": "string",
      "description": "Which part of the skill (or artifact) this rubric evaluates. Built-in values are 'description' and 'content'; custom rubrics may use any string."
    },
    "scope": {
      "type": "string",
      "description": "Human-readable description of what is being evaluated (content rubric only)."
    },
    "scale": {
      "type": "object",
      "required": ["min", "max"],
      "additionalProperties": false,
      "properties": {
        "min": {
          "type": "number",
          "description": "Minimum valid score (inclusive)."
        },
        "max": {
          "type": "number",
          "description": "Maximum valid score (inclusive)."
        }
      }
    },
    "reference_examples": {
      "type": "object",
      "required": ["judging_guidelines", "good_overall_examples", "bad_overall_examples"],
      "additionalProperties": false,
      "properties": {
        "judging_guidelines": {
          "type": "array",
          "items": { "type": "string" },
          "minItems": 1,
          "description": "Ordered list of guidelines for the judge to follow."
        },
        "good_overall_examples": {
          "type": "array",
          "items": { "type": "string" },
          "minItems": 1,
          "description": "Examples of high-quality skills for this evaluation target."
        },
        "bad_overall_examples": {
          "type": "array",
          "items": { "type": "string" },
          "minItems": 1,
          "description": "Examples of low-quality skills for this evaluation target."
        }
      }
    },
    "dimensions": {
      "type": "array",
      "minItems": 1,
      "description": "Ordered list of evaluation dimensions. Weights must sum to 1.0.",
      "items": {
        "type": "object",
        "required": ["id", "name", "weight", "question", "scores"],
        "additionalProperties": false,
        "properties": {
          "id": {
            "type": "string",
            "pattern": "^[a-z][a-z0-9_]*$",
            "description": "Unique snake_case identifier for this dimension. Used as key in judge output scores."
          },
          "name": {
            "type": "string",
            "description": "Human-readable name for this dimension."
          },
          "weight": {
            "type": "number",
            "exclusiveMinimum": 0,
            "maximum": 1,
            "description": "Fractional weight of this dimension in the overall score. All weights must sum to 1.0."
          },
          "question": {
            "type": "string",
            "description": "The core question the judge should answer for this dimension."
          },
          "rationale": {
            "type": "string",
            "description": "Why this dimension matters (optional, content rubric dimensions)."
          },
          "scores": {
            "type": "array",
            "minItems": 2,
            "description": "Anchor definitions for each score level.",
            "items": {
              "type": "object",
              "required": ["score", "anchor", "example"],
              "additionalProperties": false,
              "properties": {
                "score": {
                  "type": "number",
                  "description": "The numeric score value."
                },
                "anchor": {
                  "type": "string",
                  "description": "Brief description of what earns this score."
                },
                "example": {
                  "type": "string",
                  "description": "Concrete example of content at this score level."
                }
              }
            }
          }
        }
      }
    },
    "scoring_notes": {
      "type": "object",
      "required": ["simple_skills", "code_vs_instruction_skills", "feedback_loops"],
      "additionalProperties": false,
      "description": "Additional scoring guidance (content rubric only).",
      "properties": {
        "simple_skills": {
          "type": "string"
        },
        "code_vs_instruction_skills": {
          "type": "string"
        },
        "feedback_loops": {
          "type": "string"
        }
      }
    }
  },
  "if": {
    "properties": { "evaluation_target": { "const": "content" } }
  },
  "then": {
    "required": ["scope", "scoring_notes"]
  }
}

README.md

tile.json