三个都是 config_id='default' 单例配置,首次使用即创建、之后原地更新
(upsert),不需要单独的初始化流程:
- c_concurrency_config_update:新增 src/settings_config.py(
org_concurrency_config 之前完全没人碰过),校验 max_concurrent_goals
落在 1-50。
- c_budget_config_update:budget_guardrail.py 新增 upsert_budget_config()
——跟 U-019 已有的 update_budget_limit_and_resume()(只更新已存在的
行)不是一回事,这个是真正完整的设置页控制器,支持首次创建,沿用
同一套"额度调高后自动恢复 budget_exceeded 阻塞任务"副作用(提取成
_resume_budget_blocked_tasks() 共享)。
- c_log_retention_config_update:同样在 settings_config.py 里,校验
retention_days > 0。
三处校验都在业务层做完整检查,HTTP 层额外兜了 except (InvalidParamError,
TypeError)——payload 数值字段缺失时 None<=0 这类比较会抛 TypeError 而
不是业务异常,两个都要接住才能保证返回干净的 400 而不是裸 500。
backend_server.py 第一次加了 do_PUT。
前端三个页面共享一个 renderSettingsSubnav() 小组件模拟 02-V 原型里的
设置下拉菜单。真实服务器端到端验证过三个 PUT/GET 的完整读写循环。
PH3(人机交互控制台)至此全部完成:U-022~U-030。
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>