Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016P5RoqzmUQEbeC2qjAkeGr
6.5 KiB
6.5 KiB
任务书 · consultation_workflow 全量 500(出生时间敏感度 float 崩溃)(2026-09-04)
基线:origin/staging @ 285c5722(开工时 git fetch 后以 origin/staging HEAD 为准)。
事故实证
- 2026-09-04 07:38 UTC,staging 真实 personal_full(requestId
85616e32-5a5d-4ed8-b75b-7778dabff4ad,5 主题含新默认health)failed,failureCode =calculation_unavailable。 - 委托方已在最新
origin/staging(285c5722,与部署45bdb63e同源)本地完整复现:本地起引擎后按报告 worker 的真实输入(5 主题 +birth_time_accuracy: "provisional"+representative_time)调/api/consultation_workflow,5/5 全部 HTTP 500 → 前端ConsultationWorkflowError→ worker 抛calculation_unavailable→ job 3 次尝试全败。 - 引擎 traceback(每次请求相同):
File "scripts/jyotish_api_server.py", line 2160, in execute_consultation_workflow
birth_time_sensitivity = _load_local_module('jyotish_engine')._build_birth_time_sensitivity(sensitivity_args)
File "scripts/jyotish_engine.py", line 2170, in _build_birth_time_sensitivity
center = _birth_datetime_from_args(args)
File "scripts/jyotish_engine.py", line 9752, in _birth_datetime_from_args
return datetime(args.year, args.month, args.day, args.hour, args.minute, _arg_second(args))
TypeError: 'float' object cannot be interpreted as an integer
根因(已定位并本地验证修复)
_high_rigor_birth_payload(jyotish_api_server.py:4726)历来把hour/minute解析为 float(_get_float,API 路径的历史口径,下游算小数时角没问题)。- 上游同步
a7041529(09-04 02:11 合入)在execute_consultation_workflow里无条件执行_build_birth_time_sensitivity(sensitivity_args)(:2158-2160,不管请求带不带敏感度字段),其中_birth_datetime_from_args(jyotish_engine.py:9752)拿 float 的hour/minute直接构造datetime()→TypeError。CLI/argparse 路径的 hour/minute 是 int,所以上游在 CLI 侧自测不炸;API 路径必炸。 - 异常只被
except ValueError包住,TypeError直接冒成 500。 - 影响面是全量:
/api/consultation_workflow的每一个调用都 500——不只报告,聊天的深度咨询工具链同样走这个端点。部署45bdb63e(含a7041529)起,该端点在 staging 上完全不可用。 - 委托方已本地验证一行修复:
_birth_datetime_from_args改为datetime(int(args.year), int(args.month), int(args.day), int(args.hour), int(args.minute), _arg_second(args))后重跑同一复现,5/5 主题成功,bundle 产出 5 张 claim card(health归一为health_pressure)、blockedSections 为空。
与其他在途工作的关系
docs/tasks/TASK-upstream-sync-fix-20260903.md的修复在用户侧工作树完成但未提交,其十主题 HTTP smoke 是在基线779717f4(早于a7041529)跑的,当时引擎还没有本崩溃——两单不矛盾,本单是独立 P0,可先行合入;执行方若同时持有两个工作树,注意 rebase 顺序即可。- 报告链路前三轮修复(varga 形状 / Transit / karakas / writer 预算与隔离)均已验收,本崩溃与它们无关,是上游同步引入的回归。
硬红线
- 修复必须在
_birth_datetime_from_args或sensitivity_args构造处做类型规范化,不得把_high_rigor_birth_payload的 float 口径改成 int——那是聊天/排盘路径的既有合同,动它影响面不可控。 _build_birth_time_sensitivity是辅助证据层:除类型修复外,将 :2158-2160 的异常处理加固为降级不崩全局——构建失败时把birth_time_sensitivity置为 blocked/not_available 状态对象并继续 workflow(BadRequest语义保留给真正的输入非法)。敏感度层的失败不允许再打死整个端点。- 必须加回归测试:float
hour/minute的 API body 走execute_consultation_workflow不 500,且birth_time_sensitivity输出正确;测试用虚构 smoke 出生数据。 - 不改
.gitea/workflows/**;不提升 main;前端不需要改动(calculation_unavailable的 worker 语义是对的)。 - Python 测试用
.venv真实跑过;python3 scripts/run_quality_gate.py按仓内现行门跑。
开工前置
git fetch origin --prune
git worktree add -b codex/report-sensitivity-crash-20260904 \
../.worktrees/report-sensitivity-crash-20260904 origin/staging
读 docs/BUG_HISTORY.md(本单与上游同步 a7041529 / c2f23131 直接相关)。
复现与验收(同一方法)
本地起引擎 .venv/bin/python scripts/jyotish_api_server.py --port 5200,用虚构出生数据(1993-06-15 10:30,lat 36.42 / lon 114.21 / tz 8)对 career / marriage / wealth / timing / health 各发一次 /api/consultation_workflow(body 含 birth_time_accuracy: "provisional"、representative_time: "10:30"):
- 修复前:5/5 HTTP 500,traceback 同上(确认复现)。
- 修复后:5/5
success=true;birth_time_sensitivity字段存在且状态合法;喂给buildReportEvidenceBundleV2得 5 张 claim card、blockedSections 空。 - 另发一次不带敏感度字段的请求(聊天路径形状),确认同样 200。
任务
- (P0)类型修复 + 降级加固 + 回归测试(见硬红线 1–3)。
- (P0)staging 部署后真实验证:health SHA 对齐后,真实生成一份 standard personal_full(5 主题默认)——这同时是前几轮顺延至今的任务 4:四/五章有正文、telemetry 无
length、≥3 处 writer 输出回溯 bundle、每章实测inputTokens/墙钟对照docs/tasks/PROGRESS-report-skill-parity-20260901.md的 2 倍线裁决。取证要快——容器 recreate 会带走日志窗口(09-02 已吃过一次亏)。 - (P1)聊天路径回归确认:staging 上发一次深度咨询,确认聊天侧 consultation 恢复正常。
收尾
PROGRESS-report-sensitivity-crash-20260904.md(按仓内现行位置放docs/tasks/);docs/BUG_HISTORY.md条目(编号对远端确认)。- 推送后核对
https://staging.jyotisha.chat/api/health的.deployment.gitCommit;流水线约 20 分钟。
交付物清单
- 修复 diff(类型规范化 + 敏感度层降级)+ 回归测试
- 复现方法修复前后对照(5/5 500 → 5/5 success)
- 部署后真实报告:章节正文、telemetry、回溯抽查、实测 tokens/墙钟 2 倍线对照
- 聊天路径恢复确认
- BUG_HISTORY、PROGRESS、质量门实际输出