spec 1.0 · normativo

Registro de cambios del contexto de Leji

Traducción asistida por agentes de IA. Ante cualquier diferencia, prevalece la página en inglés. Si encuentra algún problema en el texto, abra un issue o envíe un pull request.

Registro legible por máquinas, de solo anexión, de los cambios de la capa de contexto.

$id canónico: https://leji.org/schemas/v1.0/context-changelog.schema.json
Archivo original: context-changelog.schema.json

Campos

#schemaVersionstringobligatorio

La línea de especificación de Leji contra la que se escribió este artefacto, por ejemplo "1.0".

Patrón ^\d+\.\d+$

#entriesarray de objetosobligatorio

Los cambios de la capa de contexto. El orden canónico se obtiene ordenando por (date, id) de forma ascendente; la posición dentro del array no significa nada. Las entradas nuevas pueden aparecer en cualquier punto, y las más antiguas pueden compactarse con una entrada de compactación. Debe haber al menos una entrada: un registro de cambios que nace vacío no es válido, y la compactación siempre deja atrás su propia entrada de compactación.

idstringobligatorio

Identificador estable de esta entrada de cambio, único dentro del registro de cambios.

datestringobligatorio

ISO 8601 en UTC: una fecha de calendario YYYY-MM-DD (que se ordena como el inicio del día) o una marca de tiempo completa terminada en Z, por ejemplo 2026-06-13T15:04:05Z. No se admiten desplazamientos horarios ni horas sin zona, de modo que el orden lexicográfico es también el cronológico.

type"added" · "changed" · "deprecated" · "removed" · "fixed" · "decision" · "governance" · "compaction"obligatorio

El tipo de cambio.

summarystringobligatorio

Descripción en una línea de lo que cambió.

pathsarray de cadenasobligatorio

Rutas relativas a la raíz del repositorio a las que afectó el cambio. Al menos una; una entrada de compactación registra la unión de las rutas que plegó, o la ruta del propio registro de cambios cuando esa unión queda vacía.

categoriesarray de "domain" · "system" · "practice" · "governance" · "decisions"

Categorías de contenido que tocó el cambio.

decisionRefsarray de cadenas

Ids de los registros de decisión relacionados con este cambio.

proposedBystring

Persona o agente que propuso el cambio.

approvedBystring

Persona que aprobó el cambio.

breakingboolean

Si el cambio rompe a quienes consumen la capa de contexto.

compactedobject

Obligatorio en las entradas de compactación: qué retiró la compactación del extremo más antiguo.

entriesintegerobligatorio

Cuántas entradas retiró esta compactación del extremo más antiguo.

firstIdstringobligatorio

Id de la entrada más antigua que retiró esta compactación.

lastIdstringobligatorio

Id de la entrada más reciente que retiró esta compactación.

Esquema y ejemplo

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://leji.org/schemas/v1.0/context-changelog.schema.json",
  "title": "Leji context changelog",
  "description": "Append-only machine-readable record of context layer changes.",
  "type": "object",
  "required": [
    "schemaVersion",
    "entries"
  ],
  "additionalProperties": false,
  "properties": {
    "$schema": {
      "description": "Optional pointer to this schema, for editor validation and tooling.",
      "type": "string"
    },
    "schemaVersion": {
      "description": "The Leji spec line this artifact was written against, e.g. \"1.0\".",
      "type": "string",
      "pattern": "^\\d+\\.\\d+$"
    },
    "entries": {
      "description": "Context layer changes. Canonical order is derived by sorting on (date, id) ascending; array position is not significant. New entries may appear anywhere; the oldest may be compacted with a compaction entry. At least one entry: a born-empty changelog is invalid, and compaction always leaves its compaction entry behind.",
      "type": "array",
      "minItems": 1,
      "items": {
        "type": "object",
        "required": [
          "id",
          "date",
          "type",
          "summary",
          "paths"
        ],
        "additionalProperties": false,
        "properties": {
          "id": {
            "description": "Stable identifier for this change entry, unique within the changelog.",
            "type": "string",
            "pattern": "^[a-z0-9]+(-[a-z0-9]+)*$"
          },
          "date": {
            "description": "ISO 8601 in UTC: a calendar date YYYY-MM-DD (ordered as start of day) or a full timestamp ending in Z, e.g. 2026-06-13T15:04:05Z. Offsets and zoneless times are not allowed, so lexical order is chronological.",
            "type": "string",
            "pattern": "^\\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])(T([01]\\d|2[0-3]):[0-5]\\d:[0-5]\\dZ)?$"
          },
          "type": {
            "description": "The kind of change.",
            "enum": [
              "added",
              "changed",
              "deprecated",
              "removed",
              "fixed",
              "decision",
              "governance",
              "compaction"
            ]
          },
          "summary": {
            "description": "One-line description of what changed.",
            "type": "string",
            "minLength": 1
          },
          "paths": {
            "description": "Repository-root-relative paths the change affected. At least one; a compaction entry records the union of the paths it folded, or the changelog's own path when that union is empty.",
            "type": "array",
            "minItems": 1,
            "items": {
              "type": "string",
              "pattern": "^(?!/)(?!\\./)(?!.*(^|/)\\.\\.(/|$))(?!.*\\\\).+$"
            }
          },
          "categories": {
            "description": "Content categories the change touched.",
            "type": "array",
            "items": {
              "enum": [
                "domain",
                "system",
                "practice",
                "governance",
                "decisions"
              ]
            }
          },
          "decisionRefs": {
            "description": "Ids of decision records related to this change.",
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "proposedBy": {
            "type": "string",
            "description": "Human or agent that proposed the change."
          },
          "approvedBy": {
            "type": "string",
            "description": "Human who approved the change."
          },
          "breaking": {
            "description": "Whether the change breaks consumers of the context layer.",
            "type": "boolean"
          },
          "compacted": {
            "type": "object",
            "description": "Required on compaction entries: what the compaction removed from the oldest end.",
            "required": [
              "entries",
              "firstId",
              "lastId"
            ],
            "additionalProperties": false,
            "properties": {
              "entries": {
                "description": "How many entries this compaction removed from the oldest end.",
                "type": "integer",
                "minimum": 1
              },
              "firstId": {
                "description": "Id of the oldest entry removed by this compaction.",
                "type": "string",
                "pattern": "^[a-z0-9]+(-[a-z0-9]+)*$"
              },
              "lastId": {
                "description": "Id of the newest entry removed by this compaction.",
                "type": "string",
                "pattern": "^[a-z0-9]+(-[a-z0-9]+)*$"
              }
            }
          }
        },
        "if": {
          "properties": {
            "type": {
              "const": "compaction"
            }
          },
          "required": [
            "type"
          ]
        },
        "then": {
          "required": [
            "compacted"
          ]
        }
      }
    }
  }
}

Un registro de cambios legible por máquinas de los cambios de la capa de contexto.

{
  "$schema": "https://leji.org/schemas/v1.0/context-changelog.schema.json",
  "schemaVersion": "1.0",
  "entries": [
    {
      "id": "seed-layer",
      "date": "2026-06-10",
      "type": "added",
      "summary": "Se sembró la capa de contexto: perfil de arranque, glosario, invariantes del sistema y primer registro de decisión.",
      "paths": [
        "docs/boot-profile.md",
        "docs/domain/glossary.md",
        "docs/system/invariants.md",
        "docs/decisions/0001-adopt-leji.md"
      ],
      "categories": [
        "domain",
        "system",
        "decisions"
      ],
      "proposedBy": "agent:claude",
      "approvedBy": "Jo Lee"
    },
    {
      "id": "thought-partner-profile",
      "date": "2026-06-12",
      "type": "added",
      "summary": "Se añadió el perfil de agente thought-partner y se vinculó al rol en el mapa agents del manifiesto.",
      "paths": [
        "docs/agents/thought-partner.md",
        "leji.json"
      ],
      "proposedBy": "agent:claude",
      "approvedBy": "Jo Lee"
    },
    {
      "id": "ownership-to-platform-team",
      "date": "2026-09-11",
      "type": "governance",
      "summary": "Se traspasó la propiedad de la capa de contexto de Jo Lee al Acme Platform Team.",
      "paths": [
        "leji.json"
      ],
      "approvedBy": "Acme Platform Team"
    }
  ]
}

← Todos los esquemas