Merge codex/pr2-final-response into staging integration

This commit is contained in:
Jesse_Chen
2026-08-15 12:27:00 +08:00
26 changed files with 1643 additions and 73 deletions
+4 -4
View File
@@ -2749,14 +2749,14 @@
- 状态:resolvedstaging candidate
- 首次发现:2026-08-11
- 最近更新:2026-08-11
- 最近更新:2026-08-14
- 影响面:`POST /api/consult` 的个人/一般咨询、Mastra Agent、浏览器流式活动状态、咨询消息执行回执与计费结算;production 默认路径不变。
- 用户现象:回答可以生成,但服务端在 Agent stream 前已经完成咨询工作流,Agent 只是复述结果;Web 只能按“有无正文”猜测状态,无法证明 Agent 实际加载 Jyotish Skill 或调用排盘工具。
- 触发条件:咨询进入旧 runtime;route 直接执行 `runConsultationWorkflow()`,再把大段结果塞入 prompt,且仅返回 `text/plain`
- 根因:编排权在 Next.js route,不在 Agent;个人 Agent 未绑定服务器排盘工具,Skill/tool 执行合同和公开事件协议均不存在。若直接透传 `fullStream`,还会泄露 reasoning、工具参数/结果、出生资料或 Skill 内容。
- 修复:增加 `legacy|canary|enabled` runtime 开关;新路径由带 Jyotish Skill 的 Mastra Agent 调用请求级 `run-jyotish-consultation`,工具参数只允许 question/theme,出生资料始终由服务器上下文绑定,并以请求内 Promise 保证重复调用只计算一次。服务端把 `fullStream` 清洗为 NDJSON,仅公开安全的 run/Skill/tool/activity/answer 事件;Skill 和主工具合同未完成时最多重试一次,仍失败则释放预留点数且不保存成功消息。Web 按 content-type 保留 legacy `text/plain` 回滚路径,新路径只累积 `answer.delta`,收到 `run.completed` 后保存 workflow/execution receipt,并用服务器 activity 驱动状态 UI。浏览器断线后服务端继续完成互斥结算。
- 验证:聚焦回归覆盖动态 Skill 工具、General Agent 无个人排盘工具、服务器绑定参数、并发幂等、unverified precise timing blocked、私有 chunk 过滤、任意 NDJSON 边界、合同完成前正文阻塞、失败不保存、真实 activity UI、execution receipt 持久化、legacy 流与断线结算合同;最终命令和结果记录在本次 staging 发布回报
- 防复发:个人咨询不得在 Agent stream 前直接执行主 workflow;不得把出生资料放入模型工具参数;公开流不得包含 reasoning、provider metadata、工具输入/结果或 Skill 正文;只有 `run.completed` 可进入成功消息持久化,步骤最多 32 个,计算与结算都必须请求内幂等。
- 修复:增加 `legacy|canary|enabled` runtime 开关;新路径由带 Jyotish Skill 的 Mastra Agent 调用请求级 `run-jyotish-consultation`,工具参数只允许 question/theme,出生资料始终由服务器上下文绑定,并以请求内 Promise 保证重复调用只计算一次。服务端把 `fullStream` 清洗为 NDJSON,仅公开安全的 run/Skill/tool/activity/answer 事件;Skill 和主工具合同未完成时最多重试一次,仍失败则释放预留点数且不保存成功消息。Web 按 content-type 保留 legacy `text/plain` 回滚路径,新路径只累积 `answer.delta`,收到 `run.completed` 后保存 workflow/execution receipt,并用服务器 activity 驱动状态 UI。浏览器断线后服务端继续完成互斥结算。2026-08-14 进一步加入 `ConsultationPlan v2`:服务端在真实点数预留前用最终 profile mode、精度边界和单次成本上限校验 plan;同一个 pre-reserve plan 原样传给 Agent 工具与 legacy workflow,模型提供的 question/theme 不能重建或改变 plan。Python 仅接受服务端 route allowlist 的完整 metadatapartial metadata 不得通过删除 `plan_version` 降级为 legacy,且 plan 只能收紧、不能授予精确应期权限。`ConsultationPlan` 在创建时对对象和嵌套数组执行深冻结,确保扣点后的 workflow 不能改写边界。模型 evidence packet 不再接收任意对象后依赖 denylist 清洗,而是分别对 `natal_foundation``domain``timing``validation``evidence_contract` 执行显式业务字段 allowlist 投影;主题 evidence 的 `details` 只选择批准字段,不整体透传,从结构上阻断出生、位置、账务、身份、权限和工具 payload 的别名绕过。
- 验证:聚焦回归覆盖动态 Skill 工具、General Agent 无个人排盘工具、服务器绑定参数、并发幂等、unverified precise timing blocked、私有 chunk 过滤、任意 NDJSON 边界、合同完成前正文阻塞、失败不保存、真实 activity UI、execution receipt 持久化、legacy 流与断线结算合同;`ConsultationPlan v2` 的 TypeScript 定向测试 49/49、Python 合同与 API dry-run 测试 27/27 通过;回归覆盖 plan 与嵌套数组冻结,以及 `reported_time``lng``utc_offset``account_balance``entitlements``access_scopes` 六类恶意嵌套别名不进入模型 packet,同时保留本命、Shadbala、Ashtakavarga、Dasha、Narayana 与 evidence status。目标 ESLint、Python `py_compile``git diff --check` 通过;全量 `tsc --noEmit` 仅保留与本任务无关的既有 migration fixture 字段和 staging workflow 正则 target 错误
- 防复发:个人咨询不得在 Agent stream 前直接执行主 workflow;不得把出生资料放入模型工具参数;公开流不得包含 reasoning、provider metadata、工具输入/结果或 Skill 正文;只有 `run.completed` 可进入成功消息持久化,步骤最多 32 个,计算与结算都必须请求内幂等。版本化 plan metadata 必须 all-or-none,扣点前校验的 plan 必须作为同一不可变对象进入实际 workflow;`required_layers`/`claim_boundary` 只表示 allowlist 合同,不能冒充 layer 已执行或 evidence gate 已通过。
- 回滚:仅将 staging 的 `CONSULTATION_AGENTIC_RUNTIME` 设为 `legacy`;无需回滚数据库或修改 production。
- 相关记录:BUG-161
- 复发自:历史咨询 runtime