fix: integrate people archive, report reader and western chart corrections
Independent Staging Quality Gate / validate (push) Successful in 16m28s
Independent Staging Quality Gate / publish (push) Successful in 3m33s

Validate on Linux Node 22 and PostgreSQL 17: 3894 frontend tests and 64 database tests pass, with no removed test names or new failures. Preserve static Home, bounded gzip, assertion-change records and manual acceptance gaps.

Co-Authored-By: Claude Code <noreply@anthropic.com>
This commit is contained in:
jesse-ux
2026-09-25 20:41:16 +08:00
co-authored by Claude Code
parent 48fe4daf51
commit 4d801e53c3
78 changed files with 34844 additions and 441 deletions
+63 -14
View File
@@ -13694,8 +13694,8 @@
- 用户现象:没有出生资料时只看到说明,不能从这一页去填。
- 触发条件:`birth_profile_incomplete`,以及资料查询失败、已采用时间缺时区、时区解析失败。
- 根因:失败页只有一段文字。`parseSettingsQuery` 以前只认 `?settings=billing`。
- 修复:没有资料时加标题「还没有星盘资料」、原句和主按钮「去填写出生资料」,链到 `/?settings=chart`。另外三种资料失败保留各自的句子,并给同一按钮。首页据此打开设置里的星盘资料。`?settings=billing` 仍只开账户与点数。解析只在 `settings-url.ts`。
- 验证:四种资料失败都渲染该按钮;引擎忙不渲染。`?settings=chart` 解析为星盘资料,billing 的既有断言没改。
- 修复(历史):最初加标题「还没有星盘资料」、原句和主按钮「去填写出生资料」,链到 `/?settings=chart`,当时打开设置里的星盘资料。另外三种资料失败给同一按钮。2026-09-25 星盘档案上线后,当前入口改到 `/people`,旧 `?settings=chart` 也转到 `/people`;设置里的星盘资料分区已撤下。`?settings=billing` 仍只开账户与点数。
- 验证(历史与现状):四种资料失败都渲染该按钮;引擎忙不渲染。原回归锁 `?settings=chart` 的星盘资料解析;现行合同锁 `/people` 跳转,不再将旧解析称为当前行为。billing 的既有断言没改。
- 防复发:查询失败不得再写成资料不完整。这四类以外的失败不得带上「去填写出生资料」。
- 相关记录:BUG-996、BUG-715
- 复发自:无
@@ -13703,7 +13703,8 @@
## BUG-1026 | 报告正文仍是审计版,投影把内部句截成半句
- 状态:investigating(读者版切换与泄漏清理已验收:虚构生日读者版 D5 词 0 命中;投影仍误删 Bhava Bala 章节,见读者版修复单;已部署 `fabe0114`)
- 状态:investigating(读者版切换已部署 `fabe0114`;09-25 修复单本地恢复 Bhava Bala 整表、标题与聊天英文,定向通过;组合 Linux 全量、部署与受控浏览器验收待协调方闭环)
- 09-25 修复单补充:`tableIsInternal` 把通用 Score 当内部键,`adjacentInternalTableIndexes` 越过说明段继续删除标题;此前只锁章节关键词和泄漏零命中,没有检查真实十二宫表完整性。现报告表允许 Score / Weight(明确内部键仍拦截),删内部表不连标题;PL9 新规则只用于报告正文,聊天及安全图盘不受影响。真实引擎重算的虚构 reader-main golden 新增整段 Bhava Bala 原样保留断言,且原 `ordinaryOutputLeaks=[]` 不变。前端相关三文件 40/40;旧 density golden 逐行差异只有新增标题/空行,两个冻结 SHA 的原值/新值/原因见 `PROGRESS-report-reader-main-fix-20260925.md`。本轮未提交、未推送,不提前 resolved。
- 首次发现 / 最近更新:2026-09-24 / 2026-09-25
- 影响面:新个人长报告正文、普通投影、旧报告下载后的可见正文。已生成的 Markdown 不回填。
- 用户现象:正文出现「结论等级规则」、英文 boundary、「producer failed」和异常原文、`full-report://`、页码和「…所有行保持」这种半句,以及删表后留下的说明段。
@@ -13734,7 +13735,8 @@
## BUG-1028 | 太阳返照漏了出生上升,年主恒为火星
- 状态:investigating(引擎侧 `birth_asc_sign_idx` 已补、Muntha 随年变化;但 Year Lord 冲突判定在真实数据上仍误报,读者版年运章 Varshesha / Muntha 全为「-」,用户可见结果未修;修复单 `TASK-report-reader-main-fix-20260925.md`)
- 状态:investigating(引擎侧出生上升已补;09-25 修复单本地消除附属键缺失造成的假冲突,读者可见年主/Muntha/未来返照时刻已补真实来源;组合 Linux 全量、部署与受控浏览器验收待闭环)
- 09-25 修复单补充:上轮用户可见结果未修:真实两侧年主相同,但 Tajika 没有 `year_lord_sign`,被当成冲突;读者表又从年主对象读取 Muntha、选取依据,未来年白名单漏 `solar_return`。旧测试只查表头、或使用键集相同的合成字典,没守住可见单元格。现 D1 仅比较年主行星,D2 分别绑定真实字段、补保留未来返照结果;真实冲突仍同时显示两侧。参考提示按缺失/冲突/可读状态生成,不再恒说年主分歧。上游 `23b9609e` 的 `calc_panchadhikari_year_lord` 闭包依赖进程内 PyJHora,并会回退已 blocked 的代理算法,故按 D2 让步不引入、不解除边界。真实完整引擎三年测试与故障注入回归保留两侧真实值,不把本地一致性冒充外部验证。修复文件、测试及三栏见 `PROGRESS-report-reader-main-fix-20260925.md`;本轮未提交、未推送。
- 首次发现 / 最近更新:2026-09-24 / 2026-09-25
- 影响面:Muntha、Year Lord、年度章里的冲突句。
- 用户现象:Muntha 为 blocked;Year Lord 恒为火星 / 白羊座;年度句出现「当前优先候选指向conflict between vs Capricorn」。
@@ -13765,16 +13767,63 @@
## BUG-1030 | 「设为默认」把页面资料换成别人,合盘问题和校正标签因此错人
- 状态:investigating(Claude 2026-09-25 验收 `fabe0114`:activeChartId 已清除,但同单出现两个 P0——报告 worker 仍按户主资料生成、本人会话列表在自托管 Postgres 上 500——及切人时序 P1;修复单 `TASK-people-archive-p1-fix-20260925.md`)
- 状态:investigating(本地永久回归及独立探针通过;最终组合Linux、受控登录与部署待验收)
- 首次发现:2026-09-24
- 最近更新:2026-09-25
- 影响面:首页 `profile`、合盘问题里的「我」、生时校正会话标签、设置里的「当前默认」
- 用户现象:把别人设为当前星盘后,合盘问题把别人写成「我」;校正会话标签显示别人的名字,计算仍用户主。
- 触发条件:`activeChartId` 指向另一份星盘,或点「设为默认」。服务端并不读这个本地键。
- 根因:BUG-466 留下每日星语缓存和 `activeChartId` 不动。BUG-997 / BUG-1000 只把普通对话接到服务端人物,并明确报告、每日星语、生时校正另立任务。页面级 `profile` 仍会被别人的资料覆盖,而星盘、报告和校正继续读 `profiles`。
- 修复:删除 `activeChartId`、`makeDefaultChart` 和替换页面 `profile` 的 effect。当前人物只作为请求参数。星盘、星历、报告、今日星语和普通对话都经 `resolveSubjectBirth` 取服务端资料;失败不回落本人、不扣点。生时校正在当前人物不是本人时禁用。户主仍在 `profiles`。
- 验证:`frontend/src` 不再出现这三个符号。`tests/subject-birth.test.ts` 锁住他人资料与 fail-closed。`tests/database-chart-subject.test.ts` 锁住回填、上限、不可改的填报时间和连带删除。没有登录浏览器,未声称在浏览器里加过人物。
- 防复发:任何客户端代码不得再用他人资料覆盖页面级 `profile`。出生资料只从 `resolveSubjectBirth` 读取。不得恢复「设为默认」或把 `activeChartId` 写回 localStorage。
- 相关记录:BUG-466、BUG-997、BUG-1000
- 影响面:首页 `profile`、合盘问题里的「我」、生时校正会话标签、设置里的「当前默认」、星盘/星历/报告/今日星语。
- 用户现象:把别人设为当前星盘后,合盘问题把别人写成「我」;校正会话标签显示别人的名字,计算仍用户主;切人或刷新时页面还可能先显示本人资料。
- 触发条件:旧 `activeChartId`/默认资料入口、当前人物切换期间的未就绪请求、目录或会话响应晚到。
- 根因:BUG-466 留下每日星语缓存和 `activeChartId` 不动。BUG-997 / BUG-1000 只把普通对话接到服务端人物,并明确报告、每日星语、生时校正另立任务。页面级 `profile` 仍会被别人的资料覆盖,而星盘、报告和校正继续读 `profiles`;新目录/Provider 时序还可能复用旧 ready 或把可恢复目录失败误判为未登录。
- 修复:删除 `activeChartId`、`makeDefaultChart` 和替换页面 `profile` 的 effect。当前人物只作为请求参数;星盘、星历、报告、今日星语和普通对话都经 `resolveSubjectBirth` 取服务端资料,失败不回落本人、不扣点。账户/目录绑定 ready 前不发默认本人首屏请求,当前 generation gate、消息 metadata merge 和 scope 代数拦截迟到响应;生时校正在当前人物不是本人时禁用。户主仍在 `profiles`。
- 验证:永久行为测试覆盖 `?new=1` 当前人物、A→B 分页晚响应、Provider reload 等待、catalog503不登出、跨账户缓存;独立5项前端探针通过。没有登录浏览器,未声称真实页面验收。
- 防复发:任何客户端代码不得再用他人资料覆盖页面级 `profile`。出生资料只从 `resolveSubjectBirth` 读取。不得恢复「设为默认」或把 `activeChartId` 写回 localStorage;ready闸门、metadata合并和异步scope代数必须有行为回归,不只源码字符串。
- 相关记录:BUG-466、BUG-997、BUG-1000、BUG-1031、BUG-1032、BUG-1024
- 复发自:无。BUG-1000 当时规定新对话固定本人,本单按产品决定推翻那一条,不把页面资料再换成人。
- 修复版本:本分支,未推 staging,未部署。
- 修复版本:人物冻结工作树,未推 staging,未部署。
## BUG-1031 | 他人报告后台取户主资料,删除级联后未交付预留可能漏退
- 状态:investigating(本地永久回归及独立真实DB退款矩阵通过;最终组合Linux、受控登录与部署待验收)
- 首次发现 / 最近更新:2026-09-25 / 2026-09-25
- 影响面:报告排队worker、服务端人物解析、本人校正metadata、删除人物RPC与报告删除触发器。
- 用户现象:选择他人生成的报告仍使用户主资料并扣点;删除排队/运行中人物时,报告与job已被级联删除,预留点数可能无后续worker可释放。
- 触发条件:报告POST进入排队成功路径;或未交付报告的所属人物被真实删除。本人报告另存在select投影未带校正case metadata而丢失候选范围的修复期回归。
- 根因:路由虽解析正确人物,worker仍只按job.userId直读profiles;旧测试只锁路由失败路径。单靠worker发现人物缺失再退款覆盖不了删除RPC先级联清除job的真实路径;mock整行profile也掩盖了self metadata漏列。
- 修复:worker按报告持久化chart_profile_id经loadSubjectBirth/resolveSubjectBirth取权威资料;他人不读profiles,本人单独补读校正case metadata、候选窗仅本人。缺失/外属人物失败不回落本人并沿既有退款路径。报告subjectId别名与chartProfileId先规范化、冲突拒绝,未知字段仍拒绝。
- 真实删除修复:新增迁移在报告删除事务内复用release_usage释放未交付预留;ready已交付与completed已结算不退,already-released幂等,其他退款失败回滚删除。删除RPC按job→report锁序与worker一致,避免完成/删除双连接死锁。
- 权限边界:新delete_chart_subject为SECURITY DEFINER,不是依赖调用者RLS。函数显式校验auth.uid非空,锁定同owner且role=other的档案,对session/report删除与job锁均owner过滤;本人/跨用户不可删。触发器函数撤销public/anon/authenticated直接执行权限,RPC撤销public/anon、只授authenticated;两函数search_path为空,不开放通用退款入口。
- 验证:永久worker成功路径注入fake engine、真实select投影,并覆盖缺失/外属失败;新增永久DB用例走真实authenticated删除,不只mock人物null。独立退款r4六场景通过:queued、running、completed、already-released、ready待结算、running完成与删除双连接并发。整体永久定向54/54属于Windows Node22局部,不是最终Linux全量。
- 防复发:报告路由成功不得替代worker真实路径;本人metadata按select列裁剪测试;删除退款必须经真实PG事务与并发,不以worker失败mock替代。不得扩大SECURITY DEFINER授权或删掉owner/role验证。
- 相关记录:BUG-1030、BUG-997、BUG-1000;任务TASK-people-archive-p1-fix-20260925。
- 复发自:BUG-1030同轮多人物接入覆盖遗漏;不是已完成报告重算/退款需求。
- 修复版本:人物冻结工作树,未推 staging,未部署。
## BUG-1032 | 默认本人历史的OR is.null在自托管Postgres上500
- 状态:investigating(算子与真实路径测试已补;最终组合Linux/DB、受控登录与部署待验收)
- 首次发现 / 最近更新:2026-09-25 / 2026-09-25
- 影响面:LocalPostgres兼容层parsePostgrestOr、GET /api/sessions默认subject=self、侧栏本人历史。
- 用户现象:本人侧栏显示「聊天记录暂时无法读取」,存量历史消失;他人会话筛选不走此OR分支。
- 触发条件:本人过滤`chart_profile_id.is.null`与`chart_profile_id.eq.self`通过`.or()`提交给自托管客户端。
- 根因:OR解析器只认比较算子,不支持is,抛unsupported or filter后被路由转为500。BUG-990修复的是not(...,is,null),OR分支未共用完整能力;mock query builder不编译真实SQL,旧测试漏掉此差异。
- 修复:OR支持is.null/is.true/is.false,复用一元IS编译;SQL使用IS NULL/IS TRUE/IS FALSE,不写=null,也不把null/布尔字面量当字符串。本人路由仍查存量null/self,不改筛选语义。
- 验证:local-postgres-or永久测试补算子行为,database-chart-subject新增真实sessions GET+Postgres,核对self返回null/self且不返回他人。Linux中间标准DB63/63是中间快照,不能冒充最终组合验收;最终DB与全量由协调方重跑。
- 防复发:沿用BUG-990要求,兼容层新增算子必须真实Postgres覆盖,不能只mock链式调用或源码正则;OR与not一元IS语义均锁回归。
- 相关记录:BUG-990、BUG-926、BUG-1030。
- 复发自:BUG-990,同一兼容层的另一个is入口未覆盖;旧not-is测试仍保留,不把复发写成无关新问题。
- 修复版本:人物冻结工作树,未推 staging,未部署。
## BUG-1033 | 西洋盘轴点不参与避让,移动端命中圆遮住相邻文字
- 状态:investigating(本地定向及真实字体组件验证通过;集成全量、受控登录与部署待验收)
- 首次发现 / 最近更新:2026-09-25 / 2026-09-25
- 影响面:`western-wheel-layout.ts`、`western-wheel-svg.tsx`,不涉及引擎和接口。
- 用户现象:拥挤盘行星压住 ASC/MC;窄屏文字和点击区过小。扩大命中圆后,一颗星可见文字的末尾可能选中邻星;窄宫宫号也会相碰。
- 触发条件:轴点附近星群、移动端343px实际盘宽、真实非等宫头,后绘制透明命中圆覆盖前一标签末尾。
- 根因:旧布局只松弛行星,不含固定轴点;17单位字号和r22命中圆未扣页面内边距;字框将本地符号字体当成1em,`middle`基线不居中;扩大圆时仅保护标签中心,未覆盖每字符点击归属。宫号固定同半径不足以容纳窄宫。
- 修复:固定ASC/MC、星座名和宫号作为障碍,行星两环近邻搜索;19单位字号、r34命中圆、central基线与2.2em符号字框;先画所有命中按钮,再画可见文字,保持每星唯一Tab/读屏按钮;装饰线不接收指针。宫号保留真实宫中角度,仅拥挤时径向换层。真实原始引擎响应存为golden,映射留在测试内。
- 验证:Node22本地相关28项通过;固定种子512盘、真实引擎64盘所有标签两两检查无碰撞;Chrome实际字体129盘所有字框碰撞0,逐圆中心及逐字符hit-test错误0,实测字号12.53px、命中直径44.85px。最初真实字体碰撞与独立复核字符点击失败均留账于PROGRESS,未删失败样本或放宽1%阈值。
- 防复发:原三项测试及11°间距/宫中角度/骨架断言不降级;扫描锁真实字号、完整标签数、所有标签对、命中分层顺序及无重复键盘按钮;浏览器逐字符检查不能以圆心距离替代。
- 相关记录:BUG-906、BUG-1016、BUG-1017;BUG-1025旧入口文档本轮按历史与现状分开更正。
- 复发自:西洋盘改版的布局覆盖不足。旧单盘golden缺少轴点附近拥挤情形,估算字框未覆盖真实字体。
- 修复版本:`codex/chart-western-fix-20260925`工作树,未提交、未推送、未部署。