spec 1.0 · normativo

Frontmatter del registro de decisión 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.

Valida el frontmatter YAML de un registro de decisión. El cuerpo en markdown lleva el contexto, la decisión y las consecuencias, en prosa.

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

Campos

#idstringobligatorio

Identificador estable de esta decisión, por ejemplo "adopt-leji".

Patrón ^[a-z0-9]+(-[a-z0-9]+)*$

#titlestringobligatorio

Título breve de la decisión.

#status"proposed" · "accepted" · "superseded" · "deprecated" · "rejected"obligatorio

Estado de la decisión en su ciclo de vida.

#datestringobligatorio

Fecha ISO 8601 en que se tomó la decisión; es inmutable una vez publicada, y un cambio de estado posterior no la mueve.

Patrón ^\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01])$

#decidersarray de cadenas

Las personas que tomaron la decisión.

#supersedesstring

id del registro al que sustituye esta decisión.

#supersededBystring

id del registro que sustituyó a este. REQUIRED cuando el status es "superseded": un registro sustituido debe apuntar a su sucesor, para que el enlace de sustitución se pueda recorrer en los dos sentidos.

#affectedPathsarray de cadenas

Rutas relativas a la raíz del repositorio a las que afecta la decisión.

#affectedCategoriesarray de "domain" · "system" · "practice" · "governance" · "decisions"

Categorías de contenido a las que afecta la decisión.

Referencias salientes, por ejemplo a decisiones o issues relacionados; opcional.

Esquema y ejemplo

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://leji.org/schemas/v1.0/decision-record.schema.json",
  "title": "Leji decision record frontmatter",
  "description": "Validates the YAML frontmatter of a decision record. The markdown body carries context, decision, and consequences in prose.",
  "type": "object",
  "required": [
    "id",
    "title",
    "status",
    "date"
  ],
  "additionalProperties": false,
  "properties": {
    "id": {
      "description": "Stable identifier for this decision, e.g. \"adopt-leji\".",
      "type": "string",
      "pattern": "^[a-z0-9]+(-[a-z0-9]+)*$"
    },
    "title": {
      "description": "Short title of the decision.",
      "type": "string",
      "minLength": 1
    },
    "status": {
      "description": "Lifecycle status of the decision.",
      "enum": [
        "proposed",
        "accepted",
        "superseded",
        "deprecated",
        "rejected"
      ]
    },
    "date": {
      "description": "ISO 8601 date the decision was made; it is immutable once published, and a later status change does not move it.",
      "type": "string",
      "pattern": "^\\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])$"
    },
    "deciders": {
      "description": "People who made the decision.",
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "supersedes": {
      "type": "string",
      "description": "id of the record this decision replaces."
    },
    "supersededBy": {
      "type": "string",
      "description": "id of the record that replaced this one. REQUIRED when status is \"superseded\": a superseded record must point to its successor so the supersession link is navigable in both directions."
    },
    "affectedPaths": {
      "description": "Repository-root-relative paths the decision affects.",
      "type": "array",
      "items": {
        "type": "string",
        "pattern": "^(?!/)(?!\\./)(?!.*(^|/)\\.\\.(/|$))(?!.*\\\\).+$"
      }
    },
    "affectedCategories": {
      "description": "Content categories the decision affects.",
      "type": "array",
      "items": {
        "enum": [
          "domain",
          "system",
          "practice",
          "governance",
          "decisions"
        ]
      }
    },
    "links": {
      "description": "Optional outbound references, e.g. to related decisions or issues.",
      "type": "array",
      "items": {
        "type": "string"
      }
    }
  },
  "if": {
    "properties": {
      "status": {
        "const": "superseded"
      }
    },
    "required": [
      "status"
    ]
  },
  "then": {
    "required": [
      "supersededBy"
    ]
  }
}

Un registro de decisión conforme. Este esquema valida el frontmatter YAML; el cuerpo en markdown lleva el contexto, la decisión y las consecuencias.

---
id: adopt-leji
title: Adoptar la capa de contexto Leji
status: accepted
date: 2026-06-10
deciders:
  - Jo Lee
affectedCategories:
  - governance
---

# Adoptar la capa de contexto Leji

## Context

El conocimiento de ingeniería vivía en las cabezas, en hilos de chat y en tres archivos de configuración de herramientas que iban divergiendo entre sí. Los agentes producían código que no encajaba con nuestros invariantes, porque los invariantes no estaban escritos en ningún sitio que una herramienta pudiera leer.

## Decision

Adoptar Leji en el nivel `indexed`: manifiesto, perfil de arranque, contenido de domain y de system, registros de decisión, índice generado y registro de cambios para máquinas.

## Consequences

Los archivos de configuración de proveedor se convierten en redirecciones de una línea. Las correcciones del contexto pasan por los mismos PR que el trabajo que las saca a la luz. Jo es responsable de la capa de contexto.

← Todos los esquemas