fix(web): count only training events for discrimination and split user-stop from validated range
Three collected events with a reserved holdout were stalling because the discriminator door counted holdout. Public selection_allowed still had snapshot fallbacks, and health only proved the image SHA. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -5771,6 +5771,22 @@
|
||||
- 复发自:BUG-367(点选身份与滚动);BUG-366(覆盖完成被当成收敛);BUG-393(出卡即完成)
|
||||
- 修复版本:待发布
|
||||
|
||||
## BUG-396 | Holdout 门槛、用户停止收口与决策入口未钉死
|
||||
|
||||
- 状态:resolved
|
||||
- 首次发现:2026-08-26
|
||||
- 最近更新:2026-08-26
|
||||
- 影响面:training 门槛、`decideRectification`、session_outcome、`/api/health` 数据库版本、Skill 10.0.11 示例
|
||||
- 用户现象:3 条事件预留 1 条 holdout 后可能既不能出 Probe 又以为事件够了;用户主动停止被写成已验证完成;健康检查只证明镜像 SHA,不证明迁移已执行。
|
||||
- 触发条件:满 2 条即预留 holdout,同时区分门按全部已收事件计 3 条;用户停止与 holdout 通过共用 `completed_with_range`;`/api/health` 只有 `deployment.gitCommit`。
|
||||
- 根因:区分门槛把 holdout 算进可评分事件。用户停止与验证通过共用收口状态。公开决策字段仍可能读 snapshot 而不是 reducer。
|
||||
- 修复:区分和冲突探针只计 **training** 事件:3 training / 2 training 领域才开门。2 条继续收集;3 条(2 training + 1 holdout)继续收集;4 条(3 training + 1 holdout)才进入区分。用户停止为 `provisional_range_user_stopped`,holdout 通过为 `validated_range`,不得把停止写成已完成验证。GET/点选/刷新/工具投影的 `selection_allowed` 等从 `decideRectification` 派生。`/api/health` 增加 `database.latestMigration` 与 `rectificationContractVersion=v3`。Skill 10.0.11 仍不改写;后续新建 10.0.12 时用 `{timeWindow}/{semanticTarget}/{domain}` 抽象示例。
|
||||
- 验证:`tests/test_candidate_discriminator_contract.py`、`frontend/tests/rectification-decide-next-action.test.ts`、`frontend/tests/rectification-decision-authority.test.ts`、`frontend/tests/rectification-hidden-e2e.test.ts`、`frontend/tests/health-deployment.test.ts`。GET `/api/rectification/cases/[caseId]` 的 `latest_result.selection_allowed` 与 `interview` 由 `decideFromDossier` 覆盖,不得回退 snapshot。
|
||||
- 防复发:不得用含 holdout 的总事件数开区分门。不得把用户停止标成 `validated_range` 或“最终校正结果”。不得在 interview / answer_choice / turn_decision / Case GET 里独立判断 `selection_allowed`。不得只凭 `gitCommit` 声称迁移已执行。不得原地改 Skill `10.0.11`。后续 Skill `10.0.12` 只用 `{timeWindow}/{semanticTarget}/{domain}`。
|
||||
- 相关记录:BUG-394、BUG-395、BUG-393、BUG-366
|
||||
- 复发自:BUG-394(holdout 预留后未把门槛改成 training);BUG-395(staging publish 被 holdout 类型和重复 re-export 挡住)
|
||||
- 修复版本:待发布
|
||||
|
||||
## BUG-379 | 生时纠正已记入学后仍编造高考年并再问入学
|
||||
|
||||
- 状态:resolved
|
||||
|
||||
@@ -215,3 +215,15 @@ The inventory above is the pre-change baseline. Runtime now:
|
||||
- Emits `CandidateContrastOpportunity`; distinguish probes fail closed unless `candidateIds>=2`, `expectedOutcomes>=2`, `informationGain>0`
|
||||
- Persists inference-round entropy, eliminated IDs, and `low_information`
|
||||
- Staging quick gate runs `tests/test_candidate_discriminator_contract.py` (`CORE_PYTEST_TARGETS`)
|
||||
|
||||
## 8. Follow-up: Skill 10.0.12 (do not rewrite 10.0.11)
|
||||
|
||||
Hashed Skill `10.0.11` still contains concrete examples (`2015 年搬家`, `高考发挥失常`, `2016 年前后更像哪一件`). Leave that version immutable.
|
||||
|
||||
A later `10.0.12` should replace those with abstract slots only:
|
||||
|
||||
- `{timeWindow}`
|
||||
- `{semanticTarget}`
|
||||
- `{domain}`
|
||||
|
||||
The agent may only rewrite the engine Opportunity. It must not invent a year, domain, or candidate mapping. New cases bind the new version; old cases keep `10.0.11` until explicit adoption.
|
||||
|
||||
Reference in New Issue
Block a user