docs: plan dynamic birth time rectification

This commit is contained in:
Jesse_Chen
2026-07-18 23:51:15 +08:00
parent 556d63065d
commit 55af56c8bc
2 changed files with 1608 additions and 305 deletions
File diff suppressed because it is too large Load Diff
@@ -1,314 +1,386 @@
# Agent 引导式生时校正设计
# 动态选择 Agent 生时校正设计
日期:2026-07-18
状态:设计已确认,等待用户复核书面规格
状态:设计已确认,可以实施
## 1. 目标
将现有固定问题和表单为主的生时校正,改为“Agent 对话引导 + 结构化确认卡片 + 确定性旅程编排”的混合流程。
将现有固定领域、固定轮数、自然语言输入后再次确认日期”的生时校正,替换为“动态选择 Agent + 确定性候选评分”的混合流程。
核心原则:
> 确定性模块决定下一步做什么,Agent 决定怎样向用户表达
> 大模型根据当前候选差异和既往回答动态生成下一道问题与可点击选项;确定性占星计算负责重新评分、缩小候选范围和执行应用安全门
Agent 可以解释、追问、理解自然语言并生成待确认草稿,但不得选择候选时间、计算置信度、决定路由、修改安全门或直接应用出生时间
用户默认只需点击选项。系统不预先承诺固定题数,不因一次低置信结果从头重问,也不让大模型凭叙述直接猜出生分钟
## 2. 已确认的产品决策
- 采用对话与操作卡片混合体验
- 从第一题开始使用确定性自适应问题,不再固定展示首轮三题
- 基础阶段以三条已确认经历、至少两个领域为评分门槛;如果用户只能提供一至两条,则保存宽候选范围并结束
- 首次评分不足后,最多进行三轮自适应追问
- 每轮只问一个当前信息价值最高的问题
- 用户可以自然语言回答,Agent 生成待确认的结构化草稿
- 用户确认卡片后,证据才进入评分
- 低置信度最多追问三轮后终止并保存候选范围;
- 中等置信度保存候选区间,不应用具体分钟
- 较高置信度必须经过用户明确确认,才能更新当前排盘时间。
- 不再使用固定五个经历领域或固定三轮追问作为正常业务流程
- 每轮只展示一道由大模型动态生成的问题和 2–4 个主要选项
- 每题固定提供“不确定 / 不记得”和“都不符合”
- 点击主要选项后立即保存并重新评分,不出现草稿页或二次确认
- 点击“都不符合”时才展开可选的简短补充输入
- 补充文字只帮助 Agent 生成新的可点击选项,不直接进入候选评分
- 是否继续由当前候选差异、信息增益和评分变化决定,不由公开轮数决定
- 用户可以随时暂停或主动结束并保存当前候选范围;
- 终态不能自动回到提问状态;开始新评估必须是用户明确选择的新动作
- 服务端保留 10 个有效问题的隐藏异常安全上限,但不向用户显示,也不作为正常结束标准;
- 低、中置信结果只能保存范围;较高置信结果仍需用户明确确认后才能更新当前排盘时间。
## 3. 非目标
## 3. 非目标与安全边界
- 不让大语言模型直接决定真实出生分钟;
-根据用户聊天语气、性格描述或未确认叙述评分
- 不让大模型直接输出、选择或应用出生分钟;
-让大模型设置置信度、评分权重或候选排序
- 不根据聊天语气、性格标签或未经结构化选择的文字评分;
- 不把内部一致性描述为已证明的历史真实分钟;
-在本次设计中降低现有置信度安全门;
-通过提示词、前端参数或模型建议降低现有应用安全门;
- 不把隐藏安全上限展示成“必须回答十题”;
- 不将生时校正接入按消息扣费的正式咨询入口;
- 不以外部 oracle 尚未闭环的结果宣称实证准确率。
- 不以尚未闭环的外部 oracle 或真实案例校准宣称实证准确率。
## 4. 用户旅程
```mermaid
flowchart TD
A["用户提交日期、地点和大致时间范围"] --> B["确定性模块扫描候选时间"]
B --> C["选择区分度最高的基础证据领域"]
C --> D["Agent 一次询问一个中性问题"]
D --> E["用户自然语言回答"]
E --> F["Agent 生成结构化事件草稿"]
F --> G["用户确认或修改卡片"]
G --> H["保存已确认证据"]
H --> I{"基础证据是否满足最低要求"}
I -->|"否,仍有未问领域"| C
I -->|"否,已穷尽基础领域"| J["保存宽候选范围并结束"]
I -->|"是"| K["确定性评分"]
K --> L{"置信度结果"}
L -->|"低且自适应轮数小于 3"| M["选择下一条最高信息量问题"]
M --> D
L -->|"低且已满 3 轮"| N["保存候选范围,不应用具体分钟"]
L -->|"中等"| O["保存较窄候选区间,可日后继续"]
L -->|"较高"| P["展示候选时间确认卡"]
P --> Q{"用户是否明确确认"}
Q -->|"否"| O
Q -->|"是"| R["设为当前排盘时间"]
A["用户提交日期、地点和已知的大致时间"] --> B["确定性引擎扫描候选时间"]
B --> C["生成候选差异与可区分机会"]
C --> D{"是否仍有高信息量问题"}
D -->|"有"| E["动态选择 Agent 生成一道问题和选项"]
E --> F["服务端校验问题、选项和证据映射"]
F --> G["用户点击一个选项"]
G --> H["保存结构化选择并立即重新评分"]
H --> I{"停止条件是否满足"}
I -->|"否"| C
I -->|"达到较高置信"| J["展示候选时间确认卡"]
I -->|"无信息增益或用户结束"| K["保存当前候选范围并结束"]
J --> L{"用户是否明确确认"}
L -->|"是"| M["设为当前排盘使用时间"]
L -->|"否"| K
```
### 4.1 基础证据阶段
### 4.1 默认点击路径
问题规划器从学业、搬迁、关系、事业、健康压力五个领域中按信息价值排序,一次选择一个尚未询问的领域。每个领域最多询问一次,避免基础阶段无限循环
每轮只出现一个主任务。用户点击选项后,客户端立即进入“正在缩小候选范围”,完成后显示下一题或结果
基础阶段满足以下条件后进入评分
默认路径没有
- 至少三条已确认事件
- 至少覆盖两个领域。
- 自由文本必填框
- 日期精度下拉框;
- 经历草稿页;
- “整理为草稿”按钮;
- 对同一答案的再次确认;
- 独立的“比较候选时间”按钮。
如果五个领域已询问完仍不满足最低要求,流程终止为“基础证据不足”,保存用户资料和宽候选范围,不伪造低精度分钟。
### 4.2 不匹配路径
### 4.2 自适应追问阶段
用户点击“都不符合”后,可以填写一句简短补充。补充内容只进入当前案件的 Agent 上下文。Agent 必须把它转换成新的结构化选择题;只有用户随后点击了服务端校验通过的选项,才形成评分证据。
首次评分为低置信度时,确定性问题规划器最多再提出三条问题。每次展示一条问题即消耗一轮;用户选择“不记得”或“跳过”同样消耗该轮,以保证流程有确定上限。
### 4.3 结束路径
用户确认新证据后,系统自动重新评分并返回下一动作。用户不再需要点击独立的“比较候选时间”按钮
正常结束依据评分和信息增益,不依据固定题数。结束后案件持久化为终态。刷新、重新登录或换设备都恢复结果页,不得自动创建新案件或重新显示第一题
## 5. 模块边界
## 5. 混合架构
```mermaid
flowchart TD
UI["聊天界面与确认卡片"] --> AG["BirthTimeGuideAgent"]
AG --> JT["BirthTimeJourney 编排器"]
JT --> QP["确定性问题规划器"]
JT --> SE["候选评分引擎"]
JT --> DB["案件与证据存储"]
AG --> DE["事件草稿提取器"]
DE --> UI
UI -->|"用户确认后的结构化证据"| JT
CE["确定性候选引擎"] --> DP["CandidateDifferencePacket"]
DP --> AG["DynamicChoiceAgent"]
AG --> V["问题与选项校验器"]
V --> UI["单题选择界面"]
UI --> AN["结构化 ChoiceAnswer"]
AN --> JT["BirthTimeJourney 编排器"]
JT --> CE
JT --> DB["案件、问题、回答与评分存储"]
```
### 5.1 `BirthTimeJourney`
### 5.1 确定性候选引擎
它是唯一的流程决策者,负责:
候选引擎负责:
- 当前状态
- 下一动作
- 基础阶段进度和自适应轮数
- 证据确认状态
- 候选评分与置信度
- 保存、确认和应用权限
- 恢复时的状态规范化。
- 扫描当前候选时间
- 计算候选分组、领先幅度、区间宽度和必要计算层
- 生成仍可区分候选的机会集合
- 为每个机会提供服务端证据分区和预估信息增益
- 接收结构化选择并重新评分
- 决定低、中、高置信度和候选应用权限
统一返回结构:
候选引擎不负责面向用户的表达。
### 5.2 `CandidateDifferencePacket`
候选引擎向 Agent 提供最小必要差异包:
```ts
type JourneyTurn = {
type CandidateDifferencePacket = {
readonly caseId: string;
readonly snapshot: JourneySnapshot;
readonly nextAction: NextAction;
readonly progress: {
readonly phase: "baseline" | "adaptive" | "result";
readonly baselineDomainCount: number;
readonly confirmedEvidenceCount: number;
readonly adaptiveRound: number;
readonly maxAdaptiveRounds: 3;
};
readonly permissions: {
readonly canScore: boolean;
readonly canSaveCandidate: boolean;
readonly canConfirmCandidate: boolean;
};
readonly turnVersion: number;
readonly scoringVersion: string;
readonly currentRange: TimeRange;
readonly opportunities: readonly QuestionOpportunity[];
readonly askedQuestionFingerprints: readonly string[];
readonly candidatePartitionFingerprints: readonly string[];
readonly recentRangeHistory: readonly TimeRange[];
};
type QuestionOpportunity = {
readonly opportunityId: string;
readonly dimensionCode: string;
readonly neutralContext: string;
readonly estimatedInformationGain: number;
readonly partitions: readonly EvidencePartition[];
};
```
新协议用 `canConfirmCandidate` 表示候选已通过确定性安全门,并允许用户提交明确确认。确认接口在同一个服务端事务中更新 `active_birth_time` 和案件状态;不再向 Agent 或前端暴露一个容易被误解为“直接应用”的独立 `canApply` 动作。旧响应中的 `canApply` 仅在兼容层读取,不能作为新流程的权限来源
`EvidencePartition` 和内部候选支持方向不向客户端暴露。Agent 只能引用服务端提供的分区标识,不能发明评分权重或候选时间
### 5.2 确定性问题规划器
问题规划器读取候选分组、已确认的证据领域、已经问过的问题和剩余轮数,并返回一条 `QuestionSpec`
```ts
type QuestionSpec = {
readonly questionId: string;
readonly phase: "baseline" | "adaptive";
readonly domain: "education" | "relocation" | "relationship" | "career" | "health_pressure";
readonly requestedPrecision: readonly ("day" | "month" | "year")[];
readonly allowUnknown: true;
readonly purposeCode: string;
readonly plannerVersion: string;
};
```
问题价值由版本化规则确定:
```text
问题价值 =
候选组差异程度
+ 尚未覆盖领域奖励
+ 可获得日期精度奖励
- 已重复问题惩罚
- 回答负担
```
`purposeCode` 仅用于服务端审计,不向用户暴露哪个答案可能支持哪个候选,避免诱导和事后故事拟合。
### 5.3 `BirthTimeGuideAgent`
### 5.3 `DynamicChoiceAgent`
Agent 负责:
- `QuestionSpec` 表达为自然、简短、中性的单个问题
- 解释为什么需要日期和精度
- 将自然语言整理为待确认草稿
- 对低、中、高结果做不越权的解释
- 根据 `nextAction` 引导用户继续、暂停或确认
- 从当前机会集合中选择最适合用户回答的一项
- 结合既往选择生成简短、中性、不诱导的问题
- 为服务端分区生成 2–4 个容易点击的用户文案
- 在“都不符合”后根据补充信息重新组织问题
- 当所有剩余机会都低价值时返回 `no_useful_question` 建议
Agent 只允许调用
Agent 不负责
- 获取当前 `JourneyTurn`
- 提交事件草稿
- 记录“不记得/跳过”
- 暂停案件
- 重新读取最新状态
- 生成候选时间
- 修改证据分区
- 决定评分、置信度或应用权限
- 根据选项文案暗示哪个答案支持哪个候选
- 把补充文字直接转换成已评分证据
Agent 不允许:
### 5.4 问题与选项校验器
- 提交已确认证据;
- 直接运行或覆盖评分;
- 设置置信度;
- 保存、确认或应用候选时间;
- 修改 `nextAction`、轮数或权限;
- 根据未确认聊天内容选择出生分钟。
模型输出必须经过严格结构解析:
证据确认和候选确认只能来自结构化 UI 动作,并在服务端再次校验 `turnVersion` 和权限。
```ts
type DynamicChoiceQuestion = {
readonly questionId: string;
readonly opportunityId: string;
readonly prompt: string;
readonly options: readonly ChoiceOption[];
readonly questionFingerprint: string;
readonly candidatePartitionFingerprint: string;
};
### 5.4 事件草稿提取器
用户自然语言只用于生成草稿:
```json
{
"domain": "career",
"precision": "month",
"date": "2023-04",
"status": "draft"
}
type ChoiceOption = {
readonly optionId: string;
readonly label: string;
readonly partitionId: string;
};
```
提取器不得补猜缺失月份、日期或事件类型。字段不完整时,卡片显示缺失项,由用户补全。只有用户点击“确认并用于校正”后,状态才变为 `confirmed` 并进入评分输入。
服务端必须验证:
## 6. `NextAction` 协议
- `opportunityId` 属于当前差异包;
- 每个 `partitionId` 属于该机会;
- 主要选项数量为 24
- 文案长度、内容和中性约束合法;
- 问题指纹和候选分组指纹没有重复;
- 问题仍对应当前 `turnVersion` 和评分版本。
`NextAction` 使用可穷尽判别的联合类型:
### 5.5 `BirthTimeJourney`
Journey 是唯一的状态决策者,负责:
- 持久化当前问题及完整选项,确保刷新后不重新生成;
- 接收用户点击并从服务端读取对应证据分区;
- 创建幂等评分任务;
- 应用停止规则;
- 持久化问题、回答、候选变化和终态;
- 拒绝终态自动转回提问;
- 管理候选保存、候选确认和当前排盘时间更新权限。
## 6. 状态与协议
### 6.1 `NextAction`
```ts
type NextAction =
| { readonly kind: "ask_baseline_evidence"; readonly question: QuestionSpec }
| { readonly kind: "ask_adaptive_evidence"; readonly question: QuestionSpec }
| { readonly kind: "review_evidence_draft"; readonly draftId: string }
| { readonly kind: "generate_dynamic_question" }
| { readonly kind: "ask_dynamic_choice"; readonly question: DynamicChoiceQuestion }
| { readonly kind: "clarify_unmatched_answer"; readonly questionId: string }
| { readonly kind: "score_pending"; readonly jobId: string }
| { readonly kind: "retry_question_generation" }
| { readonly kind: "retry_scoring"; readonly jobId: string }
| { readonly kind: "present_low_result"; readonly resultId: string }
| { readonly kind: "present_low_result"; readonly resultId: string | null }
| { readonly kind: "present_medium_result"; readonly resultId: string }
| { readonly kind: "request_candidate_confirmation"; readonly resultId: string }
| { readonly kind: "ready"; readonly activeTime: string }
| { readonly kind: "paused" };
```
系统保持以下不变量:
### 6.2 进度
- 每个非终态快照必须有一个合法的可继续动作;
- 每个终态必须有结果说明和至少一个合法后续操作;
- `nextAction` 与快照在同一版本中写入;
- Agent 文案不是状态来源;
- 客户端不得从文案推断下一步。
界面不再显示固定轮数。新的进度只描述已发生的事实:
## 7. 对话与界面
Agent 每次只问一个问题。回答后显示内联确认卡:
```text
工作或身份变化
时间:2023 年 4 月
精度:月份
[修改] [确认并用于校正]
```ts
type JourneyProgress = {
readonly phase: "question" | "clarification" | "scoring" | "result" | "ready" | "paused";
readonly answeredCount: number;
readonly effectiveAnswerCount: number;
readonly currentRange: TimeRange;
readonly previousRange: TimeRange | null;
readonly plateauCount: number;
};
```
确认后卡片进入“正在比较候选时间”状态,系统自动显示下一题或最终结果。页面持续显示:
隐藏异常安全计数仅保存在服务端控制状态中,不作为 UI 进度或用户承诺。
```text
生时校正 · 自适应第 2 / 3 轮
当前范围:04:00—07:59
已确认:4 条证据 / 3 个领域
### 6.3 回答
客户端只提交题目和选项标识:
```ts
type ChoiceAnswerCommand = {
readonly caseId: string;
readonly actionId: string;
readonly turnVersion: number;
readonly questionId: string;
readonly optionId: string;
};
```
用户始终可以:
客户端不得提交 `partitionId`、候选支持方向、评分或时间范围。服务端从已持久化问题中解析真实证据映射。
- 回答“不记得”;
- 修改 Agent 提取的事件类型、日期或精度;
- 暂停并稍后继续;
- 主动结束并保存当前候选范围。
## 7. 界面设计
Agent 提问必须保持中性,不展示内部候选支持方向,也不要求用户为某个预测寻找对应经历。
### 7.1 问题卡
## 8. 评分与安全门
```text
哪一种情况更接近你的实际经历?
现有确定性评分同时使用实际候选分钟、领域分盘、Vimshottari 与 Narayana Dasha。Agent 不参与计算。
[ 2018—2020 年有过明显搬迁或长期异地 ]
[ 这几年居住地点基本稳定 ]
[ 有变化,但时间不确定 ]
低置信度条件包括:
[ 不确定 / 不记得 ] [ 都不符合 ]
```
- 最高候选并列
- 少于三条有效事件
- 少于两个事件领域
- 必要计算层缺失
- 领先区间超过 15 分钟
- 第一名领先幅度低于 10%
- 主要选项使用整行按钮,触控目标至少 44px
- 单击后立即提交,无二次确认
- 提交期间锁定所有选项并显示“正在缩小候选范围”
- 失败时恢复原选择题,不生成另一题
- 键盘、触屏和屏幕阅读器均可完成
- 不显示哪个选项支持哪个候选
较高置信度必须同时满足:
### 7.2 进度摘要
- 至少四条有效事件;
- 至少覆盖三个领域;
- 只有一个领先区间;
- 领先区间不超过 5 分钟;
- 领先幅度至少 20%
- 必要计算层完整。
页面显示:
满足基本安全门但未达到较高门槛的结果为中等置信度。
```text
已完成 4 个有效判断
当前候选范围:05:38—05:49
```
所有阈值必须记录算法版本。修改门槛需要独立校准和回归验证,不能通过 Agent 提示词、聊天内容或前端参数改变
不显示“第 2 / 3 轮”或一个并不存在的固定总题数
## 9. 自动推进与异步评分
### 7.3 “都不符合”
用户确认证据后,系统将其视为一个完整逻辑动作:
点击后展开一个简短、可选、最多 240 字的补充框。提交补充后显示“正在重新组织问题”,成功后仍回到可点击选项。补充内容本身没有评分权重。
1. 事务性保存证据、`actionId` 和预期 `turnVersion`
2. 将快照切换为 `score_pending`
3. 对宽范围案件创建幂等评分任务;
4. 后台评分完成后,原子写入候选结果、新快照和 `nextAction`
5. 页面通过状态订阅或有上限的短轮询自动显示下一题或结果。
### 7.4 结果
窄范围评分可以同步完成,但必须返回与异步路径相同的状态协议。用户不需要再点击“比较候选时间”,也不依赖 `resume` 触发状态迁移。
- 低置信:说明当前证据无法继续稳定区分,保存现有范围并结束;
- 中等置信:保存较窄候选区间,可日后以新证据开启新的评估;
- 较高置信:展示候选时间与当前排盘使用时间的区别,并请求明确确认;
- 终态不显示会偷偷重启同一流程的“重新评估”按钮;
- 新评估入口必须明确写成“开始新的评估”,并说明旧结果会保留。
## 10. 恢复与兼容
## 8. 停止规则与防循环
`resume` 不偷偷执行新的评分,但必须
正常停止满足以下任一条件
- 恢复最新快照、草稿、已确认证据和候选结果
- 返回已经持久化的 `nextAction`
- 校验快照、结果和下一动作的一致性
- 对缺少 `nextAction` 的旧案件使用确定性兼容规则重建
-`score_pending` 案件恢复任务状态或提供安全重试动作
- 让客户端立即渲染恢复后的问题或结果卡。
1. 确定性评分达到较高置信门槛
2. 候选引擎没有返回达到最低信息增益的机会
3. 连续两次有效回答后,候选区间、候选排序和领先幅度均未发生实质变化
4. Agent 只能生成已出现过的问题指纹或候选分组指纹
5. 用户主动结束并保存当前范围
6. 模型持续不可用且确定性备用问题也无法生成;
7. 隐藏异常安全计数达到 10 个有效问题。
旧版固定问卷答案继续保留用于审计,但新流程不再依赖其问题轮次推动状态。迁移不得覆盖原始填报时间或丢弃旧证据。
防循环不变量:
## 11. 幂等与并发
- 同一 `questionFingerprint` 在一个案件中最多展示一次;
- 同一 `candidatePartitionFingerprint` 不得换文案重复询问;
- `present_low_result``present_medium_result``ready` 恢复后仍是终态;
- 终态转入问题态必须携带用户明确创建的新 `caseId`
- 重试生成、重试评分、暂停和恢复均不增加有效问题计数;
- “不记得”不会反复询问同一维度,而是降低该机会价值并尝试其他维度。
## 9. 评分与应用安全门
确定性评分继续使用实际候选分钟、相关分盘、Vimshottari 与 Narayana Dasha。Agent 不参与计算。
低置信度包括候选并列、必要计算层缺失、范围仍过宽或领先幅度不足。满足基本安全门但未达到应用门槛的结果为中等置信度。
较高置信度必须同时满足版本化的候选唯一性、区间宽度、领先幅度、证据充分性和计算层完整性门槛。所有阈值由评分算法版本管理,不能由 Agent 输出或前端参数改变。
只有较高置信结果并经用户明确确认,才能在同一服务端事务中更新 `active_birth_time``reported_birth_time` 永久保留。
## 10. 自动推进与异步处理
用户点击选项后,系统执行一个完整逻辑动作:
1. 校验 `caseId``turnVersion``questionId``optionId`
2. 事务性保存选择、`actionId` 和服务端证据映射;
3. 将状态切换为 `score_pending`
4. 创建以案件、证据指纹和评分版本去重的幂等任务;
5. 评分完成后原子写入候选结果和停止判断;
6. 需要继续时创建 `generate_dynamic_question`
7. 模型输出校验通过后,持久化完整问题与选项,再返回 `ask_dynamic_choice`
8. 页面自动显示下一题或结果。
模型生成和评分都可以异步,但必须使用同一持久化状态协议。`resume` 只恢复状态,不偷偷推进或创建新案件。
## 11. 异常处理
### 11.1 Agent 输出非法
结构解析或映射校验失败时自动重试一次。仍失败则使用候选引擎提供的最高信息增益机会生成确定性备用选择题。失败不会改变评分、计数或当前候选。
### 11.2 Agent 暂时不可用
如果已有持久化问题,继续展示同一道题;如果尚未生成问题,允许重试、暂停或使用确定性备用题。不得清空回答或从头评估。
### 11.3 评分失败
保留已点击答案,状态进入 `retry_scoring`。重试同一任务,不重复保存证据、不增加有效问题计数、不生成新题。
### 11.4 “都不符合”补充失败
保留补充内容和原题,允许重试或选择“不确定 / 不记得”。补充文字不直接改变候选结果。
### 11.5 页面离开或网络中断
恢复最新 `turnVersion`、持久化问题、选项、已选答案、候选范围和终态。重复点击依靠 `actionId` 返回已完成结果。
### 11.6 非法或越权动作
服务端拒绝模型直接提交答案、客户端提交证据分区、过期题目回答、低中置信结果应用、不属于当前用户的案件访问,以及终态上的普通回答动作。
## 12. 数据与隐私
- Agent 默认只读取当前案件所需的候选差异摘要、问题历史和回答摘要;
- 内部候选支持方向和证据分区不发送到客户端;
- 用户补充文字与结构化选择分开存储;
- 补充文字不写入产品分析指标,也不直接进入评分;
- 模型日志不得包含用户身份、完整出生资料或服务端候选权重;
- `reported_birth_time` 永久保留;
- 结果文案使用“候选时间”和“当前排盘使用时间”,不得使用“已证明的真实出生分钟”。
## 13. 恢复与旧案件迁移
- 已确认的旧经历、选择题答案和候选结果继续保留;
- 未确认的自然语言草稿仅作为当前案件的 Agent 上下文,不直接计分;
- 旧案件恢复时先基于现有候选状态生成新的差异包,不重新询问已确认的信息;
- 迁移后的第一道动态题必须排除旧问题及候选分组指纹;
- 已处于低、中、高结果或 ready 状态的旧案件保持终态;
- 旧版固定问卷和日期证据继续保留用于审计,但不再决定正常流程轮次;
- 迁移不得覆盖原始填报时间、丢弃已确认证据或创建重复案件。
## 14. 幂等与并发
所有变更动作携带:
@@ -317,116 +389,92 @@ Agent 提问必须保持中性,不展示内部候选支持方向,也不要
- `caseId`:所属案件;
- 经过认证的用户身份。
重复动作返回已完成结果。旧版本动作返回最新快照,不覆盖新数据。评分任务以案件、证据指纹和算法版本生成稳定幂等标识
重复动作返回已完成结果。旧版本动作返回最新状态,不覆盖新数据。模型生成任务以案件、候选差异指纹和提示版本去重;评分任务以案件、证据指纹和算法版本去重
对外任务句柄必须是不可预测的随机标识,并同时校验登录用户、案件归属和有效期稳定证据指纹只用于服务端内部去重,不能作为可枚举的查询凭据。
对外任务句柄必须是不可预测的随机标识,并校验登录用户、案件归属和有效期稳定指纹只用于服务端内部去重,不能作为可枚举的查询凭据。
## 12. 异常处理
## 15. 测试与验收
### Agent 不可用
### 15.1 单元与属性测试
使用由 `QuestionSpec` 映射的确定性备用文案和相同结构化卡片。Journey 可以继续,Agent 故障不改变状态或权限。
- 动态问题、选项和映射必须通过严格结构解析;
- Agent 不能引用当前差异包之外的机会或证据分区;
- 相同问题指纹或候选分组指纹不能再次展示;
- 连续无信息增益、无可用机会、用户结束和隐藏安全上限都会进入终态;
- 终态无法通过普通恢复、重试或回答动作返回问题态;
- Agent 输出无法改变评分、置信度和应用权限。
### 草稿提取不完整
### 15.2 服务与契约测试
不猜测缺失字段。展示待补全卡片,只有满足结构化校验后才允许确认。
- 用户点击后直接保存选择并进入评分,不产生草稿确认状态;
- 客户端不能提交 `partitionId`、评分或候选时间;
- 评分完成后原子保存候选变化、停止判断和下一动作;
- 持久化问题在刷新后保持相同文案、选项和标识;
- `actionId` 防止重复提交,`turnVersion` 防止旧页面覆盖新状态;
- 模型失败回退不改变证据或有效问题计数;
- 低、中置信结果应用必须被服务端拒绝。
### 评分失败
### 15.3 端到端场景
保留已确认证据,状态转为 `retry_scoring`。重试不重复保存证据,不消耗新的自适应轮数。
1. 多轮动态选择后达到较高置信,用户确认后更新当前排盘时间;
2. 候选连续不再变化,保存范围并结束,不出现循环;
3. Agent 动态生成的问题和选项随候选差异变化,而非固定题库顺序;
4. 用户全程只点击选项即可完成;
5. “不记得”切换到其他区分维度,不重复原题;
6. “都不符合”补充内容生成新的可点击选项,文字本身不计分;
7. 模型输出非法或不可用时回退到确定性选择题;
8. 评分失败后重试同一任务,不重复计数或换题;
9. 刷新、暂停、换设备恢复同一道题或同一结果;
10. 旧终态案件恢复后仍停留在结果,不重新开始;
11. 重复点击同一选项只执行一次;
12. 越权请求无法绕过候选确认安全门。
### 页面离开或网络中断
### 15.4 手工体验验收
恢复最新 `turnVersion`。已确认动作依靠 `actionId` 防止重复提交,未确认草稿可以恢复或放弃。
- 桌面与手机均保持一题一屏;
- 所有主要选项和辅助动作至少 44px;
- 用户不输入文字也能完成正常流程;
- 点击后有明确的评分状态,不需要理解内部阶段;
- 页面不显示固定总轮数;
- 低、中、高结果都有清晰且不循环的下一步;
- 不存在“没有问题、没有结果、没有按钮”的非终态。
### 非法或越权动作
服务端拒绝 Agent 直接确认、低/中置信度应用、过期结果确认以及不属于当前用户的案件访问。
## 13. 数据与隐私
- 评分引擎只接收事件类型、日期和日期精度;
- 用户自然语言不进入候选评分;
- 结构化证据与原始聊天消息分开保存;
- Agent 默认只读取当前案件所需上下文,不读取全部咨询历史;
- `reported_birth_time` 永久保留;
- 只有通过高置信度安全门并经用户明确确认,才可更新 `active_birth_time`
- 结果文案使用“候选时间”和“当前排盘使用时间”,不得使用“已证明的真实出生分钟”。
## 14. 测试与验收
### 状态机和属性测试
- 所有非终态均有合法 `nextAction`
- 所有终态均有结果和合法操作;
- 相同输入与算法版本产生相同问题和评分;
- 三轮自适应追问必定终止;
- 跳过、暂停、恢复和重试不破坏轮数;
- Agent 输出无法改变状态和权限。
### 服务与契约测试
- 草稿不能直接成为评分证据;
- 用户确认后自动进入评分;
- 评分完成后原子保存结果与下一动作;
- `resume` 重建缺失的旧版 `nextAction`
- `actionId` 防止重复提交;
- `turnVersion` 防止旧页面覆盖新状态;
- 低、中置信度确认应用必须被服务端拒绝;
- Agent 直接提交确认或应用动作必须被拒绝。
### 端到端场景
1. 基础证据充足并达到较高置信度:自动进入候选确认,用户确认后才更新排盘时间;
2. 三轮后仍为低置信度:保存候选范围并终止,不出现循环或空白页;
3. 模糊自然语言:生成待补全草稿,不补猜日期;
4. 刷新和换设备:恢复当前问题、轮数、草稿和结果;
5. Agent 不可用:备用文案和卡片仍可完成流程;
6. 评分失败:证据不丢失,重试不重复计数;
7. 重复点击确认:相同动作仅执行一次;
8. 越权请求:无法绕过高置信度与用户确认安全门。
### 手工体验验收
- 桌面与手机宽度均能完成全流程;
- 每轮只出现一个主要问题;
- 确认事件后无需额外“比较”按钮;
- 计算期间有明确状态;
- 低、中、高结果都有清晰下一步;
- 不存在“没有问题、没有结果、没有按钮”的状态。
## 15. 观测指标
## 16. 观测指标
只记录流程和结构化质量指标:
- 校正完成率;
- 基础问题数量和自适应轮数
- Agent 草稿被修改的比例
- 校正完成率和主动结束率
- 每个案件的有效问题数分布
- 每题选择率、“不记得”率和“都不符合”率
- 候选范围每次回答后的缩小幅度;
- 连续无信息增益终止率;
- 重复问题或重复候选分组被拒绝的次数;
- 模型生成失败、结构校验失败和确定性回退率;
- 低、中、高置信度分布;
- 各状态退出率
- 评分失败与恢复成功率
- 非法快照或缺失 `nextAction` 的数量。
- 终态恢复后错误进入问题态的数量
- 评分失败与恢复成功率
不得将用户事件自然语言内容写入产品分析指标
不得记录用户补充文字、出生资料、选项对应的内部候选支持方向或可反推出个人信息的组合
## 16. 分阶段上线
## 17. 分阶段上线
1. 影子模式:新问题规划器只计算、不展示,与当前流程结果比较;
2. 内部测试:限定测试账号使用 Agent 引导流程;
3. 小流量开放:监控草稿修正率、退出率、评分耗时和非法状态
4. 默认启用:旧案件通过确定性兼容层恢复;
5. 稳定后移除固定三题和手动“比较候选时间”入口。
1. 影子模式:动态 Agent 生成问题但不展示,与现有流程的信息增益比较;
2. 内部测试:限定测试账号使用动态选择流程;
3. 小流量开放:监控选项点击率、问题重复率、回退率、候选缩小幅度和退出率
4. 默认启用:旧案件通过兼容层恢复到当前候选状态
5. 稳定后移除固定领域轮次、日期必填、自然语言草稿确认和意外重新评估入口。
## 17. 成功标准
## 18. 成功标准
- 用户可以用自然语言完成证据提交,同时每条评分证据都经过结构化确认
- 系统自动推进到下一题或结果,不再依赖用户理解 `resume` 或额外比较动作
- 任意恢复点都有明确问题、计算状态、结果或操作
- Agent 故障不会阻断确定性校正流程
- Agent 无法改变候选、置信度、轮数、路由和应用权限
- 三轮自适应追问后必定安全终止
- 大模型根据每次候选变化动态生成问题和答案选项
- 用户可以只通过点击完成正常校正流程
- 每次点击后自动评分并显示下一题或结果,没有重复确认
- 正常结束由置信度和信息增益决定,而不是固定五领域或固定三轮
- 同一问题、同一候选分组和同一终态都不会循环
- Agent 故障不会丢失状态,并可回退到确定性选择题
- Agent 无法改变候选排序、置信度、时间范围和应用权限;
- 原始填报时间始终保留,具体分钟只能在较高置信度且用户确认后成为当前排盘时间。
## 18. 已知准确性边界
## 19. 已知准确性边界
当前事件评分已经具备可复现的本地工程链路,但外部 oracle 与真实案例校准仍未闭环。设计中的置信度是版本化内部安全门,不等于已经证明历史真实分钟。正式上线文案和分析指标必须保留这一边界;后续阈值调整需要独立的真实案例和外部参照验证任务。
当前候选评分具备可复现的本地工程链路,但外部 oracle 与真实案例校准仍未闭环。设计中的置信度是版本化内部安全门,不等于已经证明历史真实分钟。正式上线文案和分析指标必须保留这一边界;后续阈值调整需要独立的真实案例和外部参照验证任务。