Engine and five chapters now complete on accepted profiles; final assemble still fails as BUG-535. Co-authored-by: Cursor <cursoragent@cursor.com>
5.4 KiB
PROGRESS · BUG-526 报告链路不得直读已收权的校正表(2026-09-04)
工作树:/Users/jesse/Downloads/Copse/astrology/.worktrees/report-candidate-range-20260904
分支:codex/report-candidate-range-20260904
基线:任务书写 cce919fe;开工 origin/staging HEAD 为 846b6064(含本任务书)。
任务书:仓库根 TASK-report-candidate-range-read-20260904.md
未恢复 service_role 表级权限,未改表/列/RLS/既有 grant,未改 worker 其余生成管线,未改 .gitea/workflows/**,不提升 main。
| 任务 | 状态 | BUG |
|---|---|---|
| 1 两处读取降级 + 语义修正 | 完成 | BUG-526 |
2 只读 RPC + test:db |
完成(本文件定向套件已绿;全量 test:db 见下方门禁输出) |
BUG-526 |
| 3 部署后真实 personal_full | 部分完成(引擎与五章正文已通;终稿 final_parse_rejected,见 BUG-535) |
BUG-526 / BUG-534 / BUG-535 |
| 4 BUG-526 收口 | 完成(修复版本待 staging SHA) | BUG-526 |
实现要点
- 共享 helper
frontend/src/lib/report-candidate-range.ts:只调read_report_candidate_range。permission denied / 抛错 → warn(仅event+reason错误码)→null;空行 →null且不 warn。非法时钟或start > end也当无窗口。 - worker
generate与POST /api/reports的loadCandidateRange都走 helper,不再from("agentic_rectification_cases")/from("birth_time_rectification_cases")。 - 迁移
20260904010000_read_report_candidate_range.sql:security definer、search_path=''、revokepublic/anon/authenticated、grant execute只给service_role。返回值只有start_time/end_time。 completed枚举: 任务书以为它不在birth_time_rectification_cases状态枚举里。20260720010000_conversational_rectification_schema.sql已纳入confirmed与completed两个终态。RPC 使用这两值;前端不再维护一份.in("status", …)列表。abandoned不取窗。
测试
tests/report-candidate-range.test.ts:permission denied / throw / 空行三态;合法窗;敏感度输入无窗口;源码锁两处调用。tests/personal-report-api.test.ts:loadCandidateRange返回null时 create 仍 201,不是calculation_unavailable。原「只信 confirmed/completed 直读」改为 RPC helper 源码锁。tests/database-report-candidate-range.test.ts:service_role可 execute,anon/authenticated不可;表 SELECT 仍 denied;无行返回空;窗口 JSON 只有两列;legacy confirmed 行优先。
让步
无。未 re-grant 表权限。
门禁解堵
7ee7f825 的 CSS 合同脱节已由 0be51e65 / BUG-532 合入 staging,本单不再改那条测试。
门禁输出
./node_modules/.bin/tsc --noEmit:0npm run lint:0 error / 74 warning(既有,未动)- 定向:
report-candidate-range+personal-report-api+personal-report-worker+ migration 源码锁 75 pass npm run test:db(tsx --test --test-concurrency=1 tests/database-*.test.ts):35 pass, 0 fail(含新 RPC 套件)。第一次全量 34/35,database-admin-identity迁移在套件开头失败,单跑即过,属 Docker 争用。- 非数据库
tsx --test tests/*.test.ts:2626 pass;当时 2 fail 为 CSS 合同(已由0be51e65修)与identity-auth-integration(与并行test:db抢 fixture,单跑已过)。
任务 3 · staging 实测
health:e27d5dc5(含 BUG-534),latestMigration=20260904010000_read_report_candidate_range.sql。RPC 对 candidate_accepted 行返回窗口。无 report_candidate_range_unavailable。
第一次(3c4d8311,be6cf145 镜像)
| 项 | 结果 |
|---|---|
| 创建 | generating,未在 16 秒内 calculation_unavailable |
| 引擎 | 5× POST /api/consultation_workflow 200 |
| 章节 | career / health 先落库;随后心跳死在 section:theme-health_pressure(BUG-534) |
| telemetry | career stop inputTokens=5866;health 首次 tripwire×2(无 length) |
| 阅读页 | GET 500 假失败(同一 recordFromRow) |
租约曾延长,避免第三次耗尽被标成 calculation_unavailable。
第二次(20c94bf4,e27d5dc5 干净 attempt 1)
| 项 | 结果 |
|---|---|
| 引擎 | 5× consultation_workflow 200(12:32:43–12:34:12Z) |
| 五章 | 全部 ready,narrative 757–1960 字,均有 evidenceRefs |
| 心跳 | 一次跑到 85% assemble,BUG-534 已不再打断 |
| 终稿 | report_schema_invalid / final_parse_rejected(不是 guard,不是 evidenceHash) |
| telemetry | 无 finishReason=length(五章 + 摘要均为 stop) |
Writer 回溯(只记 evidenceRef,不记正文):
| 章 | 绑定的 bundle 技法 |
|---|---|
| career | ev-tech-d10 ev-tech-a10 ev-tech-amk ev-tech-vimshottari |
| marriage | ev-tech-d9 ev-tech-ul ev-tech-dk |
| wealth | ev-tech-d2 ev-tech-d11 ev-tech-yoga ev-tech-ashtakavarga |
2 倍线(对照 PROGRESS-report-skill-parity-20260901.md 改前 p50 est.tok 1135.5,2×=2271)
干净一次的五章 inputTokens:5804 / 5866 / 5921 / 6031 / 6405。p50=5921 ≈ 5.22×。墙钟 7.9–16.8s。摘要 1542 token / 2.9s。按红线 6 摆数据,不记成通过。
敏感度:RPC 有窗、无降级 warn、引擎 200;assemble 会在 sensitive 主题追加条件句。终稿未落库,无法从文档字段再确认 candidate_window_only。