spec 1.0 · normativo

Changelog de contexto do Leji

Tradução assistida por agentes de IA. Em caso de divergência, prevalece a página em inglês. Se você encontrar algum problema no texto, abra uma issue ou envie um pull request.

Registro legível por máquina, somente acréscimo, das mudanças da camada de contexto.

$id canônico: https://leji.org/schemas/v1.0/context-changelog.schema.json
Arquivo bruto: context-changelog.schema.json

Campos

#schemaVersionstringobrigatório

A linha da especificação Leji para a qual este artefato foi escrito, por exemplo "1.0".

Padrão ^\d+\.\d+$

#entriesarray de objetosobrigatório

As mudanças da camada de contexto. A ordem canônica vem da ordenação crescente por (date, id); a posição no array não significa nada. Entradas novas podem aparecer em qualquer lugar; as mais antigas podem ser compactadas com uma entrada de compactação. Pelo menos uma entrada: um changelog que nasce vazio é inválido, e a compactação sempre deixa para trás a própria entrada de compactação.

idstringobrigatório

Identificador estável desta entrada de mudança, único dentro do changelog.

datestringobrigatório

ISO 8601 em UTC: uma data de calendário YYYY-MM-DD (ordenada como o início do dia) ou um timestamp completo terminado em Z, por exemplo 2026-06-13T15:04:05Z. Deslocamentos de fuso e horários sem fuso não são permitidos, de modo que a ordem lexical é também a cronológica.

type"added" · "changed" · "deprecated" · "removed" · "fixed" · "decision" · "governance" · "compaction"obrigatório

O tipo da mudança.

summarystringobrigatório

Descrição em uma linha do que mudou.

pathsarray de stringsobrigatório

Os caminhos afetados pela mudança, relativos à raiz do repositório. Pelo menos um; uma entrada de compactação registra a união dos caminhos que ela absorveu, ou o próprio caminho do changelog quando essa união é vazia.

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

As categorias de conteúdo que a mudança tocou.

decisionRefsarray de strings

Os ids dos registros de decisão relacionados a esta mudança.

proposedBystring

A pessoa ou o agente que propôs a mudança.

approvedBystring

A pessoa que aprovou a mudança.

breakingboolean

Se a mudança quebra quem consome a camada de contexto.

compactedobject

Obrigatório nas entradas de compactação: o que a compactação tirou da ponta mais antiga.

entriesintegerobrigatório

Quantas entradas esta compactação tirou da ponta mais antiga.

firstIdstringobrigatório

O id da entrada mais antiga que esta compactação tirou.

lastIdstringobrigatório

O id da entrada mais recente que esta compactação tirou.

Schema e exemplo

{
  "$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"
          ]
        }
      }
    }
  }
}

Um changelog legível por máquina das mudanças da camada 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": "Semeou a camada de contexto: perfil de boot, glossário, invariantes do sistema, primeiro registro de decisão.",
      "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": "Acrescentou o perfil de agente thought-partner e o associou ao papel no mapa agents do manifesto.",
      "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": "Passou a propriedade da camada de contexto de Jo Lee para o Acme Platform Team.",
      "paths": [
        "leji.json"
      ],
      "approvedBy": "Acme Platform Team"
    }
  ]
}

← Todos os schemas