OpenJudgment Specification

Version: 0.1.0

Introduction

OpenJudgment is an open specification for recording human judgment moments in AI-assisted workflows. It defines a portable, tool-agnostic schema for capturing the pushbacks, corrections, directions, and preferences that developers exercise when working with AI coding assistants.

OpenJudgment standardizes how human steering in AI sessions is recorded — so that judgment can be captured, stored, and shared in a common format regardless of which AI assistant or tooling produced it.

Concepts

Steering

The act of a human guiding an AI assistant during a workflow: rejecting a suggestion, correcting a misunderstanding, asserting a preference, or redirecting an approach.

Episode

A discrete unit of work. One episode corresponds to one task or goal. It contains one or more moments and optionally records its outcome.

Moment

A single instance of human steering within an episode: a pushback, correction, direction, scope change, or preference assertion.

Judgment

The distilled record of a steering decision. Written in third person, it captures what was decided and why — without quoting the human directly.

Conformance

The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in RFC 2119.

An OpenJudgment document MAY be serialized as JSON, YAML, or Markdown as defined in the Serialization section.

Serialization

JSON

The canonical serialization. The schema defined in this specification is expressed in JSON. All other serializations MUST be semantically equivalent to their JSON representation.

YAML

Tools MAY accept YAML as an alternative serialization.

Markdown

Tools MAY produce or consume a Markdown representation. The Markdown representation MUST be losslessly convertible to and from JSON.

The mapping is as follows:

Schema

This specification uses JSON Schema 2020-12 for all schema definitions.

Episode Object

The Episode Object is the root object of each OpenJudgment document. One file per episode.

FieldTypeRequiredDescription
openjudgmentstringyesSpec version. MUST be "0.1.0".
topicstringyesShort human-readable title for the task.
toolstringnoThe AI assistant used during the episode (e.g. claude-code, cursor).
modelsstring[]noThe AI models used during the episode (e.g. claude-sonnet-4-6).
momentsMoment[]yesList of steering moments in ascending timestamp order. MUST have at least one.
resultstringnoOutcome: completed, paused, cancelled, or failed. Absence indicates the episode has no recorded outcome (e.g. still in progress).

Moment Object

A single instance of human steering within an episode.

FieldTypeRequiredDescription
timestampstringyesISO 8601 date-time of the steering message.
typestringyesOne of: pushback, direction, correction, scope-change, preference.
judgmentstringyesThird-person summary of what was decided and why. MUST NOT contain direct quotes from the human.
contextstringnoWhat the AI was doing at the moment of steering.

Moment Types

TypeDescription
pushbackDeveloper rejects or overrides an AI suggestion.
directionDeveloper gives explicit instruction on approach.
correctionAI misunderstood; developer clarifies.
scope-changeDeveloper narrows or shifts the goal.
preferenceDeveloper asserts a way of doing things.

JSON Schema

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://openjudgment.org/schema/v0.1.0",
  "title": "OpenJudgment",
  "description": "An open schema for recording human judgment moments in AI-assisted workflows.",
  "type": "object",
  "required": ["openjudgment", "topic", "moments"],
  "additionalProperties": false,
  "properties": {
    "openjudgment": {
      "type": "string",
      "description": "The OpenJudgment spec version this document conforms to.",
      "const": "0.1.0"
    },
    "topic": {
      "type": "string",
      "description": "Short human-readable title for the task."
    },
    "tool": {
      "type": "string",
      "description": "The AI assistant used during the episode (e.g. 'claude-code', 'cursor')."
    },
    "models": {
      "type": "array",
      "description": "The AI models used during the episode (e.g. 'claude-sonnet-4-6').",
      "items": { "type": "string" }
    },
    "moments": {
      "type": "array",
      "description": "Ordered list of steering moments.",
      "minItems": 1,
      "items": { "$ref": "#/$defs/Moment" }
    },
    "result": {
      "type": "string",
      "description": "Outcome of the episode.",
      "enum": ["completed", "paused", "cancelled", "failed"]
    }
  },
  "$defs": {
    "Moment": {
      "type": "object",
      "required": ["timestamp", "type", "judgment"],
      "additionalProperties": false,
      "properties": {
        "timestamp": {
          "type": "string",
          "format": "date-time",
          "description": "ISO 8601 date-time of the steering message."
        },
        "type": {
          "type": "string",
          "description": "The type of steering moment.",
          "enum": ["pushback", "direction", "correction", "scope-change", "preference"]
        },
        "judgment": {
          "type": "string",
          "description": "Third-person summary of what was decided and why. No direct quotes."
        },
        "context": {
          "type": "string",
          "description": "What the AI was doing at the moment of steering."
        }
      }
    }
  }
}

Examples

JSON

{
  "openjudgment": "0.1.0",
  "topic": "Implement auth middleware",
  "tool": "claude-code",
  "models": ["claude-sonnet-4-6"],
  "result": "completed",
  "moments": [
    {
      "timestamp": "2026-03-27T14:32:00.000Z",
      "type": "direction",
      "judgment": "Chose JWT over session-based auth to preserve stateless architecture.",
      "context": "Claude proposed session-based authentication."
    },
    {
      "timestamp": "2026-03-27T15:01:00.000Z",
      "type": "pushback",
      "judgment": "Rejected extracting token verification into a shared utility before any other callers existed.",
      "context": "Claude proposed extracting token verification into a reusable utility."
    }
  ]
}

Markdown

---
openjudgment: 0.1.0
tool: claude-code
models:
  - claude-sonnet-4-6
---

# Implement auth middleware

## 2026-03-27T14:32:00.000Z direction

### Judgment

Chose JWT over session-based auth to preserve stateless architecture.

### Context

Claude proposed session-based authentication.

## 2026-03-27T15:01:00.000Z pushback

### Judgment

Rejected extracting token verification into a shared utility before any other callers existed.

### Context

Claude proposed extracting token verification into a reusable utility.

**Result**: completed

Implementations