# PROGRESS · 上游同步验收修复单(2026-09-04) 任务书:`TASK-upstream-sync-fix-20260903.md` 工作树:`/Users/jesse/Downloads/Copse/astrology/.worktrees/upstream-sync-fix-20260903` 分支:`codex/upstream-sync-fix-20260903` 实际开工基线:`origin/staging` @ `779717f48c7ce08f9c731663f2203dae19c250c3` 原任务书验收基线:`origin/staging` @ `c1e3f32a` 当前状态:本地修复与验证完成,改动仍在独立工作树且未提交。本记录未声明提交、推送或部署完成。 ## 1. 非原生主题恢复 `degraded` `scripts/jyotish_api_server.py` 重建 `ai_prompt_pack` 时,先合并既有 `evidence_snapshot`,再刷新本次请求的 birth / ayanamsa / core 等字段。这样不会丢掉上游已装配的 `strict_workflow_contracts`,报告适配器仍可识别 `upstream_contract_available=true`。 预期合同: - `general` / `timing` / `family` / `education` / `migration` / `annual`:`degraded`; - 上述主题的 adapter:`upstream_contract_available=true`; - `career` / `marriage` / `wealth` / `health`:继续为 `supported`。 真实 HTTP 十主题 smoke 全部返回 HTTP 200:`career` / `marriage` / `wealth` / `health` 为 `supported`;`education` / `migration` / `family` / `annual` / `timing` / `general` 为 `degraded`,且六个非原生主题的 `upstream_contract_available=true`。耗时 70.82s,脱敏结果保存于 `/tmp/upstream-sync-fix-http-smoke.json`;本地 API 已停止。 ## 2. finance 严格证据口径 ### Yogi / Avayogi 断言取舍 | 原值 | 新值 | 原因 | | --- | --- | --- | | Yogi 点公式为 `Sun + Moon` | `Sun + Moon + 93°20′`;`formula_profile=pyjhora_yogi_sphuta_v1` | 接受任务书决策:旧公式漏掉 Pushya 起点常量,改为 PyJHora Yogi Sphuta 标准式。 | | Avayogi 由旧 Yogi 点派生 | `Yogi + 186°40′` | 与新的标准 Yogi Sphuta 点配套计算。 | | 示例 Yogi 点 `20° / Bharani / 1宫` | `113.3333° / Ashlesha / 4宫`;Avayogi 点锁定 `300°` | 同一虚构夹具按标准公式重算后的确定性结果,不保留旧错误期望。 | | `Yogi=Venus`、`duplicate_yogi=Mars`、`Avayogi=Saturn` | `Yogi=Mercury`、`duplicate_yogi=Moon`、`Avayogi=Mars` | 点位重算后对应星曜随之变化。 | | `level=strong`,存在 `lagna_yogi_tight_orb`、`yogi_planet_is_2l` 和三条 strong signals | `level=weak`,距离 `93.3333°`,tight-orb / wealth-lord links / signals 为空 | 新点位不再满足旧强钩子条件,弱 Yogi 不得抬高财富主判据或写入 `yogi_active`。 | | `primary_source=dhana_yogi_hooks`、source diversity `2`、支持源 `dhana+yogi` | `primary_source=dhana_yogas`、source diversity `1`、支持源仅 `dhana` | Yogi 仅作 modifier;该夹具的新 Yogi 为 weak,不能计作独立财富支持源。 | ### D11 与 confidence cap - `d11_rudramsa` 保留在 finance 证据包中,但定位为**支持项**,不是严格证据的必需项,也不是主判据。 - `wealth_promise_strength` 继续作为财富承诺的主判据。 - `confidence_cap` 回归根因:finance 的 `missing_evidence` 过滤表未把新增的 `d11_rudramsa` 列入非阻断证据。结果是没有 D11 时,即使 Shadbala 分量完整,也会被误判为缺必需证据并把 cap 从 `medium-high` 压到 `low`。 - 修复:把 `d11_rudramsa` 纳入非阻断集合;不改完整 Shadbala 用例原有的 `medium-high` 断言。 - MCP 公开边界继续使用 `finance`:统一路由器内部 canonical `wealth` 会映射回公开名称;当 `annual` / `timing` 时间词先命中、但问题同时有明确财富关键词时,在 MCP strict 边界以 `wealth` 重新解析,避免漏装 finance 的 VedAstro / external evidence。 - 旧 source-pack 元数据恢复到当前 Next.js 真路径:`frontend_interpretation_layer` 指向 report interpretation packs,`frontend_planet_house_details` 指向 `personal-report-generation.ts`,覆盖仍为 `9_planets_x_12_houses`。 对应 Bug:`BUG-515`。 ## 3. 模板注册表引用取舍 没有复制缺失的 `references/mevg_chinese_full_layer_and_practice_audit_2026_08_26.md`;四个模板保留,改指向仓内已有且语义直接匹配的规范: | 模板 | 新引用 | 取舍理由 | | --- | --- | --- | | `dual_luminary_timing_context` | `references/transit-comprehensive-guide.md` | 模板要求 Moon、Lagna/Sun、Dasha 与 transit 的交叉检查,综合行运指南比缺失的通用审计文档更直接。 | | `seventh_house_topic_split` | `references/house-domain-planet-mapping.md` | 模板核心是区分婚恋、合同、公众与对手等七宫主题,宫位—领域映射是本仓直接真源。 | | `empty_window_not_success` | `references/prediction-boundary-protocol.md` | “没有阻碍不等于成功”属于预测边界与置信度约束,应由边界协议承载。 | | `dasha_boundary_not_event_date` | `references/mandatory-verification-gate-protocol.md` | 换运边界不能直接写成事件日,需要多重 Dasha、transit、命盘承诺及外部验证门共同收敛。 | 其余 `source_refs` 保留不变。 ## 4. quick CORE 扩列 `scripts/run_quality_gate.py` 的 `CORE_PYTEST_TARGETS` 新增: - `tests/test_consultation_workflow_domains.py` - `tests/test_mcp_strict_workflow_finance.py` - `tests/test_interpretation_template_registry.py` - `tests/test_vedastro_external_technique_evidence.py` 目的:让本次发现的主题合同、finance 严格证据、模板引用与 VedAstro 外部证据回归进入自动 staging 快速门,而不是只在全量测试中暴露。 ## 5. 本地验证实证 ### 聚焦 pytest 以下集合共收集并通过 88 条测试,墙钟耗时 31.71s: - `tests/test_consultation_workflow_domains.py`:31 条; - `tests/test_mcp_strict_workflow_finance.py`:37 条; - `tests/test_interpretation_template_registry.py`:2 条; - `tests/test_vedastro_external_technique_evidence.py`:10 条; - `tests/test_api_server_growth_contract.py`:3 条; - `tests/test_consultation_engine_field_bridge.py`:5 条。 ### 模板 validator `scripts/validate_interpretation_templates.py` 退出 0:`valid=true`、`problem_count=0`、`template_count=15`(约 0.04s)。 ### quick gate 首次运行因独立 worktree 没有安装前端依赖而在 `npm test` 报 `tsx: command not found`;执行 `npm ci` 后重跑通过。没有运行 `npm audit fix`,避免把依赖升级混入本修复单;`frontend/node_modules/` 受 `.gitignore` 排除,不是交付文件。 最终结果: - Python CORE:585 passed、1 skipped、183 warnings; - 前端测试:2628 passed、0 failed、0 skipped; - lint:0 errors、74 warnings; - Next build:通过; - `scripts/run_quality_gate.py --profile quick`:退出 0,墙钟 575.45s。 完整日志:`/tmp/upstream-sync-fix-quick-gate.log`。 ### 文件守卫 - `scripts/jyotish_api_server.py`:11200 行,与 `HEAD` 同文件行数一致,满足“不增长”红线; - `git diff --check`:通过; - `frontend/node_modules/`:无 Git tracked 文件。 ## 交付边界 - 本工作树改动目前**未提交**。 - 未 push 到任何远端;`origin/staging` 未因本工作树前进。 - 未触发 CI、迁移或部署。 - 未检查或声称 staging `/api/health` 已包含本修复。