fix: H1a G3 advanced usage shows all valid forms; complete near-miss matrix (ADR-0042)

The /runda DA pass found G3 over-corrected: advanced-mode `create`/`drop`
showed SQL forms only, hiding the DSL fallback forms that are valid input
in advanced mode (verified: `create table Foo with pk`, `drop column …`
parse and dispatch). Per the user decision, the advanced usage block now
shows every form valid in the mode, SQL-primary first, then the DSL
fallback forms — a usage hint must never hide working input. Simple mode
unchanged (DSL forms only).

Matrix completion (closing the residual coverage tail):
- arg-less app commands (help/rebuild/new/load/undo/redo/export/import)
  audited + locked — all reject trailing junk with "expected end of
  input" + usage.
- committed multi-forms (add index/constraint/1:n relationship, drop
  index/constraint/relationship, show table, change column, create index,
  alter table add/drop) audited + locked in
  near_miss_matrix_committed_multiforms — each renders its own
  form-specific missing-keyword message + usage.

Also from the DA pass:
- G2 distinct+all detector empirically verified unique to projection
  start (no misfire at count( / union / union all / select distinct).
- stale `chumsky` comment removed (app.rs import handler).
- ADR-0042 Implementation-outcome section records G1–G4, the
  user-confirmed G3 decision, and the now-complete matrix coverage.

Full suite green (lib 1578 / it 387 / typing_surface_matrix 192); clippy clean.
This commit is contained in:
claude@clouddev1
2026-06-05 18:46:57 +00:00
parent 649fdcb38e
commit 1d4923b15b
4 changed files with 178 additions and 39 deletions
+5 -5
View File
@@ -1338,11 +1338,11 @@ impl App {
},
),
AppCommand::Import { path, target } => {
// The path-bearing import goes through the
// pre-chumsky source-slice (parser.rs), which
// already validated non-empty path. Bare
// `import` returns from chumsky with an empty
// path string — surface the usage error.
// A path-bearing import carries a non-empty path
// from the walker. Bare `import` parses with an
// empty path string — surface the usage hint here
// at dispatch (not a parse error; ADR-0024 replaced
// the old chumsky source-slice path).
if path.is_empty() {
self.note_error(crate::t!("project.import_usage"));
return Vec::new();