# PROGRESS · TASK-qizheng-native-chart-20260915 分支:`codex/qizheng-native-chart-20260915` 开工基线:`4cacea8e`(任务书四份已在 staging;代码基线仍是 `2d7698ea` 之后的 staging 全量) 本机:Windows。Python 用 Anaconda 3.11.7(`pytest` + `pyswisseph` 已装)。仓库 `.venv` 是指向 `/workspace/Jyotisha/.venv` 的 git symlink,Windows 上不是可用目录。 ## 开工核对 | 项 | 结果 | | --- | --- | | `git status -sb` | `codex/qizheng-native-chart-20260915...origin/staging` | | `scripts/jyotish_api_server.py` 行数 | 开工 11313;上限 11363 | | `docs/BUG_HISTORY.md` 最大号 | 开工时 BUG-699。本单按预分配写入 **700–703**。rebase 时发现 `3e58e85f` 的 `TASK-rectification-tiebreak-card-loss-20260915.md` 把 702–704 写进了另一份任务书(尚未写入 BUG_HISTORY)。本单记录已落盘,另一单须整体后移,不得覆盖 700–703 | | Skill | `6.9.16`,**未 bump** | | `pre_work_check.py` | python_runtime / fragment_scan / external_engine_adapters / remote_visibility 均 ok。focused_tests 两条 `test_preflight_fragment_scan.py` 红:本机没有 `.workbuddy/skills/jyotish-vedic-astrology` 镜像路径,且 fragment candidate_count 5 < residue 14。与本单改动无关,未修 | ## 任务 1 · vendored 归档与镜像 Node - 上游不从 GitHub 拉。本机 `G:\Ferti\yinduzhanxing-codex-add-birth-time-rectification-skill` = 任务书 `/workspace/yinduzhanxing`(`a911c890`)。已按内容拷贝 `vendor/stem-branch/{LICENSE,README.md,package.json,dist/cli.cjs}` 到本仓同名路径。`cli.cjs` **45,963 行 / 2,682,464 B**,sha256 前缀 `cf1bca10507ffcc9`,与上游文件逐字节相同。 - `scripts/qizheng_chart_engine.py` 以上游 168 行适配器为起点(`calculate_qizheng_chart` + CLI `--seven-governors --json`),再按任务 2 改派别参数、boundary、坐标系和错误路径。vendor 以本机 `a911c890` 目录为准,已删除从 npm 另凑的 `dist/index.cjs`。未带 `6c27aab6` / `8bba9cb5`。CLI 无 ketuMode 旗标:请求派别回写 `calculation.ketu_mode`,实际盘面以 `engine_ketu_mode` 为准。 - 仓库根 `NOTICE`:包名、0.8.0、Apache-2.0、上游地址、取入方式。 - `deploy/railway-api.Dockerfile`:`nodejs` 运行时(不装 npm/构建链),`COPY vendor ./vendor`。 - `deploy/gated-paths.txt`:新增 `vendor/**`。 - **镜像构建 / 容器内 `node --version`:无 Docker,未跑,不写成通过。** 宿主机 `node --version` = `v22.23.2`。镜像体积变化:未知。 ## 任务 2 · 适配器 `scripts/qizheng_chart_engine.py`:只调 `getSevenGovernorsChart`;禁止 `--pillars` 等子命令。`ketu_mode` / `sidereal_mode` 从请求读取并回写。`coordinate_system=qizheng_mansion_degrees_from_jiao`。boundary 无「神煞」,庙旺 `unclosed`。五种错误路径结构化,不 500、不外泄 stderr。 实跑虚构资料 `1990-04-09T13:24:00+08:00 / 31.19N 121.44E`: | 项 | 值 | | --- | --- | | 太阳 | 宿度 177.94 奎 7.44° 亥宮 陷 | | 罗睺 | 宿度 112.09 女 5.09° 丑宮 | | 计都(apogee) | 宿度 27.46 亢 15.46°(近月孛,非罗睺对点) | | 紫炁 | 宿度 33.34 房 0.34° 卯宮 | | 命宫 | 星 · 午宮 | | 宫 / 相位 / 神煞 | 12 / 27 / 0 | ## 任务 3 · 三个只读端点 `scripts/jyotish_api_server.py` 净增 **21 行**(11313 → 11334,预算 32,上限 11363)。三个 handler 各 ≤ 8 行。已纳入 `JYOTISH_HEAVY_COMPUTE_CONCURRENCY`。 - `/api/qizheng` 见上。 - `/api/western` → `build_tropical_natal_chart`;`house_system` 默认 `P` 可覆盖;回归黄道边界句含 Raman 岁差差值。 - `/api/ephemeris_events`:90 天 Raman 窗口 **14** 条(ingress 8 + station 6),Lahiri 同窗 16 条且不同;>730 天 400。 本地 `POST http://127.0.0.1:5200/api/qizheng`(与任务书 curl 等价;PowerShell 下 `curl.exe -d` 引号被吃掉,改用 Python `urllib`,status 200): ```json {"success": true, "endpoint": "qizheng", "coordinate_system": "qizheng_mansion_degrees_from_jiao", "calculation": {"engine": "@4n6h4x0r/stem-branch", "engine_version": "0.8.0", "ketu_mode": "apogee", "sidereal_mode": {"type": "modern"}, "engine_ketu_mode": "apogee", "engine_sidereal_mode": {"type": "modern"}, "iso_local": "1990-04-09T13:24:00+08:00", "timeout_seconds": 20}, "ascendant": {"mansion": "星", "palace": "午宮"}, "bodies.sun": {"siderealLon": 177.94225865978694, "mansion": "奎", "mansionDegree": 7.442258659786944, "palace": "亥宮"}} ``` `GET /api/health`:`status=ok`,`swisseph_available=true`。本地 `git_commit` 为 unknown(未部署)。 ## 任务 4 · Bug | 号 | 状态 | | --- | --- | | BUG-700 | blocked(不调用 `--pillars`) | | BUG-701 | resolved(派别参数化) | | BUG-702 | resolved(boundary / 庙旺 unclosed) | | BUG-703 | investigating(panchanga Lahiri,本轮不修) | ## 测试 Anaconda `python -m pytest`: - `tests/test_qizheng_chart_engine.py` - `tests/test_qizheng_api_productization.py` - `tests/test_readonly_chart_endpoints.py` - `tests/test_ephemeris_events.py` - `tests/test_api_server_growth_contract.py` - `tests/test_api_heavy_compute_gate.py` - `tests/test_western_chart_engine.py` **36 passed**。 `run_quality_gate.py --profile quick`:本机无 Docker,`npm test` 预期仍是既有 27 条 DB 失败,不得写成全绿。Python 段另缺 `timezonefinder` / `mcp`(见根 `BLOCKED.md`)。上述定向测试已绿。新测试已列入 `CORE_PYTEST_TARGETS`。 ## 让步 无。3b/3c 已交付。限流已接入。`raw_engine_output` 已落地并去掉路径键。 ## 合入 本单最先合入 staging。`git push` 经 SSH `git.copse.top:2222`。远端 `origin/staging` = **`e776cf9d`**(与 HEAD 一致)。不提升 `main`、不改 workflow、不动 DNS。staging `/api/health` 的 `deployment.gitCommit` 要等 `backend-quality-gate` 部署后才能等于该 SHA。