{ "request_id": "req-T2", "task_id": "T2", "title": "Pydantic v2 — replace @dataclass with BaseModel", "status": "ready_for_review", "goal": "Заменить ручную сериализацию на pydantic.BaseModel, добавить валидацию", "changes": { "summary": "Все 7 моделей domain/ переведены с @dataclass на pydantic.BaseModel. Удалены ручные to_dict()/from_dict() — заменены на model_dump(mode='json')/model_validate(). Добавлены field_validators: Account.balance >= 0, Transaction.amount != 0, RecurringCashflow.amount != 0 и frequency ∈ {daily,weekly,monthly,yearly}, Liability.interest/payment >= 0, ExchangeRate.rate > 0, ForecastScenario.multipliers >= 0. UUID в JSON автоматически сериализуется как str. excel_sync.py адаптирован на model_validate(). Тесты test_model.py и test_currency.py обновлены. pyproject.toml: pydantic>=2.0.", "commits": ["c765f36"], "files_changed": [ "domain/account.py, asset.py, currency.py, liability.py, recurring.py, scenario.py, transaction.py, model.py", "infrastructure/sync/excel_sync.py", "tests/test_model.py, tests/test_currency.py", "pyproject.toml" ] }, "verification": { "tests_passed": "63/63", "validators_work": "Account negative balance, Transaction zero amount, ExchangeRate negative rate — all rejected", "uuid_in_json_as_str": true, "round_trip": "ok", "cf_init_works": true, "cf_forecast_works": true, "cf_scenario_works": true }, "fulfills_ac": [ "Все модели domain/ — наследники pydantic.BaseModel", "Удалены ручные to_dict() и from_dict()", "UUID в JSON сериализуется как строка", "Валидация работает (balance, amount, rate, frequency)", "Excel-sync адаптирован под pydantic", "pytest 63/63" ] }