feat(annual): localise the solar-return instant, relocated returns, compact PL9 export (BUG-1095..1097)

Upstream yinduzhanxing 41d1c740 / 59c9139f, hand-merged; 089858c0 verified not applicable.

- solar_return: dt_local was the UT instant verbatim (no caller ever added the
  offset). Localise with ZoneInfo at the return instant (IANA id) or the fixed
  offset; expose annual_location; Sahams day/night at the true instant;
  optional current_location return charts.
- cmd_solar_return / annual_tajika_pack / engine: pass birth IANA zone and
  --solar-return-location-mode / --current-* through; external PyJHora
  replay blocked when relocated.
- output_json keeps the upstream stream= signature; PL9 exports written
  compact via dumps (measured faster than json.dump streaming), 9.57 -> 4.61 MB.

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:59:08 +08:00
co-authored by Claude Fable 5.1
parent 15be6a0631
commit 7c5ea7ae5a
9 changed files with 516 additions and 18 deletions
+44
View File
@@ -14686,3 +14686,47 @@
- 相关记录:BUG-560、BUG-1048、BUG-1084
- 复发自:无
- 修复版本:未修
## BUG-1095 | 太阳返照本地时间是 UT 原样:读者版「Varshapravesha」差一个时区,Sahams 昼夜按错误时刻判
- 状态:resolved(2026-09-29 执行方自验;待 Claude 验收)
- 首次发现 / 最近更新:2026-09-29 / 2026-09-29
- 影响面:`scripts/solar_return.py`(`find_solar_return_ut` 返回 `dt_local = dt_ut`,注释「调用方另行加 tz」但无调用方加)、`solar_return_full_report` → `calc_all_sahams(tz=birth_tz)` 昼夜判定、`pl9_reader_export.py:1830/2201` 打印 `dt_local`、年运包 `annual_tajika_pack.py` 经 `cmd_solar_return` 同一路径。
- 用户现象:报告读者版「Varshapravesha:2026-06-15 08:04:52」实为 UT,北京盘应为 16:04:52;跨日时连日期都错(虚构北京盘 2028 年行 06-14 → 06-15)。
- 触发条件:任何目标年的年运;偏移越大越明显。
- 根因:返照求解只算 UT,本地化从未实现;任务书写的「固定偏移在夏令时地区差 1 小时」低估了——本仓根本没加偏移。
- 修复:抄上游 `41d1c740` 的 `_localize_return_datetime`(ZoneInfo 按返照瞬间取偏移,无 IANA 区则固定偏移),`calc_solar_return_chart` 写回 `dt_local` 与 `annual_location`;Sahams 昼夜用 `annual_location`;返照地点可选 `current_location`(引擎 / CLI / 年运包参数;外部 PyJHora 回放异地时 blocked);新增出生地 `--timezone-id` / API `timezone` 传入。
- 验证:`tests/test_solar_return_timezone.py`(10 条);北京盘改前改后解析比对差异仅 `dt_local`、`annual_location`(新增)、`daynight_evidence.julian_day_ut`;`tajika` 0 差异;`Asia/Shanghai` 与固定 +8 0 差异;纽约盘 IANA 区 21:08:03(−4)vs 固定 20:08:03(−5);伦敦异地返照盘上升 Taurus vs Capricorn。数字见 `docs/tasks/PROGRESS-upstream-sync3-20260929.md`。
- 防复发:`test_beijing_return_local_time_is_ut_plus_eight` 锁 `dt_local − dt_ut = +8h` 与昼夜判定时刻 = `jd_ut`;不得再返回 UT 当本地时间并寄望调用方补偏移。遗留:网页报告链只传数字偏移(`personal-report-longform-birth.ts:79`),IANA 区未到引擎,夏令时地区用户仍是固定偏移。
- 相关记录:BUG-608、BUG-1028、BUG-1096、BUG-1097
- 复发自:无
- 修复版本:分支 `codex/upstream-sync3-20260929`,未合入
## BUG-1096 | 全量报告装配时年运面板键被清空(上游 089858c0 所修)——本仓核实不适用
- 状态:closed_not_applicable(2026-09-29 执行方核实)
- 首次发现 / 最近更新:2026-09-29 / 2026-09-29
- 影响面:`scripts/jyotish_engine.py::build_professional_report_reference_packet` / `_apply_pl9_pack_selection`;`scripts/annual_tajika_pack.py`。
- 用户现象:无(本仓从未生成这些面板)。
- 已确认事实:虚构北京盘 `pl9-export --pack full` 的 `annual_tajika_pack` 15 个键里,上游 12 个键中 `profile`、`patyayini_dasha` 有,其余 10 个(`monthly_chart_pack`、`normalized_tables`、`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`)在整个导出包任何路径都不存在;本仓 `annual_tajika_pack.py` 没有生产者,只有 `pl9_reader_export.py` 防御性读取。`_apply_pl9_pack_selection` 在 `full` 时原样返回 packet,不存在装配丢失。
- 根因:不适用——上游修的是它自己 09 月新增的面板生产者被装配层清空;本仓没有该生产者。
- 修复:不抄。上游同批 `full_report_quality_gate.py` +86 行(`80756803`)是逐年 Muntha / Year Lord 一致性与 Ashtakavarga 12 宫映射校验,与面板无关,亦未接。
- 验证:核实表见 `docs/tasks/PROGRESS-upstream-sync3-20260929.md` §T2。
- 防复发:若日后引入年运面板生产者,再评估 `_preserve_annual_report_surface`。
- 相关记录:BUG-1095、BUG-1028
- 复发自:无
- 修复版本:未修(不适用)
## BUG-1097 | PL9 导出 JSON 在内存里再造一份报告大小的缩进字符串,文件体积翻倍
- 状态:resolved(2026-09-29 执行方自验;待 Claude 验收)
- 首次发现 / 最近更新:2026-09-29 / 2026-09-29
- 影响面:`scripts/jyotish_engine.py::output_json` 与 `main()` 的 `pl9-export --output` 落盘。仅 CLI 与落盘路径;生产 API(`jyotish_api_server.py`)自行序列化,不经过此处。
- 用户现象:`pl9-export` JSON 9.57 MB(缩进),序列化峰值 46.9 MB。
- 根因:`print(json.dumps(..., indent=2))`;上游 `59c9139f` 改为流式紧凑。
- 修复:`output_json(data, *, stream=None)` 照抄签名;实现为 PL9 schema 紧凑 `dumps` 一次写出,其他命令仍 `indent=2`。实测上游的 `json.dump` 流式在 CPython 走纯 Python 编码器(0.59 s),比紧凑 `dumps`(0.30 s)慢,故未抄其实现。
- 验证:单步基准 A 0.410 s / 46.9 MB / 9.57 MB → C 0.303 s / 22.1 MB / 4.61 MB;整条 CLI 交错 A/B 3 次基线 6.92/6.62/6.42 s、RSS 197.9/169.2/169.6 MB → 6.58/6.42/6.38 s、191.3/159.4/159.0 MB;解析后相等;`test_output_json_is_compact_only_for_pl9_exports`。
- 防复发:非 PL9 命令输出格式不变由同一测试锁定。
- 相关记录:BUG-1095、ERR-111
- 复发自:无
- 修复版本:分支 `codex/upstream-sync3-20260929`,未合入
@@ -0,0 +1,125 @@
# PROGRESS · 上游同步 3:返照时区本地化 / 年运面板核实 / PL9 紧凑写出(2026-09-29)
任务书:`TASK-upstream-sync3-20260929.md`。分支 `codex/upstream-sync3-20260929`,基线 `origin/staging` = `15be6a06`。上游本机检出 `/workspace/yinduzhanxing` @ `db8cdf4a`。执行方:Claude fork 子代理;只 commit 不 push。
## 一句话结论
- **T1 做了,且比任务书写的更严重**:本仓返照的 `dt_local` 从来就是 UT 原样(`find_solar_return_ut` 注释「调用方另行加 tz」,但没有任何调用方加过)。北京盘读者版报告里的「Varshapravesha:2026-06-15 08:04:52」实际是 UT,应为 16:04:52;2028 年那行连日期都错(06-14 → 06-15)。所以**硬红线 1「北京盘逐字节相同」无法满足,也不应满足**——差异恰好只有被修正的三处(见 §T1 等价比对表),已把改前改后每个差异路径列出,请验收方按语义判断。
- **T2 不适用**:12 个键里 10 个在本仓从来没有生产者(`annual_tajika_pack.py` 不产出面板类键,只有 `pl9_reader_export.py` 防御性读取),不是装配时丢失。BUG-1096 记 `closed_not_applicable`。
- **T3 做了,但没抄上游的实现**:实测 `json.dump` 流式在 CPython 走纯 Python 编码器,比 `dumps` 慢 45%;改为紧凑 `dumps` 一次写出,保留上游 `stream=` 签名。文件 9.57 MB → 4.61 MB、序列化峰值 46.9 → 22.1 MB、0.41 → 0.30 s。
## 上游对照与取舍
| 上游 SHA | 内容 | 本仓落点 | 取舍 |
| --- | --- | --- | --- |
| `41d1c740` | `_localize_return_datetime`(ZoneInfo 按返照瞬间取偏移)、`annual_location`、返照地点 `current_location` 模式与 CLI 参数、外部 PyJHora 回放在异地时 blocked | `scripts/solar_return.py`(helper、`calc_solar_return_chart` / `solar_return_full_report` 四个新 kwargs、`dt_local` 真正本地化、Sahams 用 `annual_location`);`scripts/cmd_solar_return.py`(新增 `solar_return_location_kwargs`,同时接受年运包命名空间 `return_*` 与 CLI 命名空间 `--solar-return-location-mode` / `--current-*` / `--timezone-id` / API `timezone`);`scripts/annual_tajika_pack.py`(`_args_from_payload` 读 `settings.current_location`,出生 `timezone`/`timezone_id` 是 IANA 时传 `return_timezone_id`;新增 `_iana_timezone_id`);`scripts/jyotish_engine.py`(`_annual_payload_from_args` 写 `current_location` 与 `birth.timezone_id`;`_build_pl9_full_annual_section` 异地时回放 blocked;full-reading Step 4.12 透传;`_add_solar_return_location_args` 挂到 `solar-return` / `full-reading` / `pl9-export`) | 全抄,另加 `--timezone-id`(出生地 IANA 区)——上游只在 `current_location` 模式带 IANA 区,出生地模式仍是固定偏移;本仓把出生地 IANA 区也接上,否则 T1 对默认模式没有意义。`tajika_monthly.py` / `_local_eight_year_overview` / `_annual_special_points` 本仓不存在,对应块不抄 |
| `089858c0` | `_preserve_annual_report_surface`:全量报告装配时把 12 个年运面板键从快照补回 | 无 | **不适用**(§T2 核实表)。同批 `full_report_quality_gate.py` +86 行(`80756803`)内容是逐年 Muntha / Year Lord 一致性与 Ashtakavarga 12 宫映射校验,与面板无关,任务书假设的「面板覆盖检查」不存在,未接 |
| `59c9139f` | `output_json(data, *, stream=None)` 流式写出,PL9 紧凑 | `scripts/jyotish_engine.py::output_json` 与 `main()` 的 pl9 `--output` 落盘 | 签名照抄,实现改为紧凑 `dumps`(§T3 数据) |
## T1 · 返照时刻本地化(BUG-1095)
### 事实
- 改前 `find_solar_return_ut` 返回 `'dt_local': dt_ut`(`scripts/solar_return.py:221`),`calc_solar_return_chart` 原样透传;`solar_return_full_report` 把它当本地时间交给 `calc_all_sahams(..., tz=birth_tz)` 做昼夜判定(`saham_daynight.determine_daytime` 再减一次 tz → 判定时刻比真实返照早 8 小时)。
- 读者版 `pl9_reader_export.py:1830/2201` 直接打印 `dt_local`。北京虚构盘(1990-06-15 10:30,39.9042/116.4074,+8,目标 2026)reader_main 渲染:
| 行 | 改前 | 改后 |
| --- | --- | --- |
| `- Varshapravesha:` | 2026-06-15 08:04:52 | 2026-06-15 16:04:52 |
| 2027 表行 | 2027-06-15 14:07:50 | 2027-06-15 22:07:50 |
| 2028 表行 | 2028-06-14 20:25:46 | 2028-06-15 04:25:46 |
- 昼夜判定时刻:`sahams.daynight_evidence.julian_day_ut` 2461206.5034(=06-15 00:04 UT)→ 2461206.8367(=真实返照 08:04:52 UT)。这张盘两者恰好都是白天,判定没翻;其他盘会翻。
### 等价比对(硬红线 1)
方法:改前用基线树(`git worktree add --detach <scratch> 15be6a06`,用完已删)、改后用本分支,同一命令、`PYTHONHASHSEED=0`,JSON 解析后递归比对,剔除 `generated_at` / `elapsed_seconds` / `*_hash` 等易变键。
| 命令 | 差异路径数 | 差异内容 |
| --- | --- | --- |
| `solar-return` 北京盘 | 6 | `solar_return.dt_local` 08:04:52 → 16:04:52;`solar_return.annual_location` / 顶层 `annual_location` 新增;`sahams.daynight_evidence.julian_day_ut` 改为真实返照时刻;`sunrise_jd_ut` / `sunset_jd_ut` 第 9 位小数浮动(rise_trans 起点变了) |
| `tajika --age 36` 北京盘 | **0** | — |
| `pl9-export --pack full` 北京盘 | 83 | 上面三项在 `full_report_pack.sections.annual.*`、`personal_report_producer.source_pack_contracts.annual_tajika_pack.*`、`raw_module_index[35].field_names` 的传播;其余全是易变项(VedAstro 快照 `called_at`、`slowest_stages` 顺序、authority / quality-gate 哈希 id——两次改后运行之间同样有 30 处这类差异) |
| `solar-return` 北京盘 固定 +8 vs `--timezone-id Asia/Shanghai` | **0** | 无夏令时地区 IANA 区与固定偏移等价 |
**结论:北京盘不是逐字节相同,差异恰为修正项本身;这一条需要验收方确认接受。**
### 夏令时与异地验证(虚构纽约盘 1985-07-04 08:00,40.7128/-74.006,`--tz -5`,目标 2026)
| 模式 | `dt_ut` | `dt_local` | `annual_location.utc_offset` | 返照盘上升 |
| --- | --- | --- | --- | --- |
| 固定偏移(改后默认) | 2026-07-05 01:08:03 | 2026-07-04 20:08:03 | −5.0 | Capricorn |
| `--timezone-id America/New_York` | 同 | 2026-07-04 **21:08:03** | **−4.0**(EDT) | Capricorn(盘按 UT 起,不变) |
| `--solar-return-location-mode current_location --current-lat 51.5074 --current-lon -0.1278 --current-tz 0 --current-timezone-id Europe/London` | 同 | 2026-07-05 02:08:03 | +1.0(BST) | **Taurus** |
### 时区 ID 能否传到年运路径(任务书要求核查)
- 引擎侧已通:CLI `--timezone-id`;API `birth.timezone` / `timezone_name`(`calculation_profile_contract._normalize_timezone` 认这两个键)→ profile `timezone.name` → `_annual_payload_from_args` 写 `birth.timezone_id` → `annual_tajika_pack._args_from_payload` → `return_timezone_id`;full-reading Step 4.12 走 `solar_return_location_kwargs(args)` 读 `timezone_id` / `timezone` / `timezone_name`。
- **前端缺口(未修,前端不在本单范围)**:`frontend/src/lib/personal-report-longform-birth.ts:79` 只传数字 `tz: profile.timezoneOffset`;账户资料其实存了 IANA 区(`account-profile-patch.ts:55` `timezone_id`,全球出生地必填)。网页报告因此仍走固定偏移:中国用户无影响;夏令时地区用户只有当资料里的偏移恰好等于返照瞬间的偏移时才对。补一行 `timezone: profile.timezone_id` 即可接上,建议另开前端小单。
## T2 · 年运面板核实表(BUG-1096,closed_not_applicable)
北京盘 `pl9-export --pack full --format json`(`selected_report_scope = full`),`worksheets.timing_and_predictive_systems.annual_tajika_pack`:
| 键 | 状态 | 说明 |
| --- | --- | --- |
| `profile` | 有 | |
| `patyayini_dasha` | 有 | 同时出现在 `external_engine_comparison.pyjhora` 与 `exports.json.field_statuses` |
| `monthly_chart_pack` | 缺 | 全包任何路径都没有;本仓 `annual_tajika_pack.py` 无生产者 |
| `normalized_tables` | 缺 | 同上 |
| `lifetime_annual_chart_pages` | 缺 | 同上 |
| `annual_chart_series_pack` | 缺 | 同上 |
| `pl9_annual_visual_panels` | 缺 | 同上 |
| `pl9_annual_page_map` | 缺 | 同上(本仓源码 0 处引用) |
| `pl9_current_year_results` | 缺 | 同上 |
| `pl9_annual_dasha_results` | 缺 | 同上 |
| `annual_special_points` | 缺 | 同上 |
| `tripataki_chakra` | 缺 | 同上 |
本仓年运包实际键:`annual_chart, audit, exports, external_engine_comparison, monthly_windows, mudda_dasha, muntha, patyayini_dasha, profile, report_sections, sahams, schema, solar_return, tajika_yogas, year_lord`(15 个)。「缺」不是装配丢失(`_apply_pl9_pack_selection` 在 `full` 时原样返回 packet),而是从未生成;上游的补回逻辑没有可补的来源。不抄代码。
## T3 · PL9 紧凑写出(BUG-1097)
### 序列化单步基准(改后 4.61 MB 语义包,`tracemalloc`,5 次取中位)
| 变体 | 耗时 | 峰值内存 | 文件 |
| --- | --- | --- | --- |
| A 旧:`dumps(indent=2)` + 写 | 0.410 s | 46.9 MB | 9.57 MB |
| B 上游:`json.dump(stream, compact)` | 0.593 s | 0.1 MB | 4.61 MB |
| C 采用:紧凑 `dumps` 一次写出 | **0.303 s** | 22.1 MB | 4.61 MB |
B 慢是因为 `json.dump` 只能走 `iterencode` 纯 Python 路径(C 编码器只在 `dumps` 且 `indent=None` 时启用)。本仓生产 API 路径(`jyotish_api_server.py`)不经过 `output_json`,本项只影响 CLI 与 `--output` 落盘,所以选耗时最优的 C,保留 `stream=` 签名。三种变体解析后与源对象相等。
### 整条 CLI 交错 A/B(`pl9-export --pack full --format json`,基线树 / 本分支交替各 3 次,`resource.getrusage` 子进程)
| 轮 | 基线耗时 | 基线 RSS | 改后耗时 | 改后 RSS |
| --- | --- | --- | --- | --- |
| 1 | 6.92 s | 197.9 MB | 6.58 s | 191.3 MB |
| 2 | 6.62 s | 169.2 MB | 6.42 s | 159.4 MB |
| 3 | 6.42 s | 169.6 MB | 6.38 s | 159.0 MB |
输出文件 9.57 MB → 4.61 MB;非 PL9 命令(`solar-return` / `tajika`)仍 `indent=2`,输出逐字节不变(tajika 0 差异)。
## 测试
- 新增 `tests/test_solar_return_timezone.py`(10 条):ZoneInfo 夏令 / 标准偏移;北京 `dt_local = dt_ut + 8h` 与昼夜判定时刻回归;`Asia/Shanghai` 等价固定 +8;纽约 IANA 区差 1 小时且盘不变;伦敦异地返照盘上升不同;返照地点不全时报错;两种命名空间的 kwargs;年运包参数映射与缺字段报错;`output_json` 只对 PL9 紧凑且可解析。
- 任务书点名:`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 tests/test_cli_smoke.py` → 118 passed。
- 快速门(`run_quality_gate.py --profile quick`,系统 `python3` 3.13.5 + swisseph,`/workspace/Jyotisha/.venv` 在本机不存在):
- 基线 15be6a06 第一次(无 Node):Python 步 1001 passed / 1 skipped,`npm test` exit 127(PATH 无 node)。
- 基线第二次(`PATH=/exec-daemon` Node 22.14):Python 步 **1 failed** `tests/test_consultation_native_layers.py::test_annual_route_attaches_the_annual_pack_verbatim`(`'blocked' == 'parameter_sensitive'`),门在 Python 步停下、未到 npm。该测试改后单独跑 3/3 通过(exit 0);当时同机另有两个子代理在跑全量测试,判为负载相关的瞬时失败,不是本单改动(基线树、改动前)。
- 改后(Node 22):见文末「快速门改后」一节。
## 未完成 / 缺口
- 前端 IANA 区未传(见 T1 末节)。
- `full_report_quality_gate.py` 未改(上游同批改动与面板无关)。
- `saham_daynight` 的昼夜判定输入现在是真实返照本地时刻;其他盘的昼夜结论可能因此翻转(这是修正,不是回归),未逐盘统计。
## 快速门改后(`PATH=/exec-daemon` Node 22.14,系统 python3 3.13.5)
- Python 步:**1001 passed / 1 skipped / 3 subtests passed**(149.84 s),与基线第一次逐条一致;基线第二次瞬时失败的 `test_annual_route_attaches_the_annual_pack_verbatim` 本次通过。
- `npm test` 步:`sh: 1: tsx: not found` → exit 127。原因是本 worktree 没有 `frontend/node_modules`(基线两次同样在这一步 exit 127,逐条一致)。本单不改前端,另用临时软链到主检出的 `frontend/node_modules` 单独跑了一次 `npm test`(见下一节;软链跑完即删,不入库)。
## 前端 `npm test`(本单零前端改动;临时软链主检出 `frontend/node_modules`,Node 22.14,跑完即删)
`# tests 4357 / # pass 4302 / # fail 24 / # cancelled 0 / # skipped 31`,exit 1。24 条失败全是需要 Docker / 本地 PostgreSQL / 部署套件的用例(`local PostgreSQL applies the reviewed business schema…`、`migration runner…`、`staging backups…`、`Better Auth…` 等),与 09-29 已知基线 4302/24 的环境失败清单一致(无 Docker),无新增失败。
+1 -1
View File
@@ -287,7 +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-upstream-sync3-20260929.md` | `PROGRESS-upstream-sync3-20260929.md` | **上游同步 3(小单)**:上游 `19195f6e..db8cdf4a` 63 提交只抄三条报告面修复——返照时刻按时区本地化(`41d1c740`,本仓 `solar_return.py:275` 固定偏移)、年运面板装配丢失(`089858c0`,先核实再抄)、PL9 紧凑流式写出(`59c9139f`)。不推进快照锁(上游仍 29 处私人标记);**MEVG 不跟上游放松,AGENTS Part B3 维持**(产品 09-29) | 已实现待验收(执行方 09-29:T1 返照本地化做了且发现 `dt_local` 一直是 UT,北京盘差异=修正项本身,硬红线 1 需验收方判;T2 核实 10/12 键本仓无生产者,不适用;T3 紧凑 `dumps` 9.57→4.61 MB;前端 IANA 区未传是缺口) | `codex/upstream-sync3-20260929`(BUG-1095~1097),未合入 |
| `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` |