feat(generator): дефолт профиля — daily-wave, ci стал служебным

- Зачем:
  - менти доставался плоский тестовый профиль ci; учебный профиль
    должен быть один — daily-wave с суточной волной (issue #6).
- Что:
  - дефолт daily-wave во всех точках: форма пульта generator_control,
    launch.py (API и CLI), Config, Makefile, четыре shell-скрипта.
  - автопроверки передают ci явно; контрактный тест пульта теперь
    проверяет сам дефолт Param профиля (через AST), а не подстроку.
  - доки в том же изменении: README, OPERATIONS, TEST_PLAN,
    generator/README, runbook startup-history.
- Проверка:
  - make test (206 + 31 passed) и make lint — зелёные.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
2026-07-22 17:16:07 +03:00
co-authored by Claude Fable 5
parent 5791d42db8
commit b87dde79b7
17 changed files with 78 additions and 54 deletions
@@ -42,6 +42,25 @@ def _declared_param_types() -> dict[str, set[str]]:
return param_types
def _declared_param_defaults() -> dict[str, object]:
param_defaults = {}
for node in ast.walk(_tree()):
if not isinstance(node, ast.Dict):
continue
for key, value in zip(node.keys, node.values, strict=True):
if not (
isinstance(key, ast.Constant)
and isinstance(key.value, str)
and isinstance(value, ast.Call)
and isinstance(value.func, ast.Name)
and value.func.id == "Param"
and value.args
):
continue
param_defaults[key.value] = ast.literal_eval(value.args[0])
return param_defaults
def test_dag_file_exists_and_uses_dynamic_profiles():
"""DAG берёт варианты профилей из PROFILES, а не из ручного списка."""
text = DAG_PATH.read_text(encoding="utf-8")
@@ -55,9 +74,11 @@ def test_dag_file_exists_and_uses_dynamic_profiles():
def test_trigger_form_has_expected_param_enums():
"""Форма запуска ограничивает операции и профили."""
text = DAG_PATH.read_text(encoding="utf-8")
param_defaults = _declared_param_defaults()
assert 'enum=["backfill", "import", "next-day", "check"]' in text
assert "enum=sorted(PROFILES)" in text
assert param_defaults["profile"] == "daily-wave"
assert '"duration": Param(' in text
assert '"artifact_path": Param(' in text
assert '"expected_t_end": Param(' in text