Initial planning docs: CLAUDE.md and ADRs 0000-0008

Captures up-front design decisions for RDBMS Playground:
stack (Rust + Ratatui + SQLite), input modes, project file
format, type vocabulary, undo snapshots and replay log,
sharing/export, and testing approach. ADR-0000 establishes
the ADR practice itself and mandates index upkeep alongside
any ADR change.
This commit is contained in:
claude@clouddev1
2026-05-07 09:27:31 +00:00
commit 3a0c03d781
11 changed files with 785 additions and 0 deletions
@@ -0,0 +1,89 @@
# ADR-0006: Undo snapshots and replay log
## Status
Accepted
## Context
Two related features address the same underlying need — making the
application safe and reproducible for learners:
1. **Accidental destruction.** A student typing `DROP TABLE
Customers` and then realising what they did is a near-certain
event in this audience. Without a recovery path, the experience
is hostile and the learning moment is lost to panic.
2. **Replay and scripting.** A persistent record of every
executed command is useful for tutorials, debugging, sharing
reproducible problem reports, and rebuilding a project from a
blank slate.
Both features are cheap to implement and high-leverage.
## Decision
### Undo snapshots
Before any destructive operation — `DROP`, `DELETE`, `TRUNCATE`,
schema-rebuild migrations, restore, etc. — the application takes a
snapshot of the database using SQLite's online backup API into a
ring buffer of recent snapshots (size to be tuned; initial target
N = 10).
An `undo` command (available in both modes as an app-level
command per ADR-0003 — no sigil) restores the most recent
snapshot. Each undo step is itself snapshotted to keep `redo`
possible.
**Undo requires confirmation.** Snapshots are taken only before
destructive operations, so the "current" state may include
non-destructive work (inserts, updates, schema additions) done
since the last snapshot. Restoring a snapshot therefore *can*
discard data the user has not been explicitly warned about.
Before restoring, the application displays a confirmation prompt
that includes:
- The snapshot's timestamp (local time, with a relative form such
as "12 minutes ago").
- A short summary of the operation that triggered the snapshot
(the command text, e.g. `DROP TABLE Customers`).
- A summary of changes that will be discarded if the undo
proceeds — at minimum, counts of rows added/modified/deleted
per table and any schema changes since the snapshot.
The user must explicitly confirm. A keyboard shortcut for
"confirm" is provided so power users are not slowed down, but
there is no flag to suppress the prompt — undo is rare enough,
and consequential enough, that the prompt is always shown.
### Replay log (`history.log`)
Every successfully executed command — DSL or SQL — is appended to
`history.log` in the project directory, one command per record,
with a timestamp and the resulting status. The format is
deliberately simple and human-readable so it can be hand-edited
and replayed.
The same format serves three purposes:
- A persistent input history surfaced via the TUI history feature.
- A scripting format: `.commands` files (or `history.log` itself)
can be replayed via a `replay` command.
- A reproducible bug-report artifact when a project is shared.
The log is append-only during a session. It is **not** the
authoritative state of the project (that lives in `project.yaml`
+ `data/`, ADR-0004) — it is an audit and replay trail.
## Consequences
- Snapshots add modest overhead per destructive operation. The
cost is bounded; learners care about safety far more than
microseconds.
- The ring buffer size must be tuned later based on realistic
database sizes; an initial value is fine for now.
- The replay log enables a future `replay` / scripting feature
with no additional storage commitment.
- Tutorial authors gain a natural "starter script" format for
exercises.