diff --git a/docs/BUG_HISTORY.md b/docs/BUG_HISTORY.md index 24bbacea..eb1f8555 100644 --- a/docs/BUG_HISTORY.md +++ b/docs/BUG_HISTORY.md @@ -8092,11 +8092,11 @@ - 触发条件:API 出生 payload 的 `hour`/`minute` 为 float(`_high_rigor_birth_payload` 的既有口径),且 `birth_time_accuracy` 为 `provisional` 或 `approximate`,因而会走到 `_birth_datetime_from_args`。 - 根因:上游同步把 `_build_birth_time_sensitivity` 无条件接入 consultation_workflow。CLI argparse 的 hour/minute 是 int;API 路径是 float。`datetime()` 不能接受 float,抛 `TypeError`。异常只被 `except ValueError` 包住,于是冒成 500。 - 修复:`_birth_datetime_from_args` 对年月日时分做 `int()` 规范化,不改变 API float 口径。敏感度构建失败时写入 blocked/`not_available` 状态对象并继续 workflow,不再打死整个端点。 -- 验证:`tests/test_consultation_workflow_birth_time_sensitivity.py`(已列入 `CORE_PYTEST_TARGETS`);本地 HTTP 对 career/marriage/wealth/timing/health 与不带敏感度字段的聊天形状均为 200/`success=true`;五份响应喂给 `buildReportEvidenceBundleV2` 得到 5 张 claim card、`blockedSections` 为空。staging quick 门 `585 passed, 1 skipped`。 +- 验证:`tests/test_consultation_workflow_birth_time_sensitivity.py`(已列入 `CORE_PYTEST_TARGETS`);本地 HTTP 对 career/marriage/wealth/timing/health 与不带敏感度字段的聊天形状均为 200/`success=true`;五份响应喂给 `buildReportEvidenceBundleV2` 得到 5 张 claim card、`blockedSections` 为空。staging quick 门 `585 passed, 1 skipped`。staging 上从 web 容器对虚构 smoke 盘 `POST http://api:5200/api/consultation_workflow`(provisional + float 时分)HTTP 200、`success=true`、`birth_time_sensitivity.status=candidate_window_only`,约 74s。产品侧真实 personal_full 仍失败,见 BUG-526,不是本条 TypeError。 - 防复发:float hour/minute 的 API body 必须能走 `execute_consultation_workflow` 且不 500;敏感度层失败必须降级,不得再变成未捕获 `TypeError`。不得把 `_high_rigor_birth_payload` 的 hour/minute 改成 int。 -- 相关记录:无 +- 相关记录:BUG-526 - 复发自:无 -- 修复版本:待发布 +- 修复版本:`7b1354a79bb8e9b92c3c816fdc01f5f8de2860b7`(含本修复的 staging 部署 SHA) ## BUG-525 | 采集题答「没有」后「正在准备下一个问题…」不消失 @@ -8114,3 +8114,20 @@ - 复发自:BUG-491 - 修复版本:待发布 - 编号说明:rebase 到 `origin/staging` 时 BUG-524 已被 consultation_workflow 占用,本条落在 BUG-525。 + +## BUG-526 | accepted 生时的个人报告 worker 直接读已收回权限的校正表,16 秒 calculation_unavailable + +- 状态:investigating +- 首次发现:2026-09-04 +- 最近更新:2026-09-04 +- 影响面:`frontend/src/lib/personal-report-worker.ts` `createProductionWorker` 的 `generate`;`public.agentic_rectification_cases` +- 用户现象:staging 上 standard personal_full 创建成功后约 16 秒失败,`failureCode = calculation_unavailable`,无章节行。表现与 BUG-524 事故码相同,但引擎访问日志里没有 `POST /api/consultation_workflow`。 +- 触发条件:资料 `birth_time_status` 为 `accepted`(不是 `confirmed`),worker 因此去查 `agentic_rectification_cases` 的 `candidate_accepted` 行。 +- 根因:`20260814010000_immutable_skill_registry.sql` 已从该表收回 `service_role` 的表级权限,只许走 security definer RPC。报告 worker 仍 `from("agentic_rectification_cases").select(...)`。Postgres 三次 `permission denied for table agentic_rectification_cases`(与 job 三次 attempt、默认 5s/10s 重试对齐)。查询失败被映射成可重试 `calculation_unavailable`,报告从未调用引擎。 +- 修复:未做。本轮任务书禁止为 BUG-524 改前端 worker。候选方向:`accepted` 已有可用 `active_birth_time` 时不要读这张锁死表;或经允许的 RPC 取候选窗;查询失败时降级为无 range 继续生成,而不是打死整份报告。 +- 验证:staging Postgres 日志三次 permission denied;同期 API 无 consultation_workflow;同机 web→api 虚构 smoke 为 200(BUG-524 已修好)。 +- 防复发:报告 worker 不得再直接 SELECT 已收回 `service_role` 权限的校正表;`calculation_unavailable` 必须能区分「引擎 500」与「可选候选窗读失败」。 +- 相关记录:BUG-524 +- 复发自:无 +- 修复版本:待修复 +- 编号说明:rebase 到 `origin/staging` 时 BUG-525 已被采集拒答占用,本条落在 BUG-526。 diff --git a/docs/tasks/PROGRESS-report-sensitivity-crash-20260904.md b/docs/tasks/PROGRESS-report-sensitivity-crash-20260904.md index da87720f..33e3727e 100644 --- a/docs/tasks/PROGRESS-report-sensitivity-crash-20260904.md +++ b/docs/tasks/PROGRESS-report-sensitivity-crash-20260904.md @@ -9,8 +9,8 @@ | 任务 | 状态 | BUG | | --- | --- | --- | | 1 类型修复 + 降级加固 + 回归测试 | 完成 | BUG-524 | -| 2 staging 部署后真实 personal_full | 待部署 | BUG-524 | -| 3 聊天路径回归确认 | 待部署 | BUG-524 | +| 2 staging 部署后真实 personal_full | 引擎已修好;产品报告被另一处挡住 | BUG-524 / BUG-526 | +| 3 聊天路径回归确认 | 默认模型缺计费配置,未跑到引擎 | BUG-524 | ## 开工复现 @@ -76,3 +76,26 @@ elapsed_ms: 751689 10 passed。 +## Staging 真实验证(2026-09-04) + +`GET https://staging.jyotisha.chat/api/health` → `.deployment.gitCommit` = `7b1354a79bb8e9b92c3c816fdc01f5f8de2860b7`。运行中 API 已含 `int(args.hour/minute)` 与敏感度降级。未提升 main。下文无账号、姓名、出生资料。 + +### 引擎(BUG-524)已在部署树上修好 + +从 web 容器对虚构 smoke 盘 `POST http://api:5200/api/consultation_workflow`(`birth_time_accuracy=provisional`,float 时分):HTTP 200,`success=true`,`birth_time_sensitivity.status=candidate_window_only`,约 74s,响应约 1.2MB。 + +### 任务 2 · 产品 personal_full 未闭环 + +登录后点「生成完整报告」。`request_id` `527f95f3-ac2e-4ed7-9b49-3c6ea4be02e8`:`failed` / `calculation_unavailable`,约 16.5s,job 3/3,进度停在 30%(`generating_report`),无 `personal_report_sections` 行。 + +同期 API 访问日志**没有** `POST /api/consultation_workflow`。Postgres 在 08:59:04 / 08:59:10 / 08:59:20 UTC 三次 `permission denied for table agentic_rectification_cases`,SQL 即 worker 对 `candidate_accepted` 的直接 SELECT。`20260814010000_immutable_skill_registry.sql` 已收回该表的 `service_role` 表级权限。资料状态为 `accepted`,worker 因此走进这张锁死表,从未到达已修好的引擎。记为 **BUG-526**(BUG-525 已被采集拒答占用)。 + +事故行 `85616e32-…`(07:38 UTC)同样是约 18s / 3 次 attempt / 无章节;当时 web 容器已 recreate,无法回收那一窗的 Postgres 句。不能把 07:38 也写成 TypeError,只能说与本次 16s 失败形态相同。 + +任务 2 欠的章节正文、telemetry、`inputTokens` / 2 倍线对照因此仍缺。 + +### 任务 3 · 聊天未跑到引擎 + +新开对话点「时运」芯片。产品提示「当前服务的计费配置尚未完成,本次不会扣点」。web 日志 `reason=feature_pricing_missing`。API 无 consultation_workflow。默认聊天模型缺咨询计费配置,与 BUG-524 无关。 + +