Files
Jyotisha/docs/tasks/TASK-upstream-sync3-20260929.md
T

76 lines
9.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# TASK · 上游同步 3:返照时区本地化 / 年运面板保留 / PL9 紧凑写出(小单,2026-09-29)
## 基线
- `origin/staging` @ `6e393780`(写作时 head;开工时以最新 `origin/staging` 为准)。
- 分支 `codex/upstream-sync3-20260929`,工作树 `.worktrees/upstream-sync3-20260929`。
- 上游:`/workspace/yinduzhanxing` 本机干净检出 @ `db8cdf4a`(`origin/main`,2026-09-27)。本仓上次对照点 `19195f6e`(09-24)。
- **不推进快照锁**:`references/upstream/yinduzhanxing/SKILL.md` 与 `references/cross_project_contract/imports/*` 不动(上游仍有 29 处私人标记、10 个文件,`BLOCKED.md` 私人案例一节维持)。
- **文件范围**:只动 `scripts/jyotish_engine.py`、`scripts/solar_return.py`、`scripts/annual_tajika_pack.py`(如需)、`scripts/full_report_quality_gate.py` 及其测试。不碰 `sealed_holdout_rerun.py::PRODUCTION_FILES` 的 10 个校正冻结文件,因此不涉及 ERR-110 重冻结。
- **与同日报告两单的关系**:`TASK-report-reader-polish-20260929.md`、`TASK-report-english-edition-20260929.md` 改 `pl9_reader_export.py` 与前端,与本单文件不重叠,可并行;若执行中发现要动同一处 `jyotish_engine.py`,本单(改动小)先合。同日校正两单(扩集、打分研究)只改 `scripts/research/` 与数据,不重叠。
## 对照实证(Claude 2026-09-29 逐提交核过)
上游 `19195f6e..db8cdf4a` 共 63 提交、490 文件、+91,863 行。三个产品面里只有报告面有三条值得抄的正确性 / 性能修复;聊天与校正零相关改动。
| 上游提交 | 内容 | 本仓现状 |
| --- | --- | --- |
| `41d1c740` feat: separate return location and local timezone from birth place | `solar_return.py` 新增 `_localize_return_datetime(dt_ut, utc_offset, timezone_id)`:用 `ZoneInfo` 按返照**瞬间**取偏移;返照地点可选 `current_location`(`--solar-return-location-mode`、`--current-lat/lon/tz/timezone-id`) | `scripts/solar_return.py:275` `dt_local = approx_dt_utc + timedelta(hours=tz)` 固定偏移。有夏令时地区的用户,年运返照本地时间可能差 1 小时;中国盘无影响 |
| `089858c0` fix: preserve computed annual tables and panels through report assembly | `_preserve_annual_report_surface(packet, annual_snapshot)`:`selected_report_scope == 'full'` 时把 `annual_tajika_pack` 的 12 个键(`profile`、`monthly_chart_pack`、`normalized_tables`、`patyayini_dasha`、`lifetime_annual_chart_pages`、`annual_chart_series_pack`、`pl9_annual_visual_panels`、`pl9_annual_page_map`、`pl9_current_year_results`、`pl9_annual_dasha_results`、`annual_special_points`、`tripataki_chakra`)只补空叶、不重算 | `scripts/jyotish_engine.py:17859` 有同一条 `selected_report_scope == 'full'` 装配路径;是否同样丢面板**未核实**。09-25 `4d801e53` 修的是年主 / Muntha 空(BUG-1028 修复单),不是这一层 |
| `59c9139f` perf: stream compact PL9 JSON while preserving report payload | `output_json(data, *, stream=None)`:`json.dump` 直接写流;`schema == 'pl9_style_professional_export_v1'` 时 `indent=None`、`separators=(',', ':')`;落盘同样走流 | `scripts/jyotish_engine.py:768` `output_json` 仍是 `print(json.dumps(..., indent=2))`;`cmd_pl9_export` 落盘 `write_text(json.dumps(...))`,报告大小的字符串在内存里再造一份 |
同批**不抄**:`SKILL.md` 快照(差 32 行叙述性内容,依赖本仓没有的 `skills/` 与脚本)、`skills/` 13 个家族目录、`professional-report-h5` 店面、`technique_gap_scanner`、MCP `get_blocked_state_recovery_dashboard`、`--gender` Yoga 分支、日食 / Pushkara、KP 入参校验、126 个技法脚本、`candidate_signal_layers.py`。
## 决策记录(产品 2026-09-29)
- **批准**抄上表三条;第 2 条**先核实再抄**,不丢面板就记"不适用"关单。
- **MEVG 不跟上游放松。** 上游 `strict-workflow-router.md` 09-27 把 `MEVG / Global Web Evidence` 从 must 降为 optional、"外部 oracle 缺口不再阻塞传统解读"。本仓 `AGENTS.md` Part B3 / B4 维持原文:MEVG 是面向用户的诚实边界,拿不到外部证据就降置信度或 `blocked`。本仓 `references/strict-workflow-router.md` 已与上游分叉,本单不改它。
- 不推进快照锁、不重导入 SKILL.md、不动 `BLOCKED.md` 私人案例一节。
- 第 1 条:返照地点 `current_location` 模式**只接引擎侧参数**,本单不加前端入口(产品未要求);默认 `birth_place` 行为对中国盘必须逐字节不变。
## 硬红线
1. 生产默认输出不变:用本仓现有 golden(`tests/golden/upstream_sync2/pl9_export_timing.json`、`pl9_time_system_table.md`)与一个虚构北京盘(1990-06-15 10:30)跑 `pl9-export` / `solar-return` / `tajika`,改前改后 JSON **解析后相等**(第 3 条只改序列化,语义不得变)。
2. `.venv/bin/python scripts/run_quality_gate.py --profile quick` 与开工基线逐条一致(先跑基线存日志);`tests/test_tajika.py`、`tests/test_annual_tajika_pack.py`、`tests/test_full_report_quality_gate.py`、`tests/test_professional_report_reference_api.py`、`tests/test_api_server_growth_contract.py` 全绿。
3. `scripts/jyotish_api_server.py` 不增长(§6 冻结);本单不该碰它。
4. 不放宽任何置信度边界;不顺手升依赖、不顺手修无关 warning。
5. 隐私:测试只用虚构或公开名人盘。
6. 每条改动在 PROGRESS 写"上游 SHA / 本仓落点 / 取舍理由",与 09-03 同步单的冲突表格式一致。
## 任务分解
- **T1 返照时刻按时区本地化(BUG-1095)**
- 抄 `_localize_return_datetime`(ZoneInfo;无 `timezone_id` 时退回固定偏移),替换 `solar_return.py:275` 及同文件其他固定偏移处;`calc_solar_return_chart` / `solar_return_full_report` 增加可选 `local_timezone_id`。
- 核查本仓报告链是否把 IANA 时区 ID 传到年运路径(`annual_tajika_pack.py`、`cmd_tajika`、`professional_report_reference.py` 入参);传得到就接上,传不到就在 PROGRESS 写明"当前只能固定偏移,接入需前端改动"并列出缺口,不得伪称已修。
- 引擎侧接 `--solar-return-location-mode` / `--current-*` 参数(默认 `birth_place`);外部 PyJHora 回放在 `current_location` 时按上游返回 `blocked: separate_return_location_not_supported_by_external_adapter`。
- 验收:新增测试——虚构纽约 1985-07-04 08:00 盘,返照年选一个夏令时生效年,本地时间按 `America/New_York` 与固定 `-5` 相差 1 小时;虚构北京盘改前改后逐字节相同;`tests/test_tajika.py` 全绿。
- **T2 年运面板保留(BUG-1096,先核实)**
- 用虚构北京盘跑一次全量 `pl9-export`,检查上表 12 个键在最终交付包里是否为空 / 缺失;结果(每个键:有 / 空 / 缺)写进 PROGRESS。
- 若有丢失:抄 `_preserve_annual_report_surface` 到 `jyotish_engine.py:17859` 装配路径,同年校验、只补空叶;并把上游 `full_report_quality_gate.py` 同批新增的面板覆盖检查接进本仓质量门当回归。
- 若无丢失:BUG-1096 记 `closed_not_applicable`,附核实表;不抄代码。
- 验收:丢失场景修后 12 个键非空、质量门测试先红后绿;无丢失场景只交核实表。
- **T3 PL9 紧凑流式写出(BUG-1097)**
- `output_json(data, *, stream=None)` 按上游改;只对 `pl9_style_professional_export_v1` 去缩进;`cmd_pl9_export` 落盘改走流;其他命令输出格式(`indent=2`)不变。
- 验收:同一输入改前改后 JSON 解析后相等;`pl9-export` 耗时与峰值内存(`/usr/bin/time -v` 或 `tracemalloc`)各测 3 次进 PROGRESS;非 PL9 命令输出逐字节不变。
- **T4 记录**
- `docs/tasks/PROGRESS-upstream-sync3-20260929.md`(含上游对照表、取舍、数字);`docs/BUG_HISTORY.md` 三条;`CHANGELOG.md` 一条(用户可感知:夏令时地区年运返照时间修正;报告导出更快);`docs/tasks/README.md` 状态板行;`docs/research/pre_work_error_ledger.md` 若发现新的重复错误再追加。
## 让步顺序
T1 > T3 > T2 > T4 之外的性能数字。T1 与 T3 缺一不可合入;T2 核实表必须交,抄不抄取决于核实结果。
## 开工前置命令
```bash
git fetch origin --prune
git worktree add -b codex/upstream-sync3-20260929 .worktrees/upstream-sync3-20260929 origin/staging
cd .worktrees/upstream-sync3-20260929
python3 scripts/pre_work_check.py --remote-timeout 8 --command-timeout 45 # §9 引擎类任务预检
/workspace/Jyotisha/.venv/bin/python scripts/run_quality_gate.py --profile quick 2>&1 | tee /tmp/sync3-baseline.log
cd /workspace/yinduzhanxing && git show 41d1c740 089858c0 59c9139f --stat
```
## BUG 编号
开工时核对 `docs/BUG_HISTORY.md` 最大号。写作时 `BUG-1090` / `1091` 由校正两单预留,`1092`–`1094` 由报告两单预留(`6e393780`)。本单:**BUG-1095**(返照固定偏移)、**BUG-1096**(年运面板装配丢失,待核实)、**BUG-1097**(PL9 导出双份字符串)。号冲突则顺延并在 PROGRESS 说明。关联 BUG-608、BUG-1028。