feat: DSL→SQL teaching echo — Phase 3 cat-3 caveat (ADR-0038)

Lands the only piece of category-3 prose not already covered by the
existing `client_side.*` notes infrastructure: the `change column …
--dont-convert` *caveat* (ADR-0038 §6, the only Bucket A caveat —
every other category-3 line is illuminating).

`--dont-convert` skips the client-side layer entirely, so the headline
SQL echo (`ALTER TABLE … SET DATA TYPE …`) is the nearest SQL but
*not* equivalent: running the line in advanced mode would convert the
stored values, but the playground left them as-is. The new caveat
states that divergence explicitly.

* New i18n key `client_side.dont_convert_caveat` (no placeholders) —
  registered in keys::KEYS_AND_PLACEHOLDERS.
* New `dont_convert_caveat: bool` field on DslChangeColumnSucceeded,
  set in the runtime when submission_mode is advanced *and* the
  command is ChangeColumnType { mode: DontConvert, .. }. Gated on
  advanced mode because the caveat references "the line above" — the
  echo, which only fires in advanced mode.
* App's handle_dsl_change_column_success emits the caveat line
  between the existing client-side notes and the structure render,
  so it reads alongside the echo, not after the table view.

The other two category-3 lines from §6 (shortid generation,
type-conversion transforms) were already in place via
`client_side.auto_fill_*` / `client_side.transformed*` — those notes
already render after the echo via handle_dsl_add_column_success /
handle_dsl_change_column_success, in the right position per the ADR.
This commit just adds the missing caveat.

Tests: 2014 passed / 0 failed / 1 ignored (pre-existing); clippy
clean. An App-level test pins the rendering order (caveat sits
after the echo, before the structure) and the simple-mode gate
(no caveat without an echo to refer to).

The §4 de-emphasised styled-runs rendering polish remains —
the echo + caveat lines are still plain `[system]` lines.
This commit is contained in:
claude@clouddev1
2026-05-28 08:50:08 +00:00
parent 275c726ad4
commit e6ad1aec3d
5 changed files with 130 additions and 8 deletions
+1
View File
@@ -503,6 +503,7 @@ pub const KEYS_AND_PLACEHOLDERS: &[(&str, &[&str])] = &[
("client_side.auto_fill_add_serial", &["count"]),
("client_side.auto_fill_add_shortid", &["count"]),
("client_side.auto_fill_transition", &["count", "kind"]),
("client_side.dont_convert_caveat", &[]),
("client_side.transformed", &["count"]),
("client_side.transformed_lossy", &["count", "lossy"]),
// ---- Replay command surfaces (ADR-0019 §9 sweep) ----
+9
View File
@@ -918,6 +918,15 @@ client_side:
# non-empty table.
auto_fill_add_shortid: |-
[client-side] {count} row(s) given auto-generated shortid values. In raw SQL this would need an explicit UPDATE to populate.
# `change column … --dont-convert` caveat (ADR-0038 §6 category 3,
# Phase 3). The only category-3 *caveat* — the others are illuminating
# (the headline echo already matches the effect). Here the headline
# SQL (`ALTER TABLE … SET DATA TYPE …`) *would* convert if run, but
# `--dont-convert` skipped the client-side layer, so the line above is
# not equivalent. Fires only in an advanced effective mode (the line
# references "the line above," i.e. the echo).
dont_convert_caveat: |-
[client-side] `--dont-convert` kept the stored values as-is; standard SQL always converts, so running the line above would transform them instead.
# ---- Replay command surfaces (ADR-0019 §9 sweep) ---------------------
replay: