Files
Jyotisha/docs/tasks/TASK-rectification-varga-resolution-fix-20261001.md
T

89 lines
9.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# TASK · 盘型口径实现修复单:开案 RPC 42501 + 真库复验 + 正式回放文件(2026-10-01)
## 基线
- 待修分支:远端 `review/rectification-varga-resolution-20260930` @ `ce9d669c`(单提交,基于 `f898df55`)。
- 修复分支:`codex/rectification-varga-resolution-fix-20261001`,从 `ce9d669c` 起,开工先 `git rebase origin/staging`(`origin/staging` 已前进 ≥ 19 个提交,冲突预计只在文档;代码冲突逐处核对,不得丢对方改动)。
- 工作树 `.worktrees/rectification-varga-resolution-fix-20261001`。
- 原任务书 `TASK-rectification-varga-resolution-20260930.md` 的决策记录、硬红线全部继续有效。
## Claude 验收记录(2026-10-01,对 `ce9d669c`)
环境:Linux,Node 22.14(`/exec-daemon/node`),Python 3.13,**无 Docker**(真库测试无法在本机运行)。基线 = `f898df55` 同机同依赖。
| 检查 | 结果 | 结论 |
| --- | --- | --- |
| 冻结文件(`PRODUCTION_FILES` 10 个 + 事件引擎) | 0 改动 | 通过 |
| `jyotish_api_server.py` | +2 行薄注册;growth contract 绿 | 通过 |
| `tsc --noEmit` | 0 错(基线 0) | 通过 |
| `npm run lint` | 0 error / 126 warning(基线 0 / 126) | 通过 |
| `npm test` | 分支 4714 / pass 4650 / fail 24 / skip 40;基线 4418 / 4363 / 24 / 31。失败清单**逐名相同**(24 条均为 Docker / PG / 部署环境用例),基线测试名 0 丢失,新增 296 | 通过(环境缺口同基线) |
| `next build` | exit 0,`/` 仍 `○ Static` | 通过 |
| 首屏 gzip(`/` 预渲染 HTML 引用的 JS + CSS) | JS 646,480 → 651,961(+0.85%),CSS 不变,合计 +0.77% | 通过(±2% 内) |
| Python 快速门 | 1035 passed / 1 skipped / 0 failed;定向(端点、研究、growth、完整性、隐私、打分研究)135 passed | 通过 |
| **硬红线 2**(生产段级汇总 = 研究) | `varga_resolution_probe.py --posterior production --stages m1,m2`,77 例 × ±10/±30/±60:M1 per-case 1155 格差 0;**M1、M2 整棵结果树与 `docs/research/varga_resolution_research_2026_09_30.json` 深比较差异 0** | 通过(超过任务书 ≥10 例要求) |
| **硬红线 1**(回放) | 真值段保留 ±10 76/76/76、±30 76/76/76(D1/D9/D10);±60 D9/D10 74 → 按 D3 blocked。头段 = 真值 ±10 D9 68 / D10 66、±30 44 / 49,等于研究「线上顺序」列 | 通过(T5 默认关闭,按原任务书让步顺序,「按段」列收益不计入本单) |
| D3 档位 | `segment-summary.ts::confidenceTier`:非 D1 且宽 > 61 → blocked;≥ 0.6 较可信;宽 ≤ 21 且 ≥ 0.5 倾向;否则分不开;D1 全窗唯一 → 确定 | 与任务书一致 |
| D4 不提前停 | `rectification-decision.ts` 只加透传字段,出卡时机未改 | 通过 |
| D5 按段选题 | `RECTIFICATION_SEGMENT_ORDER=on` 才启用,且宽 > 61 不启用 | 通过(默认关) |
| D7 采用分钟 | 目标盘头段交集中点 → 为空取 D1 头段中点 → 交付区间内最近分钟 | 与任务书一致 |
| 既有断言改动 | 29 处被删断言:23 处为 Skill 版本 10.0.32 → 10.0.33;其余为入口 / 只读投影 / ACL 合同,执行方已写三栏 | 未见放宽 |
| **开案 RPC**(真库) | 见下「事故实证」 | **不通过(P0)** |
| 真库全量 `npm run test:db` | 本机无 Docker;执行方最后一次 DinD 为 79 / 77 / 2 fail(opening 42501 + history fixture,后者已改 fixture 未复跑) | **未闭环** |
| 正式回放文件 | `docs/research/varga_resolution_impl_replay_2026_09_30.json` 为旧 Windows 产物,无 `implementation_identity`,与 accepted 严格比差 1242 格(执行方自述) | **不通过** |
| 真机 / 真实模型 | 清单 `docs/testing/rectification-varga-resolution-20260930.md` 已写,未执行 | 环境缺口 |
**结论:算法实现正确(77 例生产路径与研究逐格一致),但因 P0 开案权限失败不可合入。**
## 事故实证(P0)
- `frontend/supabase/migrations/20260930020000_rectification_segment_checks.sql`:新 12 参数 `open_agentic_rectification_case_v2(..., p_product_domain text)` 为 `security definer`,函数体内调用既有 11 参数同名函数。
- `frontend/supabase/migrations/20260814010000_immutable_skill_registry.sql` 的 ACL 对账块(`for v_grantee in select distinct pg_get_userbyid(a.grantee) ... where a.grantee <> v_service_role loop execute format('revoke execute on function %s from %I', ...)`)把 11 参数函数的 EXECUTE 从**除 service_role 外所有角色**收回,包括函数属主。
- 于是 12 参数函数以属主身份调用 11 参数函数 → `42501 permission denied for function open_agentic_rectification_case_v2`。
- `frontend/src/lib/rectification-agentic/v9/case-service.ts::openRectificationCase` 对 `intent !== "session"`(首页、新建)**一律**传 `p_product_domain` 走 12 参数版本 → **部署后所有从首页发起的新校正开不了案。** 执行方 DinD 真库 `database-segment-opening.test.ts:44` 已复现。
## 决策记录(Claude 2026-10-01,依产品 09-30 授权的盘型口径)
- **F1 修法二选一,推荐 (a)**:
- (a) 12 参数包装函数改为 `security invoker`:调用方是 service_role,本就对 11 参数 open 与 `initialize_agentic_rectification_domain_v1` 有 EXECUTE;不需要任何新授权。
- (b) 删除 12 参数包装,`case-service.ts` 先调 11 参数 open、`disposition === "created"` 时再调 `initialize_agentic_rectification_domain_v1`,`should_start_opening` 改由前端按返回值判断。
- **禁止**:给属主或任何非 service_role 角色补 EXECUTE(破坏 08-14 仅 service_role 白名单);改 08-14 迁移;删除或弱化 `database-segment-opening.test.ts` 与 ACL 合同断言。
- 两条新迁移尚未部署到任何环境,允许**原文件修改**(不新增第三条迁移),修改处在 PROGRESS 写原值 / 新值 / 原因。
- 其余代码不动;不重开算法、阈值、UI。
## 硬红线
1. 原任务书硬红线 1–7 继续有效;本单修复后 Claude 用同一命令复跑回放与门禁。
2. **真库**:`npm run test:db --prefix frontend`(Docker,Postgres 17)全量通过,`database-segment-*` 与 `database-segment-skill-history` 全绿;基线 DB 测试名 0 丢失。无 Docker 不得开工本单(写 BLOCKED)。
3. ACL 合同:12 参数函数(若保留)只有 service_role EXECUTE;11 参数函数 ACL 与 `f898df55` 逐项相同。
4. 正式回放文件必须带 `implementation_identity`,与 accepted 研究 JSON 的 M1 / M2 深比较差异 0。
## 任务分解
- **F1 开案 RPC(BUG-1131)**:按决策 (a) 或 (b) 修;`database-segment-opening.test.ts` 先红后绿(红的日志留 PROGRESS);ACL 合同测试补 12 参数函数的 `prosecdef` 断言((a) 时应为 false)。
- **F2 真库全量复验**:F1 后在最终源码上跑全量 `test:db`;history fixture 修正后的 `database-segment-skill-history.test.ts` 必须真实执行到 transition / action / run receipt 末断言;旧校正会话(Skill 10.0.32 绑定)列表、打开、只读均通过(BUG-621)。
- **F3 正式回放文件**:用下列命令重生成并**替换** `docs/research/varga_resolution_impl_replay_2026_09_30.json`(本单授权覆盖):
```bash
export PYTHONHASHSEED=0 VARGA_REPLAY_NODE=$(command -v node) # Node 22
python3 scripts/research/varga_resolution_probe.py --posterior production --stages m1,m2 \
--radii 10,30,60 --cache-dir /tmp/varga-cache \
--baseline-out /tmp/varga-prod-baseline.json \
--json-out docs/research/varga_resolution_impl_replay_2026_09_30.json --quiet
```
验收:M1 / M2 与 accepted 深比较差异 0(Claude 10-01 同命令已得 0)。
- **F4 研究侧 PG 持久回放 harness**(`frontend/scripts/rectification-segment-persisted-replay.ts`、`scripts/research/varga_resolution_persisted_replay.py`):若 append 权限失败与 F1 同类(属主 EXECUTE),随 F1 一并验证;仍失败则在 PROGRESS 标 `blocked` 并说明,不阻塞合入(F3 已覆盖算法验证)。
- **F5 记录**:PROGRESS 追加本单节;BUG-1131 新增;BUG-1115~1117 在 F1–F3 通过后由 Claude 改 resolved;`docs/tasks/README.md` 状态;`CHANGELOG.md` 不需新条(用户可感知行为未变)。
## 部署注意
- 两条迁移(`20260930010000_rectification_segment_adoption.sql`、`20260930020000_rectification_segment_checks.sql`)必须**先迁移后部署**;`get_agentic_rectification_case_dossier` 被 `create or replace`,旧版本保存为 `_before_segments`,回滚时按此恢复。
- 部署 staging 后产品按真机清单走一遍(至少:首页发起婚恋问题 → D1 + D9 两行;±60 窗口只有 D1 行;采用后报告页盘型与卡片一致;旧校正会话能打开)。
## 让步顺序
F1 > F2 > F3 > F5 > F4。F1–F3 缺一不可合入。
## BUG 编号
开工时核对 `docs/BUG_HISTORY.md` 最大号(写作时 `BUG-1130`)。本单:**BUG-1131**(12 参数开案包装以属主身份调用被 ACL 对账收回 EXECUTE 的 11 参数函数,首页 / 新建开案 42501)。关联 BUG-1115~1117、BUG-621。