Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017eEAG8HD3mm8gsKXgk8uU8
89 lines
9.0 KiB
Markdown
89 lines
9.0 KiB
Markdown
# 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。
|