docs(tasks): upstream sync 3 brief — solar-return tz, annual panels, compact PL9 (BUG-1095..1097 reserved; MEVG stays mandatory)

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017eEAG8HD3mm8gsKXgk8uU8
This commit is contained in:
Jesse_Chen
2026-09-29 14:37:57 +08:00
co-authored by Claude Fable 5.1
parent 6e393780d9
commit 15be6a0631
2 changed files with 76 additions and 0 deletions
+1
View File
@@ -287,6 +287,7 @@
| `TASK-upstream-sync-fix-20260903.md` | `PROGRESS-upstream-sync-fix-20260903.md` | 非原生主题恢复 `degraded`、finance Yogi/D11/confidence cap、模板注册表引用、VedAstro/MCP finance 路由与 quick CORE 扩列 | 已验收 | `4ee79210`(BUG-515);staging health 已到该 SHA;十主题 e2e 合同全对,Python 红 90→69 无新增 |
| `TASK-upstream-sync2-20260909.md` | `PROGRESS-upstream-sync2-20260909.md` | 上游活跃分支 `b9a0ef8f`(未进 main):婚恋三层触发模型(punarphoo / event_class_split 进证据链)+ 十套条件大运接 full reading 与长报告时间系统表;快照锁推进;Skill 6.9.16;不取 shadbala profile / PL9 用户版 / 校正泄漏项 | 已验收(04ad3325):定向 176 通过、quick 门 708/1 env 失败、pl9 时间系统表 5+10 行;1 P1(网页咨询路径 `dasha_info` 无 MD/AD,事件类拆分空转)→ 修复单 `TASK-upstream-sync2-fix-20260909.md` | 分支 `codex/upstream-sync2-20260909`(BUG-608) |
| `TASK-upstream-sync2-fix-20260909.md` | `PROGRESS-upstream-sync2-fix-20260909.md` | 修复单:`_thematic_dasha_info` 改读 `dasha_sub_periods.current`、婚恋 activation 句按事件类出、`_render_south_chart` 围栏失败不打断报告、health 版本读 `__version__` | 待验收 | `7d3bb0c5`(BUG-609~611) |
| `TASK-upstream-sync3-20260929.md` | — | **上游同步 3(小单)**:上游 `19195f6e..db8cdf4a` 63 提交只抄三条报告面修复——返照时刻按时区本地化(`41d1c740`,本仓 `solar_return.py:275` 固定偏移)、年运面板装配丢失(`089858c0`,先核实再抄)、PL9 紧凑流式写出(`59c9139f`)。不推进快照锁(上游仍 29 处私人标记);**MEVG 不跟上游放松,AGENTS Part B3 维持**(产品 09-29) | 待领取 | — |
| `TASK-rectification-occupation-dated-answer-20260911.md` | `PROGRESS-rectification-occupation-dated-answer-20260911.md` | 09-11 真机:职业题答出的年月被 `applyOccupationCollectLedgerNorm` 抹成 unknown 不计分(BUG-649)+ 工具轮缺口句未并入正文(BUG-650) | 已实现 `1fa994ea`,已部署 | `codex/rectification-occupation-dated-answer-20260911` |
| `TASK-rectification-probe-pool-exhausted-exit-20260911.md` | `PROGRESS-rectification-probe-pool-exhausted-exit-20260911.md` | 09-11 真机:六道带年月题问完后决策仍判「出区分题」(性格题被当区分题)而持久化无载体 → 「没有拿到下一个问题」(BUG-651/652) | 已实现 `66f63c76` + `f870d3d7`,已部署 | `codex/rectification-probe-pool-exhausted-exit-20260911` |
| `TASK-rectification-narrow-before-deliver-20260911.md` | `PROGRESS-rectification-narrow-before-deliver-20260911.md` | 09-11 真机:池空即出卡但范围仍 20 分钟——探针只在引擎跑时按初始簇生成一次、家人题被 0.85 先验丢弃、交付前无定向补事(BUG-653/654,Skill 10.0.24) | 已实现 `6c9a0896`,已部署;验收见修复单 | `codex/rectification-narrow-before-deliver-20260911` |
@@ -0,0 +1,75 @@
# 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。