Saltar a contenido

Ficheros que escribe gdd

Todos los ficheros y carpetas que gdd escribe en un proyecto: lo que deja gdd init, el estado local en .gdd/ (registros, informes, el log, la Decision Inbox, las salidas de los agentes), cuáles se versionan, cuáles solo puede escribir gdd y qué lleva el commit de fusión de un Change.

Un proyecto después de gdd init

gdd init --name notes --platform cli --stack python --agents claude codex en un repositorio vacío hace commit de estos ficheros (los comandos de los agentes aparecen una sola vez por carpeta de agente):

.agents/skills/gdd-<command>/SKILL.md   # Codex: the GDD commands and gdd-stack-python
.claude/skills/gdd-<command>/SKILL.md   # Claude Code: the same
.github/workflows/gdd.yml               # CI: the stack setup, gitleaks, gdd, bin/gdd ci
.gitignore                              # the stack's lines and .gdd/
AGENTS.md                               # instructions for agents, when the project had none
CLAUDE.md                               # @AGENTS.md, when the project had none
bin/gdd                                 # entry point of the agents and CI
docs/brief.md                           # the Project Brief
features/.gitkeep                       # the scenario folder
gdd/commands.toml
gdd/generated.toml
gdd/models.toml
gdd/project.toml
gdd/rules.toml
gdd/zones.toml
osv-scanner-licenses.toml               # from here on: the Python skeleton
osv-scanner.toml
pyproject.toml
src/notes/__init__.py
src/notes/greeting.py
tests/__init__.py
tests/acceptance/__init__.py
tests/acceptance/steps/__init__.py
tests/acceptance/test_features.py
tests/unit/__init__.py
tests/unit/test_greeting.py
Ruta Qué es
gdd/ La configuración: consulta Configuración.
bin/gdd Un script de shell que ejecuta ${GDD_BIN:-gdd} con sus argumentos: el gdd del PATH, o el que indique GDD_BIN.
docs/brief.md El Project Brief, a partir de --name, --description, --platform, --stack y --sensitive. El Orchestrator lo completa en Setup.
AGENTS.md, CLAUDE.md Solo se escriben cuando el proyecto no tiene ninguno; si no, gdd imprime la línea que hay que añadir.
.gitignore gdd añade al final las rutas ignoradas del stack y .gdd/.
Carpetas de agentes .claude/skills/<name>/SKILL.md (Claude Code), .agents/skills/<name>/SKILL.md (Codex), .opencode/commands/<name>.md (OpenCode), para los agentes de --agents. gdd agents install las vuelve a escribir; gdd agents check nombra cualquier fichero que falte o que se haya editado.
Esqueleto Por stack, solo cuando la carpeta no tiene un proyecto de ese stack: consulta Stacks.

gdd init nunca sobrescribe un fichero, nunca escribe a través de un enlace y solo hace commit de lo que escribió (gdd init <version>), en un repositorio nuevo si la carpeta no está en ninguno. Después, gdd bootstrap hace commit de los lockfiles (gdd bootstrap). gdd adopt hace commit de gdd/debt.toml.

Versionado y local

Ruta Versionado Lo escribe
gdd/*.toml sí gdd init, gdd adopt, gdd upgrade, una persona; consulta Quién puede cambiarlos
bin/gdd, .github/workflows/gdd.yml, carpetas de agentes, AGENTS.md, CLAUDE.md sí gdd init, gdd agents install
docs/, features/, código y tests sí el Orchestrator y el Builder, a través de Changes
CHANGELOG.md sí, cuando el proyecto lo mantiene gdd changelog --write, gdd release
.gdd/ no: gdd init añade .gdd/ a .gitignore gdd, y unos pocos ficheros que escribe el Orchestrator

El registro de cada Change solo llega a git a través de su commit de fusión.

.gdd/

El estado local. Todos los worktrees de un repositorio comparten la .gdd/ de su checkout principal (la raíz del estado): un Change se ejecuta en su propio worktree y aun así lee y escribe los mismos registros. gdd se niega a ejecutarse en un worktree de un repositorio bare.

.gdd/
├── log.jsonl                 # one JSON line per agent call, gate decision and machine step
├── g0.json                   # G0, opened by the machines
├── zones.json                # the human's approval of the red zones
├── selftest.json             # the last harness self-test
├── headless_sessions.txt     # sessions gdd started for its agents
├── imported_requests.json    # requests of interactive sessions already in the log
├── agents.lock  launch.lock  merge.lock  state.lock
├── adoption/<command>.txt    # gdd adopt: what each failing command said
├── learn/<tool>.txt          # gdd learn: what each Learn tool said
├── selftest/kept/            # gdd selftest: a file set aside while the check runs
├── upgrade/                  # gdd upgrade: scratch folder, removed after each run
├── bin/                      # protected; gdd does not write it
└── changes/<id>/
    ├── change.json           # the record
    ├── inbox.md              # the Decision Inbox
    ├── plan.md               # the plan of a red change (the Orchestrator)
    ├── package.md            # the minimum context package (the Orchestrator)
    ├── replan.md             # the last replan (the Orchestrator, headless)
    ├── review.md             # the last review (the Reviewer's text, kept by gdd)
    ├── g2.json  g3.json      # the last report of each gate
    ├── snapshot.json         # gdd snapshot
    ├── snapshot-build.json   # the snapshot taken after test mode
    ├── run.json              # while the change waits at G4
    ├── outputs/              # every agent call: <role>-<n>.md and <role>-<n>.raw
    └── demo/                 # what the demo step leaves for G4
Ruta Lo escribe Contenido
log.jsonl gdd Consulta log.jsonl.
g0.json gdd gate G0 decision, by (machines), ts, note.
zones.json gdd gate zones decision, by (human), ts, red_hash (16 caracteres hexadecimales del SHA-256 de las zonas rojas), red (las zonas rojas tal como se aprobaron, con todas sus claves), note.
selftest.json gdd selftest ok, summary (harness 4/4), detail (el test y el ok de cada comprobación), ts.
headless_sessions.txt gdd, tras cada llamada de agente que informa de una sesión Un id de sesión por línea, para que gdd session las deje fuera.
imported_requests.json gdd session Los ids de las peticiones ya contadas, como lista JSON. Un fichero .new guarda la lista siguiente hasta que el log tiene sus líneas.
*.lock gdd Ficheros de bloqueo vacíos: merge.lock (una fusión cada vez), launch.lock (el tope de [parallel] max), agents.lock (lo retiene cada llamada de agente, y en exclusiva la escritura de una persona en el estado compartido), state.lock (el turno para tomarlo).
adoption/<command>.txt gdd adopt Lo que se guarda de la salida del comando que falla, para su Refactor.
learn/<tool>.txt gdd learn Todo lo que dijo una herramienta de Learn.
bin/ no es gdd Programas que un proyecto deja fuera de git, como su propia compilación de gdd. Está en [protected] all y en la zona roja del arnés, y se comprueba antes y después de cada llamada de agente.
changes/<id>/change.json solo gdd Consulta change.json.
changes/<id>/inbox.md gdd, tras cada modificación del registro Consulta inbox.md.
changes/<id>/plan.md, package.md el Orchestrator (gdd-change) Texto libre. El Builder y el Reviewer leen package.md.
changes/<id>/replan.md el Orchestrator al replanificar Texto libre; la última línea que empieza por NEXT: dice test o build. gdd lo borra antes de cada replanificación.
changes/<id>/review.md gdd, a partir del texto final del Reviewer Termina en VERDICT: OK o VERDICT: KO. gdd lo borra antes de cada revisión.
changes/<id>/g2.json, g3.json gdd g2, gdd g3, la receta Consulta Informes de puerta.
changes/<id>/snapshot.json gdd snapshot Cada ruta que tocó el Change con su SHA-256 (o deleted): gdd guard --since-snapshot solo juzga lo que cambia después.
changes/<id>/snapshot-build.json la receta, tras el modo test Lo mismo, para que el modo build se juzgue solo por su propio trabajo.
changes/<id>/run.json la receta {"paused_at": "G4"} mientras el Change espera a gdd resume; se borra tras la respuesta.
changes/<id>/outputs/ gdd, tras cada llamada de agente <role>-<n>.md: el texto final del agente; <role>-<n>.raw: su salida completa. <role> es builder-test, builder-build, reviewer u orchestrator; <n> cuenta las llamadas del rol en el Change, desde 1.
changes/<id>/demo/ el comando [release] demo del proyecto Vídeo, capturas de pantalla o la ejecución legible de los escenarios.

change.json

El registro de un Change: qué planea, qué decidieron sus puertas, sus notas y su estado. JSON indentado. Solo lo escribe gdd: los comandos de gdd que puede ejecutar un agente (gdd note, una puerta en modo build) solo cambian inbox y out_of_scope, y gdd deshace cualquier otra modificación que haga un agente.

El registro de un Change fusionado y promovido en un proyecto desechable, recortado:

{
  "build_start": "ca7bc9c0d5369ef863aab8d6f7651f64056215ed",
  "changelog": {
    "breaking": false,
    "line": "The cart shows its total",
    "section": "Added"
  },
  "commit": "8b14c1a9ab22d8931b010ad51499c8242ff03e4a",
  "created": "2026-10-30T13:11:40+00:00",
  "decision": {
    "builder": {
      "integration": "claude",
      "model": "sonnet"
    },
    "builder_session": "separate",
    ...
    "type": "Feature"
  },
  "features": [
    "features/cart.feature"
  ],
  "gates": {
    "G1": {
      "by": "human",
      "decision": "ok",
      "hashes": {
        "features/cart.feature": "06a581fd190d4dc2e48f33c21323302a67e522e74b8bacce3dd2b51c3fdce716"
      },
      "note": "approved at the sitting",
      "ts": "2026-10-30T13:11:46+00:00"
    },
    ...
  },
  "id": "cart-total",
  "inbox": [
    {
      "kind": "decided",
      "text": "Kept the total as an integer",
      "ts": "2026-10-30T13:11:53+00:00"
    },
    ...
  ],
  "min_color": null,
  "out_of_scope": [
    "docs/extra.md"
  ],
  "paths": [
    "src/shop/**",
    "features/cart.feature"
  ],
  "resumable": false,
  "state": "closed",
  "title": "Show the cart total",
  "type": "Feature",
  "version": "0.1.0"
}
Campo Tipo Lo escribe Significado
id cadena gdd new-change El id del Change: una letra minúscula o un dígito, y después hasta 40 letras minúsculas, dígitos o guiones. Su rama es change/<id>.
title cadena gdd new-change De qué trata el Change.
type cadena gdd new-change Feature, Hotfix, Refactor, Migration, Spike o No-code.
paths array de cadenas gdd new-change Las rutas que planea tocar; se admiten patrones.
resumable booleano gdd new-change --resumable: una condición de la vía rápida.
min_color cadena o null gdd new-change --min-color: sube el color, nunca lo baja.
created cadena gdd new-change Cuándo se creó, en UTC.
state cadena gdd Consulta Estados.
gates objeto gdd gate, la receta Una entrada por cada puerta decidida en el Change: ver más abajo.
inbox array gdd note, gdd park, la receta Las notas de la Decision Inbox: ver más abajo.
variants array gdd new-change, la receta Solo en un Spike con variantes: ver más abajo.
decision objeto gdd prepare Lo que decidió prepare: ver más abajo.
build_start cadena gdd prepare El commit en el que empezó el Build: Path Guard y la comprobación de alcance juzgan a partir de él.
features array de cadenas gdd gate G1 Los ficheros de escenarios sellados en G1, incluidos los ejemplos ocultos.
out_of_scope array de cadenas las puertas en modo build Las rutas fuera del plan que aceptó la comprobación de alcance.
reviews array la receta Cada llamada al Reviewer: ver más abajo.
spent_usd número la receta Lo que costaron las llamadas de agente del Change, según lo informaron los agentes.
spent_tokens objeto la receta Sus tokens: in, cache, out.
changelog objeto gdd changelog-line {"section", "line", "breaking"}, o {"none": true} para dejar el Change fuera. Sin él, el título va en la sección de su tipo (Feature: Added, Hotfix: Fixed, Migration: Changed); los demás tipos no tienen línea.
commit cadena gdd merge El commit de fusión.
version cadena gdd release promote La versión con la que se publicó el Change, sin su v.

Los registros escritos por una versión anterior de la herramienta pueden tener otros campos; gdd los ignora.

gates

Clave Presente en
plan un Change rojo, una vez que la persona aprobó su plan
G1 un Change con escenarios nuevos o cambiados, una vez que la persona decidió
G2 cuando se registra con gdd gate G2
G3 una vez que las máquinas la abrieron (automatic chain and Reviewer)
G4 una vez que la persona respondió, o que las máquinas aprobaron la promoción

Cada entrada tiene decision (ok o ko), by (human o machines), ts y note. G1 tiene además hashes: cada fichero de escenarios sellado y su SHA-256.

inbox

Cada nota tiene kind, text y ts, y además resolved (cuándo se resolvió) una vez que un relanzamiento la resolvió. kind es needs (una decisión para la persona), decided (tomada sin él), parked (por qué se detuvo) o polish (las notas de la persona en G4).

decision

La clasificación del Change cuando se preparó, y el modelo de cada rol.

Clave Significado
change El id.
color, lane green, yellow o red; fast o full.
reasons Una línea por ruta: su color y el porqué.
g1, features Si necesita G1, y sus ficheros de escenarios.
tests_first, mutation, reviewer, review, g4, human_plan Lo que le da su regla (consulta Puertas).
type Su tipo de trabajo.
builder, builder_test, reviewer_model, orchestrator Las tablas de rol de gdd/models.toml que le tocaron.
builder_session separate o shared.
retries Rondas del modo build contra G2.
resume_green Un relanzamiento cuyo código ya pasa G2: sin Builder.

reviews

Una entrada por cada llamada al Reviewer, en orden, incluidos los relanzamientos.

Clave Significado
output Dónde se guarda su respuesta, desde la carpeta del Change: outputs/reviewer-<n>.md.
verdict OK o KO cuando terminó la llamada; null cuando la llamada detuvo la receta.
changed Las rutas cuyo hash cambió desde la revisión anterior; null en la primera.
hashes El hash de cada ruta que tocó el Change, justo antes de la llamada.

variants

Una entrada por cada variante de un Spike: option (la opción que construye, o null para el mismo brief), branch (change/<id>-v<n>) y, una vez construida, state (ready o parked), reason, g2, adrs, decision (la primera línea de la decisión de su ADR), files, minutes, usd y tokens.

Estados

Estado Significado
open Creado, sin preparar.
building Preparado y en Build, incluida una pasada de polish tras G4.
parked Detenido, con un mensaje en su Decision Inbox.
merged Fusionado en main.
in-pre En pre, esperando G4 o su promoción.
promoting Su promoción está en curso.
in-production Promovido, en observación.
closed Observado: terminado.
rejected KO en G4.
rolled-back La observación falló y se revirtió producción.

inbox.md

La Decision Inbox: un mensaje por Change, generado a partir del registro y de los informes de puerta cada vez que cambian. gdd inbox <id> la imprime.

# Decision Inbox · cart-total · Show the cart total

Color yellow · lane full · state closed

## Needs your decision
- Should the total show taxes

## Decided without you
- Kept the total as an integer
- Paths outside the package, same or lower color, accepted by rule: docs/extra.md

## Parked
- Nothing.

Sus grupos, en orden, cada uno solo cuando tiene algo (los tres grupos de notas aparecen siempre): How it works (del OK del Reviewer), Variants, Needs your decision, Decided without you, Parked, Security exceptions this change adds, Known debt, Known debt paid, Polish; después, cuántas peticiones anteriores se resolvieron antes del último lanzamiento.

Informes de puerta

g2.json y g3.json guardan la última ejecución de cada puerta en el Change.

{
  "ok": true,
  "gate": "G2",
  "color": "yellow",
  "passed": [
    "lint",
    "unit",
    "path-guard",
    "scope"
  ],
  "skipped": [],
  "failures": [],
  "out_of_scope": [
    "docs/extra.md"
  ]
}
Campo Significado
ok No falló nada.
gate, color G2 o G3; el color del Change.
passed Las comprobaciones que pasaron, en orden: comandos, path-guard, scope, scenarios (<n>), exceptions.
skipped Los comandos mutation* que el Change no necesita.
failures Cada uno con name y tail (lo que hay que leer); un comando tiene además ok, code (124 tras agotar el tiempo) y duration_s.
out_of_scope En modo build, las rutas fuera del plan que aceptó la comprobación de alcance.
added_exceptions Solo en G3, si las hay: las excepciones de seguridad que añade el Change.
known_debt Si los hay: los comandos con deuda conocida que fallaron, con name, tail, y count y known cuando se cuentan.
paid_debt Si los hay: los comandos con deuda conocida que pasaron.
summaries Si los hay: la última línea de cada comando mutation* que pasó.

log.jsonl

Un objeto JSON por línea, añadido bajo un lock, para que las líneas de dos ejecuciones nunca se mezclen. gdd escribe una línea por cada llamada de agente, decisión de puerta, comando de puerta, ejecución de Path Guard y paso de máquina. gdd session añade las sesiones interactivas de Claude Code. Los informes dejan fuera las líneas que no son de gdd (no son JSON, o su coste no es un número mayor o igual que cero) e indican cuántas son.

{"ts":"2026-10-30T13:11:46+00:00","change":"cart-total","phase":"2-build","gate":"G2","role":"machine","agent":"lint","model":"-","tokens_in":0,"tokens_cache":0,"tokens_out":0,"cost_usd":0.0,"duration_s":0.0,"result":"ok","retry":0,"note":""}
{"ts":"2026-10-30T13:11:46+00:00","change":"cart-total","phase":"2-build","gate":"G2","role":"machine","agent":"checks","model":"-","tokens_in":0,"tokens_cache":0,"tokens_out":0,"cost_usd":0.0,"duration_s":0.0,"result":"ok","retry":0,"note":""}
Campo Tipo Significado
ts cadena UTC al segundo: 2026-10-30T13:11:46+00:00.
change cadena El id del Change; - para el proyecto (G0, las zonas rojas).
phase cadena 0-setup, 1-discover, 2-build, 3-integrate, 4-release, 5-learn o -.
gate cadena G0, zones, plan, de G1 a G4, o -.
role cadena orchestrator, builder-test, builder-build, reviewer, machine, human, o quién registró una puerta (--by, como machines).
agent cadena El agente de una llamada (claude, codex, opencode, claude-interactive); en los pasos de máquina, lo que se ejecutó: un nombre de comando, checks (la puerta), path-guard, selftest, verdict, merge, un paso de release; - en otro caso.
model cadena El modelo de una llamada de agente; - en otro caso.
tokens_in entero Tokens de entrada no leídos de la caché.
tokens_cache entero Tokens de entrada leídos de la caché.
tokens_out entero Tokens de salida.
cost_usd número Coste de la llamada: el que informó el agente, o estimado a partir de [prices].
duration_s número Segundos, con una décima.
result cadena ok o ko; en una llamada de agente, ok, error-<code> o timeout; en un paso de release, ok, ko o simulated; en un paso, lo que pasó: change-created, prepared, parked, changelog-line, released, polish.
retry entero En una llamada de agente, las llamadas anteriores de su rol en el Change; 0 en otro caso.
note cadena Lo que hay que leer: las comprobaciones fallidas de una puerta, la nota de una decisión, el comando que ejecutó un agente (/gdd-build), la versión publicada.

El commit de fusión

gdd merge fusiona un Change en la rama principal con un commit cuyo mensaje lleva su registro, así que qué era el Change y quién lo aprobó viaja con el código mientras .gdd/ sigue siendo local. El commit de fusión del mismo Change, recortado:

gdd(cart-total): G3 Merge Gate · Show the cart total

Color: yellow · lane full · type Feature
Approvals: G1 ok (human, 2026-10-30, 1 scenario file(s) sealed)
Decided without the human:
  - Kept the total as an integer
...
Record: .gdd/changes/cart-total/ (local)

Changelog: Added · The cart shows its total
Breaking: no
Línea Cuándo
gdd(<id>): G3 Merge Gate · <title> Siempre.
Color: <color> · lane <lane> · type <type> Siempre.
Approvals: ... Las zonas rojas (Changes rojos), G1 y el plan cuando el registro los tiene; si no, Approvals: none needed.
Reviewer: KO -> OK, y después sus hallazgos Cuando el Change pasó por revisión.
Decided without the human: Las ocho últimas notas decided.
Tokens: in <n> · cache <n> · out <n> · <usd> USD (estimate) · <n> agent call(s) Cuando el log tiene llamadas del Change.
Known debt paid: ..., Known debt lowered: ... Cuando el Change pagó o redujo deuda conocida.
Record: .gdd/changes/<id>/ (local) Siempre.
Changelog: <section> · <line> y Breaking: yes o Breaking: no Trailers de git, en un párrafo propio, cuando el Change tiene línea de changelog.

gdd changelog y gdd release leen los trailers Changelog: y Breaking: de los commits de fusión de main para escribir CHANGELOG.md y elegir la siguiente versión.

Ver también