diff --git a/app/web/main.py b/app/web/main.py
index 8836d72..fc5702b 100644
--- a/app/web/main.py
+++ b/app/web/main.py
@@ -594,14 +594,32 @@ async def submit(request: Request) -> HTMLResponse:
)
# Dataset came from the picker via dataset_id; fall back to explicit
- # generator_path / generator_kwargs if a client posts those directly.
- dataset_id = data.get("dataset_id") or ""
- if dataset_id and dataset_id in DATASET_META:
+ # generator_path / generator_kwargs only when dataset_id is absent entirely
+ # (API consumers). UI form posts always carry the key, so an empty value
+ # means the user hit submit without picking — reject rather than silently
+ # defaulting to s_curve.
+ if "dataset_id" in data:
+ dataset_id = data.get("dataset_id") or ""
+ if not dataset_id:
+ return HTMLResponse(
+ "
pick a dataset first (§ 1 above)
",
+ status_code=400,
+ )
+ if dataset_id not in DATASET_META:
+ return HTMLResponse(
+ f"
unknown dataset: {dataset_id}
",
+ status_code=400,
+ )
meta = DATASET_META[dataset_id]
generator_path = meta["path"]
generator_kwargs = dict(meta["kwargs"])
else:
- generator_path = data.get("generator_path") or "sklearn.datasets.make_s_curve"
+ generator_path = data.get("generator_path") or ""
+ if not generator_path:
+ return HTMLResponse(
+ "