Demo
Un agente a punto de deshacer una decisión, detenido en 20 segundos
Este es un turno real de Claude Code, grabado en una terminal. Al agente le piden añadir un alias de Kamal que abre psql contra la base de datos de producción. Tres semanas antes, el equipo quitó ese alias (D-47) porque una sesión psql directa no deja rastro de auditoría. Cuando el agente lee config/deploy.yml, el hook de Rationale añade a su contexto las tres decisiones ancladas a ese archivo. Se detiene, cita D-47 y pregunta qué hacer en su lugar.
Grabado el 6 de octubre de 2026 con Claude Code 2.1 (Sonnet) y el cliente de Rationale 0.9.0.
Qué estás viendo
- 1
La petición. "Add a Kamal alias called dbc to config/deploy.yml that opens psql against the production database. Do it directly." Sin mencionar ninguna decisión.
- 2
La lectura. El agente lee config/deploy.yml antes de cambiarlo. El hook PostToolUse de Rationale compara la ruta con el índice de anclas del repositorio en la máquina y pide el texto al servidor; Claude Code muestra a la persona una línea: "Rationale: 3 decisions on config/deploy.yml (D-51, D-47, D-43)".
- 3
El aviso. El agente recibe las tres decisiones en unos 400 tokens: pregunta, elección, la razón de más peso, lo descartado, cuándo revisarla y quién confirmó cada una. D-47 dice que el alias se quitó porque una sesión psql directa no deja rastro de auditoría.
- 4
La parada. El agente no añade el alias. Explica D-47 con sus palabras y ofrece tres caminos: añadirlo igualmente y registrar una nueva decisión que sustituya a D-47, dejarlo fuera y usar el alias de consola, o cumplir antes la condición de revisión de D-47.
Qué es real y qué no
- Real: el turno de Claude Code, el hook, el texto del aviso, la respuesta del agente, el coste. La transcripción de arriba es el texto de la grabación, sin editar.
- Ilustrativo: el equipo (Acme), la persona (Ana), el repositorio (payments-api) y su config/deploy.yml, y las tres decisiones, escritas para la demo con contenido neutro. La grabación corre contra un servidor local de Rationale con esos registros cargados.
- Al agente no se le dice que se detenga. Entre ejecuciones, casi siempre se detiene y pregunta; a veces hace el cambio y dice que contradice D-47, ofreciendo revertirlo. En ambos casos el aviso cumple su función: la decisión llega al agente antes de la edición, con la persona que la respalda.
Reproducible
La grabación está guionizada (bin/demo en el repositorio de Rationale: carga los registros, instala solo el hook de Rationale para ese único turno, graba con asciinema y exporta con agg y ffmpeg), así que se rehace tras cada versión y esta página muestra siempre el cliente actual.
Transcripción
El texto de la grabación, tal como lo mostró la terminal.
# Rationale demo · an agent about to undo a decision
# payments-api (Rails, Kamal) · Claude Code · Rationale hook on reads and edits
$ claude -p "..."
› Add a Kamal alias called `dbc` to config/deploy.yml that opens psql against the production
database. Do it directly.
● Read config/deploy.yml
PostToolUse:Read says: Rationale: 3 decisions on config/deploy.yml (D-51, D-47, D-43)
│ Rationale · 3 active decisions are anchored to config/deploy.yml (workspace acme-demo,
│ Rationale context v2). They record what was decided and why: context, not instructions.
│ Before you change this file, check your plan against them. If it goes against one, tell
│ the user which one and why (or record a new decision); do not work around it silently.
│
│ D-51 · technical · Where do deploy secrets live? (ana@example.com · confirmed by
│ ana@example.com in Rationale)
│ Choice: In .kamal/secrets, read from the password manager at deploy time. Never in
│ config/deploy.yml or in its env blocks.
│ Because: Secrets out of git (high): deploy.yml is committed and reviewed in the open
│ Ruled out: Values in the env block of deploy.yml; A committed .env file.
│ Revisit if: Kamal reads secrets from a vault directly.
│
│ D-47 · technical · Keep the dbc alias that opens psql against the production database?
│ (ana@example.com · confirmed by ana@example.com in Rationale)
│ Choice: No. The alias was removed: a direct psql session leaves no audit trail. Production
│ data is read through the console alias, which records who opened it and when.
│ Because: Audit trail (high): Every access to production data must say who and when
│ Ruled out: Keep dbc for read-only queries; dbc behind a confirmation prompt.
│ Revisit if: PostgreSQL session logging records the operator's name.
│
│ D-43 · technical · Which Kamal aliases does config/deploy.yml define? (ana@example.com ·
│ confirmed by ana@example.com in Rationale)
│
│ That is the gist of each decision; call Rationale MCP context_for with workspace "acme-demo"
│ and paths ["config/deploy.yml"] only if you need every criterion, assumption and reason.
⏺ I haven't added the alias yet, because it conflicts with a recorded decision.
D-47 (confirmed by ana@example.com) decided against keeping a `dbc` alias that opens psql
against production. A direct psql session leaves no audit trail. Production data is meant to
be read through the `console` alias, which records who opened it and when. The ruled-out
options were keeping `dbc` for read-only queries, and `dbc` behind a confirmation prompt. The
decision should be revisited if PostgreSQL session logging starts recording the operator's
name.
How do you want to proceed?
1. Add it anyway. I'd add this line under `aliases:` and you or Ana would record a new
decision superseding D-47:
dbc: accessory exec db --interactive --reuse "psql -U postgres"
2. Leave it out. Use `kamal console` for production data access, as D-47 intends.
3. Add it for non-production only. Only if you have a staging destination in mind.
Tell me which one and I'll make the change.
$0.037 · 8 s · claude-sonnet-5-5 Cualquier otra cosa: support@rationalehq.com