Files
Jyotisha/docs/tasks/PROGRESS-chart-ephemeris-fixes-20260924.md
T
jesse-ux 19ea0f06c1 fix(chart): keep zero-year chara and ephemeris dates apart
A zero-year Chara period is shown as 0 years instead of failing the whole chart. Switching ephemeris dates drops the previous day immediately and can be retried. Missing birth data links to chart settings.
2026-09-25 02:10:48 +08:00

4.6 KiB
Raw Blame History

PROGRESS · Chara 0 年大运 + 星历切日期 + 星盘无资料入口(2026-09-25)

当前结论

T1、T2、T3、T4 都已完成,没有让步,也没有写进 BLOCKED。引擎 kn_rao 口径、HEAVY_COMPUTE_PATHS、数据库和 workflow 都没动。浏览器登录验收没做。没有推 staging,也没有推 main。

  • 工作树:G:\Ferti\Jyotisha\.worktrees\chart-ephemeris-fixes-20260924
  • 分支:codex/chart-ephemeris-fixes-20260924
  • 基线:origin/staging = 514951d7(代码提交 824647f2)
  • BUG:1023 / 1024 / 1025 开工时仍空着,沿用任务书预留号。最大已占用号是 1022。没有占用 1026 及以后。

逐项

项 结果 说明
T1 完成 0 年大运显示「0 年」,不展开子运,前后日期首尾相接。assembleChartView({layers:["chara"]}) 对真实引擎响应返回 ok。
T2 完成 未缓存日期保留日期条,三段换成静态句。429 后点右箭头重试成功。挂载时的今天刷新和迟到的旧日期都不会盖住新日期。本命 /api/chart 按账户和出生资料短缓存,并把 request.signal 传进引擎调用。
T3 完成 四种资料类失败都有「去填写出生资料」,链到 /?settings=chart,首页打开星盘资料。?settings=billing 的解析结果没改。
T4 完成 BUG 历史、DESIGN §15 / §16、VOICE 三句、CHANGELOG、本记录、真人清单和状态板同一提交。

真实 golden

本机没有仓库 .venv,Anaconda Python 3.11 能 import swisseph。fixture frontend/tests/fixtures/chara-zero-year-1985-08-03-beijing.golden.json 由下面的调用生成,没有手造引擎形状:

  • C:\Users\74082\anaconda3\python.exe
  • JyotishAPIHandler.__new__()._compute_chart,再 _compute_chara_dasha
  • 虚构 1985-08-03 03:59,纬度 39.9042,经度 116.4074,时区 8,ayanamsa=raman,node_mode=mean,skip_vedastro_main_entry_overview,antardasha=true

生成结果 12 段,Sagittarius duration_years 为 0(debilitated)。scripts/jaimini.py 未改。

历史检索

开工读过 BUG-966、BUG-715、BUG-716、BUG-717、BUG-996、BUG-1016、BUG-1017,以及 chart-view / ephemeris / birth_profile_incomplete 的相关段。

  • BUG-966 的「星历不得再上骨架 / 正在加载」还在。本单没有加骨架。它删掉未命中时清空状态的副作用,就是 BUG-1024。
  • BUG-715 的失败分档还在。0 年以前会在 mapper 里抛 RangeError,被收成 engine_bad_payload。现在 0 年是合法段,不再走这条失败。
  • BUG-1016 的骨架例外仍只在星盘盘位。星历没有用。
  • BUG-1017 的按需层失败出口没改。
  • BUG-996:查询失败仍不是 birth_profile_incomplete。四种资料失败各自留原文,只是多了同一颗按钮。

行为说明

失败当天,左右箭头重试这一天,不先改日期。日历里另选一天仍会换日期。成功之后箭头恢复成前一天 / 后一天。

本命缓存键用的是账户 id 加上出生日期、时间、经纬、时区、岁差和交点,与 cachedPostEngine 同一组字段、同一 5 分钟 TTL。键的 path 是 /api/ephemeris/natal-chart,避免和星盘页略有不同的 /api/chart 请求体串结果。行运盘仍按所选日期现算。

测试

改代码前,在 frontend 跑下面这组,93 条,失败 0:

tests/ephemeris-page.test.tsx、tests/ephemeris-route.test.ts、tests/chart-page-view.test.tsx、tests/chart-page-hook.test.ts、tests/settings-url.test.ts、tests/home-shell-growth-contract.test.ts、tests/secondary-page-entry.test.ts、tests/billing-panel.test.ts

改完后同一组再加上 tests/ephemeris-page-lifecycle.test.tsx 和 tests/chart-view-zero-year.test.ts:104 条,失败 0。改前那 93 条里没有新增失败。

  • .\node_modules\.bin\tsc --noEmit:通过。
  • npm run lint:0 error,121 条既有 warning。本次新文件没有新增 warning,也没有为了清 warning 改业务代码。
  • 没有改既有断言的期望值,所以没有「原值 / 新值 / 原因」三栏。
  • 没有跑 Windows 全量 npm test,也不把别人机器上的 3809 / 56 写成这次的结果。
  • 没有跑 next build,没有声称 /、/chart、/ephemeris 的 Static 标记在本机构建里复核过。源码没有把这三条改成动态路由。

没做的验证

  • 没有浏览器登录。真人步骤在 docs/testing/chart-ephemeris-fixes-20260924.md,结果都是待验。
  • 没有部署,没有对过 staging health。
  • 没有推 origin/staging。功能分支可以另推 origin,以回报里的远端核对为准。