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

9.0 KiB
Raw Blame History

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(本单授权覆盖):
    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。