fix(rectification): downgrade yearless personality probes to tie-breakers (BUG-629)
Ask dated dasha probes first; D9/D10 and nakshatra wait until that pool is empty, score at half weight, and never eliminate. Skill 10.0.21. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -9732,6 +9732,22 @@
|
||||
- 复发自:无
|
||||
- 修复版本:待发布
|
||||
|
||||
## BUG-629 | 无年月性格题与带年月题同权,参与了淘汰
|
||||
|
||||
- 状态:resolved
|
||||
- 首次发现:2026-09-09
|
||||
- 最近更新:2026-09-09
|
||||
- 影响面:`applyProbeOutcome`、`buildMethodFollowupPlan`、技法审计表、Skill 10.0.21
|
||||
- 用户现象:真实校正里头两道题就是性格自评(相处方式 / 做事风格)。这些题没有年月锚点以外的分辨力验证,却按 ±2 计分并计入三次淘汰。
|
||||
- 触发条件:账本已有感情或事业锚点(BUG-559),候选尚未分开,计划层把 `varga_style` / `nakshatra_boundary` 与带年月区分题排在同一池。
|
||||
- 根因:`varga_style` 与带年月 `dasha_boundary` 共用 `SCORE_DELTA` 和 `strong_conflict_count`。分盘星座是确定计算,「星座 ↔ 性格」「用户自评 ↔ 类型」两层从未校准。
|
||||
- 修复:性格题只在可问的带年月区分题为空、且仍有 ≥2 个未分开候选时才成为下一问,否则 `dropped_probes(reason="yearless_deferred")`。分值 ×0.5(±1),不递增冲突次数,`rounds.kind=tie_break`。报告 `D9 / D10 类型对照` 与 `月宿边界` 标 `reference`。离线脚本只对医院记录且不确定度 ≤2 分钟的匿名导出算命中率。
|
||||
- 验证:`frontend/tests/rectification-yearless-probe-downgrade-20260909.test.ts`;`tests/test_varga_style_calibration_report.py`;既有 `rectification-probe-replay-loss-20260908.test.ts` 断言未改。
|
||||
- 防复发:不得把 `varga_style` / `nakshatra_boundary` 加回带年月区分池;不得让性格冲突计入 `STRONG_CONFLICT_ELIMINATION_COUNT`;不得改 `SCORE_DELTA` 数值来代替权重。`asInferenceState` 的 `ROUND_KINDS` 必须含 `tie_break`,否则答过性格题的 `inference_state` 整份被丢掉。审计列 CHECK 仍只认 `informative` / `low_information`;`tie_break` 只活在 JSON,不得为迁列把 kind 改回 `informative`。
|
||||
- 相关记录:BUG-559、BUG-560、BUG-623
|
||||
- 复发自:无
|
||||
- 修复版本:待发布
|
||||
|
||||
## BUG-630 | 初始化后点首页「家庭」报运行合同未完成(runtime_contract_incomplete)
|
||||
|
||||
- 状态:resolved
|
||||
|
||||
@@ -0,0 +1,76 @@
|
||||
# 性格题离线命中率导出(医院记录)
|
||||
|
||||
产品负责人在有数据库权限的环境跑。执行方不能替你跑。导出给 `scripts/rectification/varga_style_calibration_report.py` 用。
|
||||
|
||||
只导出哈希后的 `case_id`。不要导出姓名、出生日期、地点、坐标、邮箱、原话、用户 ID。
|
||||
|
||||
筛选在脚本里还会再做一遍:`birth_time_source = hospital_record` 且前后不确定度都 ≤ 2 分钟。SQL 先收窄,减少体积。
|
||||
|
||||
`recorded_sign` 必须是**档案里的记录分钟**在该层的分盘星座(或月宿),不是校正后的采用分钟。星座名与选项 `sign` 用同一套中文名(例如 `天秤座`)。
|
||||
|
||||
```sql
|
||||
-- service_role / schema_owner。输出一行一个 JSON 对象,外层再包成 {"cases":[...]}。
|
||||
-- 需要 pgcrypto:encode(digest(...), 'hex')。
|
||||
|
||||
with latest_transition as (
|
||||
select distinct on (t.case_id)
|
||||
t.case_id,
|
||||
t.inference_state
|
||||
from public.agentic_rectification_inference_transitions t
|
||||
order by t.case_id, t.revision desc
|
||||
),
|
||||
hospital_cases as (
|
||||
select
|
||||
encode(digest(c.id::text, 'sha256'), 'hex') as case_id_hash,
|
||||
c.baseline_birth_snapshot->>'birth_time_source' as birth_time_source,
|
||||
to_char((c.baseline_birth_snapshot->>'reported_birth_time')::time, 'HH24:MI') as recorded_minute,
|
||||
(c.baseline_birth_snapshot->>'uncertainty_before_minutes')::int as uncertainty_before_minutes,
|
||||
(c.baseline_birth_snapshot->>'uncertainty_after_minutes')::int as uncertainty_after_minutes,
|
||||
lt.inference_state
|
||||
from public.agentic_rectification_cases c
|
||||
join latest_transition lt on lt.case_id = c.id
|
||||
where c.baseline_birth_snapshot->>'birth_time_source' = 'hospital_record'
|
||||
and coalesce((c.baseline_birth_snapshot->>'uncertainty_before_minutes')::int, 99) <= 2
|
||||
and coalesce((c.baseline_birth_snapshot->>'uncertainty_after_minutes')::int, 99) <= 2
|
||||
and nullif(c.baseline_birth_snapshot->>'reported_birth_time', '') is not null
|
||||
)
|
||||
select jsonb_build_object(
|
||||
'cases',
|
||||
coalesce(jsonb_agg(
|
||||
jsonb_build_object(
|
||||
'case_id_hash', h.case_id_hash,
|
||||
'birth_time_source', h.birth_time_source,
|
||||
'recorded_minute', h.recorded_minute,
|
||||
'uncertainty_before_minutes', h.uncertainty_before_minutes,
|
||||
'uncertainty_after_minutes', h.uncertainty_after_minutes,
|
||||
'answers', coalesce((
|
||||
select jsonb_agg(
|
||||
jsonb_build_object(
|
||||
'semantic_key', probe->>'semantic_key',
|
||||
'answer_class', ans->>'answer_class',
|
||||
'recorded_sign', null, -- 用记录分钟在该层的星座/月宿填上;不要用采用分钟
|
||||
'options', coalesce(probe->'style_options', '[]'::jsonb)
|
||||
)
|
||||
)
|
||||
from jsonb_array_elements(coalesce(h.inference_state->'answered_probes', '[]'::jsonb)) ans
|
||||
join jsonb_array_elements(coalesce(h.inference_state->'probes', '[]'::jsonb)) probe
|
||||
on probe->>'id' = ans->>'probe_id'
|
||||
or probe->>'semantic_key' = ans->>'semantic_key'
|
||||
where (
|
||||
probe->>'choice_kind' = 'varga_style'
|
||||
or probe->>'source' = 'nakshatra_boundary'
|
||||
)
|
||||
), '[]'::jsonb)
|
||||
)
|
||||
), '[]'::jsonb)
|
||||
) as payload
|
||||
from hospital_cases h;
|
||||
```
|
||||
|
||||
把结果存成 JSON 后:
|
||||
|
||||
```bash
|
||||
.venv/bin/python scripts/rectification/varga_style_calibration_report.py export.json
|
||||
```
|
||||
|
||||
只打印 `d9` / `d10` / `nakshatra` 的 `n` 与 `hit_rate`。命中率接近 1/3(三选一随机)时,再由产品决定是否删题。
|
||||
@@ -0,0 +1,54 @@
|
||||
# PROGRESS · 无年月性格题降级(2026-09-09)
|
||||
|
||||
工作树:`.worktrees/rectification-yearless-probe-downgrade-20260909`
|
||||
分支:`codex/rectification-yearless-probe-downgrade-20260909`
|
||||
任务书:`docs/tasks/TASK-rectification-yearless-probe-downgrade-20260909.md`
|
||||
基线:任务书写 `4eea9c10`;开工时接到 `origin/staging` @ `eb8a3120`(家庭合同 BUG-630 已在其上)。本单不依赖 BUG-626~628,不碰 `holdoutFollowupFor` / 领域别名。
|
||||
|
||||
## 开工回执
|
||||
|
||||
- 编号 **BUG-629**(`docs/BUG_HISTORY.md` 当时最大已发布号是 628;630 是同日另一条家庭合同,本单不占用)。
|
||||
- 顺序:3.2 权重 → 3.1 计划层 → 3.3 报告/Skill 10.0.21 → 3.4 离线脚本 → 3.5 记录。
|
||||
|
||||
## 已完成
|
||||
|
||||
- **3.2**:`PROBE_WEIGHT = { dated: 1, yearless: 0.5 }`。`applyProbeOutcome` 对 `varga_style` 与 `source=nakshatra_boundary` 乘 0.5、不递增 `strong_conflict_count`、`kind=tie_break`。`SCORE_DELTA` 数值未改。不确定答仍是 `low_information`。`asInferenceState` 的 `ROUND_KINDS` 补上 `tie_break`,否则答过性格题的 `inference_state` 整份被解析丢掉(审计列 CHECK 仍只认 `informative` / `low_information`,`tie_break` 只活在 JSON)。
|
||||
- **3.1**:`varga_style` 退出带年月锁定期桶,进入 `personality`。可问的 `dasha_boundary` / `dasha_activation` 仍在时,性格题 `yearless_deferred`。带年月题空且 ≥2 个未分开候选才问。1 个候选或已分开则不问。锚点(BUG-559)保留。`decideFromDossier` 把真实分离状态传进计划层,不再写死 `false`。
|
||||
- **3.3**:技法审计表 `D9 / D10 类型对照`、`月宿边界` 为 `reference`,说明「性格自评,只作排序参考,不参与淘汰」。Skill **10.0.21**(live + `versions/10.0.21`,sha256 `3ced107366b2c4b0f26bae81440162032501f77a8d762d42c84a20fa394ea807`)。§5 一句:「性格类点选题只在带年月题问完仍分不开时出现,分值减半、不淘汰。」三列卡性格描述未改。未改 `frontend/DESIGN.md`(无视觉改动)。
|
||||
- **3.4**:`scripts/rectification/varga_style_calibration_report.py` 只对医院记录且不确定度 ≤2 分钟聚合命中率。导出 SQL:`docs/operations/varga-style-calibration-export.md`(产品跑;本环境无库)。
|
||||
- **3.5**:BUG-629、CHANGELOG、走查 `docs/testing/rectification-scenarios-20260907.md` 第 0 条与第 8 条。任务板「待验收」。
|
||||
|
||||
## 三栏(既有断言)
|
||||
|
||||
| 位置 | 原值 | 新值 | 原因 |
|
||||
| --- | --- | --- | --- |
|
||||
| 性格题分值 / 淘汰 | ±2、计 `strong_conflict_count` | ±1、不计 | 任务书决策 2 |
|
||||
| `rectification-varga-style-weight.test.ts` 两组/三组绝对 delta | 2 与 `[2,2,2]` | 1 与 `[1,1,1]` | 决策 2 |
|
||||
| 同上 B 选项三次弱是 | 计 3 次冲突并淘汰 | 计数 0、不淘汰 | 决策 2 |
|
||||
| Skill 当前钉 | 10.0.20 | 10.0.21 | 任务书决策 3 |
|
||||
| `rectification-eight-method.test.ts` 绑定 D9 探针 | next 是 `varga.d9`,压过 `relationship.2021` | next 是 `relationship.2021.dasha_activation`;D9 `yearless_deferred` | 决策 1 |
|
||||
| 同上 D10 增益 3.1 vs `career.2018` | next 是 `varga.d10` | next 是 `career.2018.dasha_activation`;D10 `yearless_deferred` | 决策 1 |
|
||||
| `rectification-probe-replay-loss-20260908.test.ts` | 未改 | 未改 | 任务书:带年月题逐字节不变 |
|
||||
|
||||
## 验收命令(实测)
|
||||
|
||||
工作树 `codex/rectification-yearless-probe-downgrade-20260909`,相对 `origin/staging` @ `eb8a3120`。
|
||||
|
||||
| 命令 | 结果 |
|
||||
| --- | --- |
|
||||
| `frontend` `./node_modules/.bin/tsc --noEmit` | 0 错 |
|
||||
| `npm run lint` | **0 error**,108 warning(与门禁口径一致,未顺手改) |
|
||||
| `ls tests/rectification-*.test.ts tests/skill-registry.test.ts \| grep -v database \| xargs npx tsx --test` | **1087 tests / 1087 pass / 0 fail**(开工基线同 glob 为 1086;本单新增 `asInferenceState` 性格轮回放 1 条) |
|
||||
| `.venv/bin/python -m pytest tests/test_varga_style_calibration_report.py` | 通过 |
|
||||
| `next build` | 未跑(本机耗时长;无 Docker。首页 Static / gzip 留给验收) |
|
||||
|
||||
## 环境缺口
|
||||
|
||||
- 无 Docker:未跑 `npm run test:db`、未应用迁移(本单无表结构改动;`round_kind` 列 CHECK 仍是 `informative` / `low_information`)。
|
||||
- 无登录态、无 Chrome:`docs/testing/rectification-scenarios-20260907.md` 第 0 条真人走查未做。
|
||||
- 无生产/预发库:校准导出 SQL 未跑,命中率数字未测。
|
||||
|
||||
## 未做
|
||||
|
||||
- 未 commit、未 push、未提升 `main`。
|
||||
- 未改 `SCORE_DELTA`、四选项合同、采用/确认门、`MIN_SEPARATION_LEAD`、三列性格描述。
|
||||
@@ -92,7 +92,7 @@
|
||||
| `TASK-rectification-window-cluster-cap-20260909.md` | `PROGRESS-rectification-window-cluster-cap-20260909.md` | **P0** 真实用户:一小时窗口分 17 个签名簇,`select_signature_representatives` 按时间取前 12 个,14:40 之后整簇丢弃(本机复现表);区间按代表分钟跨度而非簇覆盖;中途说出真实时段时助手口头答应却未改 → 改为固定回复"范围开始时按资料定、中途不改"(产品否决口头改范围);intake 自定义范围等产品答复 | 待验收 | `codex/rectification-window-cluster-cap-20260909`(BUG-623~625,Skill 10.0.20);走查 `docs/testing/rectification-window-cluster-cap-20260909.md` |
|
||||
| `TASK-rectification-skipped-health-deadend-20260909.md` | `PROGRESS-rectification-skipped-health-deadend-20260909.md` | 真实用户:健康题「记不清」后职业答完即断(『没有拿到下一个问题』):holdout 的 `declined` 未归并 health/health_pressure,把跳过的健康线再问一次,撞同 id 焦点 `duplicate_focus` 静默;出口闸门把 `exhausted` 当已交付不修复;『重新加载』只重取快照 | 待执行 | `codex/rectification-skipped-health-deadend-20260909`(BUG-626~627) |
|
||||
| `TASK-rectification-domain-alias-audit-20260909.md` | `PROGRESS-rectification-domain-alias-audit-20260909.md` | 领域命名审计:健康线 `health`(账本/焦点)与 `health_pressure`(计划/引擎)在十处比较里六处未归并(holdout declined、reverse-verify、conflict probes、probeYearAlreadyCovered、引擎 oos_blind_prompts / _event_years / volunteered);职业线焦点存为 `other` 只靠 questionId 兜底。其余六领域三层同名无问题。决策:TS/Python 各一个归并函数 + 源码合同禁字面量比较 | 待执行 | `codex/rectification-domain-alias-audit-20260909`(BUG-628) |
|
||||
| `TASK-rectification-yearless-probe-downgrade-20260909.md` | `PROGRESS-rectification-yearless-probe-downgrade-20260909.md` | 产品拍板:无年月性格题(D9/D10 风格、月宿边界)降级为平局裁决——带年月题问完且候选仍分不开才问,分值减半(±1)、不计淘汰,报告标「参考」;三列卡性格描述不动;新增离线命中率测量脚本 + 导出 SQL(有出生证用户,聚合);Skill 10.0.21 | 待执行 | `codex/rectification-yearless-probe-downgrade-20260909`(BUG-629) |
|
||||
| `TASK-rectification-yearless-probe-downgrade-20260909.md` | `PROGRESS-rectification-yearless-probe-downgrade-20260909.md` | 产品拍板:无年月性格题(D9/D10 风格、月宿边界)降级为平局裁决——带年月题问完且候选仍分不开才问,分值减半(±1)、不计淘汰,报告标「参考」;三列卡性格描述不动;新增离线命中率测量脚本 + 导出 SQL(有出生证用户,聚合);Skill 10.0.21 | 待验收 | `codex/rectification-yearless-probe-downgrade-20260909`(BUG-629) |
|
||||
|
||||
### 聊天主链路与首页
|
||||
|
||||
|
||||
@@ -8,10 +8,12 @@
|
||||
|
||||
资料:家人记得大概时间,钟点任意,范围「差不多准」。地点任意公开城市。
|
||||
|
||||
开场后依次说三件不同领域、带年月的虚构经历,等到出现候选比较和性格对照卡。答完一张性格卡后,再说一件带年月的事。
|
||||
开场后依次说三件不同领域、带年月的虚构经历,等到出现候选比较。**先会出现带年月的点选题**(某年前后有没有某类事)。把能答的带年月题答完,候选还分不开时,才可能出现性格对照卡。答完一张性格卡后,再说一件带年月的事。
|
||||
|
||||
期望:
|
||||
|
||||
- 有可问的带年月区分题时,不得先出性格卡(相处方式 / 做事风格 / 月宿两组性格)
|
||||
- 性格卡出现时,旁边或报告里应能看出这是参考,不是淘汰依据
|
||||
- 顶部范围必须变化,或旁白说明这次比较没跑成、下一句会再试
|
||||
- 不得出现:比较失败后仍只写「记下了、很有帮助」,顶部范围完全不动
|
||||
- 点「先这样,先看当前范围」后必须出现候选卡或当前范围,不得只剩「没有拿到下一个问题」
|
||||
@@ -172,3 +174,15 @@
|
||||
- 想跳过可以打字「没有」或「记不清」
|
||||
- 每轮助手正文一句复述(可另接一句范围变化);气泡里没有「本轮对照了…」,也没有「很有帮助 / 很有价值 / 很有分量 / 特别有用」
|
||||
|
||||
## 8. 性格题只作平局参考(BUG-629)
|
||||
|
||||
资料与开场同第 0 条。虚构经历。
|
||||
|
||||
期望:
|
||||
|
||||
- 2023 年 5 月这类带年月事业题还问得完时,不出 D9 相处方式卡
|
||||
- 带年月区分题问完、还剩两个候选、仍分不开:可以出性格卡
|
||||
- 只剩一个候选:不再出性格卡
|
||||
- 交付后展开验证报告,「D9 / D10 类型对照」和「月宿边界」状态是 `reference`,说明是性格自评、只作排序参考、不参与淘汰
|
||||
- 三列对照卡上的性格句子仍按类型表展示,不改写
|
||||
|
||||
|
||||
Reference in New Issue
Block a user