Files
Jyotisha/docs/tasks/TASK-upstream-sync-20260903.md
T

42 KiB
Raw Blame History

任务书 · 上游研究仓同步与三项新能力接入(2026-09-03)

基线:origin/staging @ 591ffd21。上游研究仓 732642856/yinduzhanxing 目标提交 a6f47abd2c9b7c6baa911ea00c971e1ec902380c2026-09-03main)。本地干净检出在 /workspace/yinduzhanxingorigin 与策略文件一致,git status 干净)。

现状实证

  1. 快照落后 20 天、629 个提交。 references/upstream/yinduzhanxing/source-manifest.json 锁在 5db725372026-08-14)。上游到 a6f47abd 之间:references 1040 文件、docs 539、scripts 707(约 640 个是新研究脚本)、tests 750。上游自己的 9 月总结(docs/research/september_2026_execution_log.md)写明"本地代码工作已关闭,剩余全部是外部证据准入阻塞,不允许任何真相/运行时/发布/预测层升级"。这批不是能力大升级,是研究台账为主。

  2. 导入器只覆盖 SKILL.md。 references/cross_project_contract/sync_policy.v2.json:唯一字节镜像是上游 SKILL.mdreferences/upstream/yinduzhanxing/SKILL.md;六个"语义合并"文件(SKILL.mdAGENTS.mdreferences/strict-workflow-router.mdscripts/unified_consultation_orchestrator.pyscripts/report_orchestrator.pyscripts/jyotish_api_server.py)导入器只列不写;其余引擎代码不在策略范围内。

  3. 引擎是分叉,不是镜像。 本仓 scripts/ + jyotish_vedic/ + mcp_server.py 共 389 个 Python 文件:242 个与快照 5db72537 逐字节一致,92 个有商业改动,55 个本仓独有。上游 HEAD 另有 736 个本仓没有的 Python 文件。因此引擎同步只能做三方合并base = 上游 5db72537ours = 本仓,theirs = 上游 a6f47abd)。

  4. 三方合并干跑结果git merge-file -p ours base theirs,冲突块数):

    文件 ours 改动行 theirs 改动行 冲突块
    scripts/jyotish_api_server.py 8283 3383 36
    scripts/jyotish_engine.py 3649 10924 25
    scripts/unified_consultation_orchestrator.py 553 753 18
    mcp_server.py 655 625 11
    scripts/active_rectification_questions.py 197 160 7
    scripts/ashtottari_dasha.py 264 134 5
    scripts/active_rectification_events.py 204 101 5
    scripts/domain_calculation_service.py 410 20 5
    references/technique_registry.json 3084(仅格式,内容与快照一致) 966 5
    scripts/narayana_dasha.py 486 269 4
    scripts/run_quality_gate.py 132 54 4
    scripts/kp_system.py 205 145 3
    scripts/varga.py / tajika.py / report_orchestrator.py 35 / 324 / 108 43 / 88 / 28 各 1
    scripts/jaimini.py / muhurta.py / western_timing_engine.py / solar_return.py 1 / 2 / 0 / 54 137 / 1618 / 230 / 84 0

    jyotish_engine.py 的 25 处冲突集中在本仓商业改动过的同一批函数:_build_ai_prompt_packcompute_chart_datacmd_chartcmd_dashacmd_shadbalacmd_tajika_calc_actionable_context_add_chart_args_ayanamsa_display_namemain

  5. 上游真正涉及业务能力的变化(按本仓产品是否用到排序):

    • references/strict-workflow-router.md:新增 health-timing-strict 路由(D1/D6/D8/D30Narayana 交叉核对,输出必须分压力窗 / 事件风险窗 / 恢复支持窗三段,非医疗边界),wealth-timing-strict 改名 finance-timing-strict 并保留旧别名。上游编排器 route_surface_contract 已把 wealth-timing-strict 作为 finance 的别名。
    • references/technique_registry.json:91 → 116 项。新增 25 项全是 western_*western_profectioncovered,其余 guarded)、classical_*(全 guarded)、ziwei_*comparison-onlycovered)。
    • Ashtottari 解冻:blocked_rule_source_conflictselected_rule_family_parameter_sensitive,可执行但未验证,只对规则族 rahu_from_lagna_lord_kendra_trikona_plus_paksha_daynight 适用;scripts/ashtottari_dasha.pySKILL.md 同步改动。
    • VedAstro:官方 MCP 端点 tools/call 持续返回 Invalid or Outdated Call,上游把默认外部对标通路切到 REST 桥 scripts/vedastro_rest_bridge.pyhttps://api.vedastro.org/api/Calculatehoroscope / dasa 两个子命令实测 Status: Pass,免费层 5 次/分钟)。本仓 scripts/vedastro_gateway.pyOFFICIAL_ENDPOINT 本来就是 REST 根地址,但本仓 scripts/vedastro_official_mcp_bridge.py 仍被 vedastro_parity_matrix.py 使用。
    • scripts/jyotish_engine.pypl9-export 子命令(build_pl9_style_export_packet(full_reading) + render_pl9_markdown,格式 json / markdown / pdf / authority--pack 选包),术语规范改为 professional_report_referencedocs/architecture/professional_report_reference_contract_v1.md),markdown 导出带引擎边界声明(上游 7a2793cb)。与咨询链路直接相关的改动落在 _build_ai_prompt_pack7 块)、cmd_full_reading10 块)、cmd_varga_full4 块)、cmd_dasha4 块)、_build_career/finance/relationship_narrative_payload,以及新增的 _build_pratyantar_timeline_build_birth_time_sensitivity_build_planetary_friendship_snapshot_build_three_year_predictive_ephemeris_pack_build_module_execution_audit
    • scripts/muhurta.py +1600 行择日能力(Panchaka、Tarabala/Chandrabala、Siddha Yoga、Durmuhurtha 窗口、择日盘 dosha 与取消权重);jaimini.pynarayana_dasha.pykp_system.pywestern_timing_engine.pytajika.pysolar_return.pyvarga.py 各有修改。
    • mcp_server.py 新增 get_pl9_expert_reader_reportget_pl9_full_report_authorityroute_jyotish_question;编排器新增专家判断影子层(build_expert_judgment_shadow_input 等)与 route_surface_contract
    • 新增两个子 skillskills/financial-astrology(市场占星)、上游版 skills/jyotish-birth-time-rectification
  6. 本仓相关现状

    • 咨询链路的 health 路由已经存在scripts/unified_consultation_orchestrator.py _ROUTE_DEFINITIONS["health"]D1/D6/D8/D30,输出段 non_medical_pattern / pressure_factors / protective_factors / verification_questions),前端 frontend/src/lib/consultation-methodology.ts 已把 health 映射到 health-timing-strict。差距在于:输出合同不是上游的三窗结构;focus_techniques 缺 Narayana / Transit / 功能吉凶;证据包无 health 专属必需段;个人报告主题枚举没有 healthfrontend/src/lib/personal-report-route-core.ts:37 只有 career / marriage / wealth / timing / general);引擎没有 health 叙事种子生成器。
    • 前端 wealth 主题硬编码 wealth-timing-strict,本仓编排器没有 finance 别名。
    • 导入器 dry-run 在主检出直接被拒:{"status": "rejected", "reason": "target_must_be_clean"}(根目录有未跟踪的 TASK 文件)。必须在干净 worktree 里跑。

根因

上游是研究仓,日更数十个提交;本仓是分叉后带商业改动的产品仓,两者没有共同 git 历史。导入策略 v2 设计时只解决了"真相层"(SKILL.md)的镜像与审计,没有给引擎代码定同步办法,于是 20 天没有同步,再往后只会更难合。

决策记录(产品负责人 2026-09-03 授权)

  • (a) 推进上游快照到 a6f47abd,按策略 v2 镜像 SKILL.md、语义合并六个文件、整体接收 116 项注册表并由商业覆盖层定状态。
  • (b) 引擎代码做三方合并(基线 5db72537),商业改动优先,只取对产品路径有意义或纯新增的上游改动。
  • (c) 三项新能力全部要做:health 路由对齐上游三窗合同并进入个人报告主题;VedAstro 外部对标切到 REST 桥;pl9-export 专业报告导出接进个人报告产品。
  • (d) 校正解冻(2026-09-03 用户决定):撤销"校正冻结新行为直到走查清零"对本任务书的限制,但只解冻到任务 7 列出的三项(自适应选题、岁差/交点模式按请求传递、不确定出生时间的报告敏感度节)。校正打分算法(V5 score service、POLICY v3、matrix-scoring-7)、采用/停止规则(BUG-463 / BUG-503 口径)、会话面交互本轮仍不动。解冻后欠着的浏览器走查(docs/testing/)必须在任务 7 合入后重新跑一遍。
  • 授权不包括:接收上游约 640 个研究脚本、150 万行证据台账、750 个研究测试、两份 PDF、skills/financial-astrology、上游版校正 skill;修改岁差默认值(保持 Raman,见 TASK-repo-hygiene-20260903.md);放松写作 agent 输入隔离;改数据库结构;改 .gitea/workflows/**
  • 注册表新增 25 项的商业状态默认规则:凡网页路径(/api/consultation_workflow)没有实际执行的,覆盖层一律 research_only_blocked;只有 scripts/full_technique_invocation_matrix.py 证明会执行的才可写 partialreference_only。不得因上游写 covered 就进确定性结论。

三个产品面的覆盖对照

产品面 上游相关变化 本任务书落点
普通聊天(/api/consultation_workflow → 折叠技法审计表) finance 别名、health 三窗、Ashtottari 状态、_build_technique_audit_table / _build_module_execution_audit、叙事种子 timing_narrativeplanetary_friendship 模块 任务 1(覆盖层与路由文档)、任务 2(引擎合并)、任务 3(health)、任务 6(把新字段接到响应与前端)
生时校正(/api/rectification/*/api/active_rectification_events*、前端 birth-time-journey 3bb90620 自适应选题器(含答案泄漏)、dbb9804a 亲属事件域 + 岁差/交点按请求传递、d5b83c71 compare_candidate_minutes + 事件域注册表、_build_birth_time_sensitivity + 四个 flexible_birth_time_* 模块、便携版 skill v2.0.0 任务 7(只取选题器、岁差/交点传递、报告敏感度节三项);其余不取,理由见硬红线 3
报告生成(个人报告管线、报告中心) health 主题、pl9-export、解读模板注册表 +145 行、timing_narrative / pratyantar_dasha_timeline / planetary_friendship 可作解读性事实 任务 1(模板注册表)、任务 3(health 主题)、任务 5(专业导出)、任务 6(新字段进 bundle)

硬红线

  1. 方向单向。 只从 /workspace/yinduzhanxing 读,不得向其写入、提交或推送;不得改 sync_policy.v2.json 的方向、受保护路径与最小保护集。
  2. 受保护路径不接收上游内容skills/jyotish-birth-time-rectification/**skills/jyotish-vedic-astrology/**(只能新增版本目录,不能改既有版本)、根 SKILL.md(只允许语义合并本任务书列出的三段)、frontend/**deploy/**.gitea/**references/oracle/commercial_skill_truth_overlay.v1.json(只允许按决策记录新增条目)。
  3. 校正只按任务 7 的范围动。 上游自快照以来对校正的改动共四个提交,逐个核过:
    • 3bb9062008-31)新增 _known_case_regression_hint:对 1993-04-17 出生时间读作者本人的已知案例标定文件,把 14:49 当回归目标并在分钟排名里 +5 分。这就是已定性的答案泄漏,一行都不得进入本仓;同一提交里按 sensitivity_count 排分钟的 minute_rankings 也不取(比本仓 V5 打分弱)。该提交里的 active_rectification_selector.pyfactual_reliability、把 scan_candidate_times 挂进 _candidate_scan 是可取部分,见任务 7a。
    • dbb9804a08-18)亲属事件域(parent / sibling / spouse_family)与分盘扩到 D3/D7/D12:本仓 family 域已含 D12/D7/D3,分盘列表 [2,3,4,5,7,9,10,12,24,30] 是超集,不取;该提交里 ayanamsa / node_mode 从请求读取的模式取,见任务 7b。
    • d5b83c7108-27compare_candidate_minutes 固定分钟微比较:本仓 V5 score service、minute_rectification_pairwise_v3.pyminute_candidate_discriminability.pybuild_stability_diagnostics 已覆盖且更强,不取。references/rectification_evidence_contract_v1.json 事件域注册表是治理数据,本仓 rectification_technique_contract.py 已是代码化合同且不含 D60/D40/D45,规则等价,不取,PROGRESS 记一句。
    • a905866308-31)便携版校正 skill v2.0.0:与本仓 v10.0.14 服务器权威 Case 模型不同源,受保护路径,不取。
    • _build_birth_time_sensitivity + flexible_birth_time_profile / report_support / full_report_projection / report_section(四模块 761 行,测试 440 行,除被守护的 1993 分段表外无数据文件依赖):取,见任务 7c,但窗口来源必须改为本仓校正案例的可信区间,不用上游固定 ±1 分钟。 校正的打分算法、阈值、采用/停止规则、frontend/src/lib/rectification-agentic/v9/** 的会话状态机本轮不动;minute_rectification_* / dynamic_rectification_* 不合并上游(上游没有对应文件)。
  4. 咨询响应契约不得变形。 /api/consultation_workflow 响应里前端已读取的键路径与类型(任务 0 的 golden 快照)改后必须逐一存在且类型一致;上游改动只允许新增键,不得改名、删键、改形状。frontend/tests 里的契约测试与 tests/test_api_server_growth_contract.py 等 Python 契约测试必须绿,不得改断言来迁就(除非断言锁的就是本轮要改的注册表计数或 README 徽章,改动处注明原值原因并在 PROGRESS 单列)。
  5. 合并冲突的裁决规则:商业侧函数体优先;上游改动仅在(i)纯新增函数/子命令且其 import 在本仓可解析,或(ii)修的是计算正确性且本仓同函数无商业改动时才取。任何 import 了本仓不存在模块的上游代码块一律不取,不得为了让它跑而顺手拖入研究脚本。每处冲突的取舍写进 PROGRESS 的冲突表。
  6. 隐私与体积:不得引入 .pdf、私有出生资料、PL9 参考报告原文、review-only 全量 payloadscripts/public_release_privacy_scan.pyscripts/commercial_privacy_artifact_scan.py 必须过。fixture 一律用虚构 smoke 出生数据。
  7. 不得新增模型调用。 任务 5 的专业报告导出是确定性引擎产物,不经过写作 agent,不计费为报告生成。
  8. 推 staging 前 ./node_modules/.bin/tsc --noEmit 必须通过(不要用 npx tsc);scripts/**references/** 都在 deploy/gated-paths.txt 内,每次推送都会跑完整门禁并部署 staging,推之前本地先跑 run_quality_gate.py --profile quick
  9. 不得自行提升 main,不得改 workflow。

让步顺序:数据与隐私不泄漏 > 方向与受保护路径不越界 > 咨询契约与校正不回归 > 真相层同步完整 > 引擎代码合并覆盖面 > 三项新能力 > 代码整洁。

开工前置

git fetch origin --prune
git worktree add -b codex/upstream-sync-20260903 \
  ../.worktrees/upstream-sync-20260903 origin/staging
cd ../.worktrees/upstream-sync-20260903
.venv/bin/python scripts/pre_work_check.py --remote-timeout 8 --command-timeout 45
git -C /workspace/yinduzhanxing status --short --branch   # 必须干净且在 a6f47abd
git -C /workspace/yinduzhanxing rev-parse HEAD

docs/research/yinduzhanxing_one_way_import_2026_08_06.mddocs/research/pr0_upstream_governance_baseline_2026_08_14.mddocs/research/pre_work_error_ledger.mdfrontend/AGENTS.md;在 docs/BUG_HISTORY.md 检索 "上游 / import / merge / 契约 / varga 形状"。

先读这几个文件再动手

  • scripts/import_yinduzhanxing.py —— git 模式要求、manifest 生成、--test-run 记录
  • references/cross_project_contract/sync_policy.v2.jsonreferences/cross_project_contract/imports/commit-5db72537….json —— 上次 manifest 的字段
  • scripts/unified_consultation_orchestrator.py —— _ROUTE_DEFINITIONS_DOMAIN_PROFILE_SECTIONS、health 路由
  • scripts/jyotish_api_server.py _compute_consultation_workflow(约 4319 行起)、_compute_full_reading_for_thematicskip_full_reading_for_thematic
  • scripts/jyotish_engine.py _build_ai_prompt_packcmd_full_readingcompute_chart_datamain
  • frontend/src/lib/personal-report-generation.tsreport-theme-evidence-plan.tspersonal-report-route-core.tsconsultation-methodology.ts
  • 上游:docs/architecture/professional_report_reference_contract_v1.mddocs/research/vedastro_rest_bridge_default_decision_2026_09_01.mddocs/research/ashtottari_primary_text_verification_2026_09_01.mdreferences/strict-workflow-router.md §7

TASK-repo-hygiene-20260903.md 的并行规则(2026-09-03 补):整备任务书正在另一执行方手上,两份任务书有共同文件——scripts/jyotish_api_server.py(整备改岁差字面量 :2853 :4017 :7030 :7086;本任务书任务 2 对全文件三方合并)、scripts/run_quality_gate.py(整备任务 1 改发布门;本任务书任务 2 合并上游改动)、references/technique_registry.jsontests/test_capability_evidence_pool.py(整备任务 2 加 experimental_variant 白名单断言;本任务书任务 1 换成 116 项注册表,必须满足该断言)、根 SKILL.md / pyproject.toml / README.md(整备任务 3 改仓库地址;本任务书任务 1 加三段与徽章计数)、frontend/src/lib/personal-report-generation.tsbirth-time-journey-*.ts(整备 0.c 贯通岁差;本任务书任务 3 / 6 / 7 改同文件)。因此:

  • 现在就可以并行开工的:任务 0(导入器、golden、冲突表,只写 references/cross_project_contract/imports/references/upstream/tests/golden/、新测试文件)和任务 4(VedAstro,文件集与整备无交集)。两者在 codex/upstream-sync-20260903 上做,基线取当时的 origin/staging
  • 必须等整备任务 0–3 合入 staging 后再开的:任务 1、2,以及其后的 3 / 5 / 6 / 7。开工前 git rebase origin/staging,任务 2 的三方合并以 rebase 后的文件为 ours,不得在旧基线上合完再解冲突。任务 0 的 golden 只记键路径与类型,整备改的是岁差取值与标签,golden 不需要重采;但任务 2 完成后按任务 0 的要求重采一次。
  • 整备任务书里"校正引擎按 Raman 校准的阈值与 golden 本轮不动"的约束继续有效,本任务书 7b 在它之后。

串行顺序:任务 0 → 1 → 2 在分支 codex/upstream-sync-20260903 上完成并验收后合入 staging;任务 3 / 4 / 5 / 6 / 7 在其上另开 codex/upstream-capabilities-20260903,任务 6 先于任务 3 与 7c 做(两者都沿用任务 6 打通的透传路径),7b 排在 TASK-repo-hygiene-20260903.md 之后,其余可并行但推送串行。任务 4 不依赖任务 2,如需提前可单独分支。


任务 0(P0,门控)· 快照推进与咨询契约 golden

做法

  1. 在干净 worktree 里跑导入器 git 模式:

    .venv/bin/python scripts/import_yinduzhanxing.py \
      --source /workspace/yinduzhanxing --source-mode git \
      --policy references/cross_project_contract/sync_policy.v2.json \
      --dry-run --output artifacts/yinduzhanxing-import-plan.json
    

    审阅 semantic_merge 行后再 --applymanifest 只允许进入 references/cross_project_contract/imports/,同步更新 references/upstream/yinduzhanxing/source-manifest.jsonimport-plan.json

  2. 咨询契约 golden:用虚构 smoke 出生数据,起本地 Python API,按前端实际请求(career / marriage / wealth / timing / health 各一次,skip_full_reading_for_thematic 两种取值各跑一次)调用 /api/consultation_workflow/api/chart/api/varga_full/api/daily_guidance/api/synastry,把响应键路径 + 类型(不记值)写成 fixture 存 tests/golden/(沿用 tests/run_golden_cases.py 的形式),加一条测试 tests/test_consultation_contract_golden.py:合并后重新采集,键路径集合只允许是超集。

  3. 把三方合并干跑的冲突表(本任务书"现状实证 4")复核一遍写进 PROGRESS,作为任务 2 的工作清单。

验收

  • references/cross_project_contract/imports/commit-a6f47abd….json 存在,source_mode=gitsource_commit 为 40 位全哈希,source_tree_sha256 与 manifest 一致;references/upstream/yinduzhanxing/SKILL.md 的 sha256 等于上游 HEAD 的 SKILL.md。
  • golden fixture 无隐私(出生数据为虚构 smoke),测试在改前基线上绿。
  • tests/test_import_yinduzhanxing.py 绿。

任务 1P0)· 真相层同步

做法

  1. references/strict-workflow-router.md:语义合并上游 §5 更名(finance-timing-strict,保留 wealth-timing-strict 别名)、§7 health-timing-strict 全文、Level 2 分盘清单加 D6/D8/D30;章节号顺延。references/quick-reference-guide.md 同步 finance 别名。不要逐字覆盖,本仓两文件有商业改动。
  2. references/technique_registry.json:接收上游 116 项内容(保持本仓的 JSON 格式化方式,不要把 3084 行格式 diff 反向带回去)。references/oracle/commercial_skill_truth_overlay.v1.json 为 25 个新项按决策记录逐条加 technique_id / status / claim_boundaryAshtottari 加一条:status=partialclaim_boundary 注明规则族限制与 "unverified",且 selected_rule_family_parameter_sensitive 不得进确定性结论。
  3. SKILL.md(商业入口)只加三段:Ashtottari 状态与适用族;professional_report_reference 术语规则(对外首选该名,PL9 只作旧代号);VedAstro 官方 MCP 故障与 REST 桥为默认对标通路。其余上游 SKILL.md 改动只通过镜像快照体现。
  4. 技法计数变化会打红 tests/test_readme_badges.py 与 README 徽章:徽章改为注册表实际新值,测试断言同步,改动处注明原值。
  5. skill 发布包:skills/jyotish-vedic-astrology/versions/新增一个版本目录(版本号由 scripts/skill_release_manifest.pypyproject.toml 现有规则决定,例如 6.9.15),不改 6.9.14scripts/skill_release_package.py dry-run 通过。
  6. 检查 scripts/full_technique_invocation_matrix.pyscripts/audit_capabilities.py 对 116 项注册表的输出:新项在网页路径上应显示为未执行/阻塞,不得出现"executed"。

验收

  • .venv/bin/python -m pytest tests/test_readme_badges.py tests/test_skill_hard_constraints.py tests/test_capability_evidence_pool.py tests/test_import_yinduzhanxing.py:除 test_capability_evidence_pool 中基线已红的 experimental_variant 一条外全绿;若上游新项让它多红,必须修注册表数据而不是改测试。
  • run_quality_gate.py --profile quick 绿。
  • PROGRESS 给出 25 项新技法的覆盖层状态表。

任务 2P0)· 引擎代码三方合并

做法

按下列顺序逐文件 git merge-file,每个文件合并后立刻跑该文件对应的本仓测试:

  1. 零冲突文件scripts/jaimini.pyscripts/muhurta.pyscripts/western_timing_engine.pyscripts/solar_return.py。先检查它们新增的 import 是否都在本仓;缺的模块若是纯计算模块(无外部证据文件依赖)可一并带入并注明来源提交,否则删掉该 import 所属功能。上游对应测试(tests/test_muhurta*.pytest_jaimini*.py 等)本仓已有的版本一并更新。
  2. 低冲突计算模块varga.pytajika.pytajika_kernel.pykp_system.pynarayana_dasha.pyashtottari_dasha.pygulika.pyayanamsa_utils.pydomain_calculation_service.pyrun_quality_gate.pyreport_orchestrator.pyreport_pack_contract.py。按硬红线 5 裁决。run_quality_gate.pyRELEASE_CRITICAL_UNTRACKED_PATHS 与门禁范围不得被上游改窄。
  3. 高冲突入口文件unified_consultation_orchestrator.py(取 route_surface_contract 与 finance 别名、health 路由的 focus_techniquesevidence_packet_required_sections;专家判断影子层只在其依赖模块可解析时取)、mcp_server.py(取三个新工具,前提是 pl9-export 已可运行)、jyotish_api_server.py(保留本仓全部商业路由;上游 nadi leaf assistant 路由不取)、jyotish_engine.py_build_ai_prompt_pack / cmd_full_reading / cmd_varga_full / cmd_dasha / 叙事种子生成器 / pl9-export 相关函数按硬红线 5 取;cmd_classical_* / cmd_nadi_* 全部不取;main 中对应子命令注册不取)。
  4. 校正相关文件按硬红线 3 跳过。
  5. 引擎运行时读取的数据文件,按下面规则处理2026-09-03 核实:批 B 计算模块 muhurta / jaimini / narayana_dasha / ashtottari_dasha / varga / western_timing_engine / solar_return 不读任何数据文件;yoga_rules.jsonsaham_rules.jsonassets/** 本仓与上游逐字节一致;算法不依赖上游证据台账):
    • 必须带入(引擎运行时无守护地读取、内容是状态/合同元数据、无隐私):scripts/kp_system.py kp_maturity_profile() 读的四个文件 references/oracle/kp_exact_cusp_closure_dashboard_2026_08_22.jsonkp_exact_cusp_mainline_status_2026_08_22.jsonkp_12_cusp_numeric_oracle_readiness_2026_07_23.jsonkp_real_event_replay_gate_2026_07_30.json。不带入则合并后 KP 分析路径直接抛异常。带入前逐个打开确认无出生资料。
    • 应同步的产品面内容(非研究台账):references/interpretation_template_registry.json(上游 +145 行,报告生产者索引它)、references/ai-reading-workflow-prompt.mdreferences/mandatory-verification-gate-protocol.md,走语义合并。
    • 不带入、靠守护降级_event_replay_contract 读的 references/oracle/1993_birth_time_candidate_segment_table_2026_08_23.json(上游作者本人出生案例,隐私,代码已 try/except)、_build_timing_boundary_attribution / _profile_aware_benchmark_appendix / _load_rectification_evidence_contract 读的状态文件(均已守护,缺失时该段显示 blocked / unavailable,这是保守方向,可接受)。PROGRESS 记录哪些段因此为 blocked。
    • 随研究子命令一起不取references/nadi_low_risk_rule_pack_draft.jsonreferences/real_case_calibration/classical_doctrine_loci_manifest_2026_08_28.jsonreferences/chat_safety_audit_manifest.json
    • 通用规则:合并后 grep 引擎入口文件里所有 references/ / docs/ 路径字面量与 Path(...) / 'references' 拼接,逐一核对本地存在性;不存在且无守护的,要么按上面带入,要么加守护返回 blocked,不得让缺文件变成运行时异常。
  6. 合并完成后重新采集任务 0 的 golden,跑契约测试;用虚构数据实跑一次 python scripts/jyotish_engine.py full-reading/api/consultation_workflowcareer / wealth / health 三题),确认 modules 里没有新增 status=failed 的模块。

验收

  • PROGRESS 冲突表:每个冲突块一行(文件、函数、取 ours / theirs / 手工合成、理由)。
  • 任务 0 的 golden 测试绿(键路径超集);frontend tsc 0 错、npm test fail 数不高于基线;run_quality_gate.py 完整 profile 绿;tests/test_api_server_growth_contract.pytests/test_commercial_domain_calculation_contract.py 绿。
  • 本地全量 pytest 红测清单与 TASK-repo-hygiene-20260903.md 记录的基线逐条比对,新增红项为 0,或每一项都有归因。
  • staging 部署后 GET /api/healthdeployment.gitCommit 等于合并提交;/api/consultation_workflow 用 smoke 数据实测三题正常。

任务 3(P1)· health 路由对齐上游三窗合同并进入个人报告

做法

  1. 编排器_ROUTE_DEFINITIONS["health"]focus_techniques 对齐上游(D6/D8/D30/Dasha/Narayana Dasha/Shadbala/Transit/Functional Benefic-Malefic);_DOMAIN_PROFILE_SECTIONS["health"] 改为上游三窗结构:pressure_windowsevent_risk_windowsrecovery_support_windowsnon_medical_boundaryverification_questions(旧四段的内容映射进新段,不丢);新增 evidence_packet_required_sections(route)(本仓没有,取上游实现),health 路由追加 D6 / D8 / D30 / narayana_dasha / functional_benefic_malefic / transit / non_medical_boundary。
  2. 引擎_build_ai_prompt_pack 为 health 主题产出叙事种子(对齐 _build_career_narrative_payload 的结构:headline / strengths / risks / boundaries),来源限于 D6/D8/D30 宫位与主星、6/8/12 宫主 Dasha 激活、Shadbala 相关行星。boundaries 固定包含非医疗声明。
  3. 前端咨询链consultation-methodology.ts health 条目保留 health-timing-strictwealth 条目加 finance-timing-strict 为主名、wealth-timing-strict 为别名,与编排器 route_surface_contract 对齐;Technique Audit Table 折叠展示对 health 新段生效。
  4. 个人报告personal-report-route-core.ts 主题枚举加 healthreport-theme-evidence-plan.ts 为 health 定最低证据组(D1 + D6 + D8 + D30 + VimshottariTransit 为可选加分项,参照 TASK-report-blocked-repairs-20260902.md 的 fail-closed 口径);personal-report-generation.tsinterpretiveFacts / themeNarrativeSeeds allowlist 加 health 种子;writer 的 per-theme 静态知识包(TASK-report-skill-parity-20260901.md 任务 3 的机制)新增 health 包,≤3000 字符,禁路径与内部名词,且开头写明非医疗边界;报告中心的主题选择器加 health;计费口径与其他主题一致(不新增计费项)。
  5. docs/BUG_HISTORY.md 不需要新条目,除非实施中发现既有 health 路由缺陷。

验收

  • smoke 数据实跑 /api/consultation_workflow health 题:响应 strict_workflow_contracts 显示 health 路由,三窗段齐全,D6/D8/D30 在 available_layers 里为 executedTransit 无则为 blocked 而非缺席。
  • 个人报告含 health 主题时:确定性管线(假 writer)到 PIPELINE-READYhealth claim card 的 conclusion 为真实内容且含非医疗声明;assertionLevel 防升级规则未改。
  • 前端 tsc 0 错;frontend/tests/consultation-methodology.test.tsconsultation-agentic-runtime.test.ts、报告相关测试绿。

任务 4P1)· VedAstro 外部对标切到 REST 桥

做法

  1. 引入 scripts/vedastro_rest_bridge.py(上游 a6f47abd 版本),去掉其内置的 yn-1993 默认出生参数(本仓不得携带真实出生资料,默认改为虚构 smoke 数据或必填)。
  2. scripts/vedastro_gateway.py:官方通路的健康判定改为对 /api/Calculate 的实际 Status: Passofficial_verified / official_blocked / local_fallback 三态语义不变;免费层 5 次/分钟写进 gateway 的限流参数与 /api/vedastro_gateway/status 输出。
  3. scripts/vedastro_parity_matrix.py 与其他调用 vedastro_official_mcp_bridge.py 的路径改为走 REST 桥;MCP 桥保留文件与测试,标注"仅协议探测",不再是默认通路。match 合盘子命令上游尚未实现,本仓合盘对标继续标 official_blocked,不得伪造。
  4. 更新 docs/engine/README.md(或本仓 VedAstro 文档所在处)与 scripts/diagnose_vedastro_mode.py 的说明。

验收

  • 无网络时 tests/test_vedastro_*.py 全绿(REST 桥测试用录制响应,不打真网)。
  • 有网络时手工跑一次 REST 桥 horoscope 子命令(虚构数据),PROGRESS 记录 Status 与耗时;命中限流时 gateway 降级 official_blocked 而不是报错。
  • /api/vedastro_gateway/status 显示当前通路为 REST 与限流配置。

任务 5(P1)· 专业报告导出接进个人报告产品

做法

  1. 引擎:确保任务 2 已带入 build_pl9_style_export_packetrender_pl9_markdowncmd_pl9_export 及其依赖;上游 --format authority--archive-dir 不需要,可不接;markdown 输出保留上游的引擎边界声明段。所有对外文案与新代码标识用 professional_report_reference,旧 pl9_* 标识只在兼容处保留。
  2. APIscripts/jyotish_api_server.py 新增 POST /api/professional_report_reference(入参与 /api/consultation_workflow 相同的出生参数 + format ∈ {json, markdown} + packs),走 api_heavy_compute_gate,复用 _compute_full_reading_for_thematic 的缓存/复用逻辑,不重复算全盘;响应不含 raw full-reading(上游 --include-raw 语义在这里关闭)。
  3. 前端:报告中心(personal-report-center.tsx)在已 ready 的报告上增加"专业参考版(导出)"入口,调用上述 API 生成 markdown 并按既有导出方式交付(下载或页内查看,沿用报告中心现有导出交互,不新做组件);导出不经写作 agent、不计费为报告生成、不写 personal_report_sections。入口对未 ready 报告不显示。
  4. 不做:把导出内容喂给写作 agent、把导出存进数据库、PDF 格式(上游 pdf 依赖另行评估)。

验收

  • smoke 数据 python scripts/jyotish_engine.py pl9-export --format markdown/api/professional_report_reference 都能产出;markdown 含引擎边界声明;输出中不出现文件路径、内部模块名。
  • 隐私扫描通过;仓库内没有任何 PL9 参考报告原文。
  • 前端入口只对 ready 报告出现,tsc 0 错,报告中心测试绿;导出一次不产生任何模型调用(telemetry 计数为 0)。

任务 6(P1)· 把合并进来的引擎新字段接到聊天与报告

任务 2 只是把上游代码合进引擎;/api/consultation_workflowai_prompt_packscripts/jyotish_api_server.py 自己的精简版 _build_chart_prompt_pack,前端的报告提取层又是 allowlist 制,不做这一步,聊天和报告什么都不会变

做法

  1. 响应侧(只新增键):在 _compute_consultation_workflow / _build_chart_prompt_pack 里新增并透传:timing_narrative(上游 _build_timing_narrative_payload(modules),结构对齐既有 career / relationship / finance 种子)、modules.planetary_friendship(上游 _build_planetary_friendship_snapshot)、module_execution_audit(上游 _build_module_execution_audit)、pratyantar_dasha_timeline(上游在 cmd_dasha 里挂的,需要在 workflow 的 dasha 子周期里同样挂上)。上游 response_envelope 键是纯附加,透传或忽略都可以,不得据此改既有键。任务 0 的 golden 重新采集后必须是超集。
  2. 聊天侧:折叠技法审计表新增 planetary_friendshipmodule_execution_audit 派生的行(executed / blocked / not_applicable 三态照旧);Ashtottari 行按任务 1 覆盖层的 partial 显示为"参数敏感、未验证",不得显示 executed 为确定性;finance / wealth 别名在审计表与路由展示一致。_build_chart_prompt_pack 里给聊天模型的证据快照加 timing_narrative,长度上限与既有种子一致。
  3. 报告侧personal-report-generation.tsinterpretiveFacts allowlist 加 planetary_friendship(只取友敌等级表,不取自由文本)与 pratyantar_dasha_timeline(只取当前与下一段的边界日期),themeNarrativeSeedstiming_narrativetiming 主题);沿用 filterReportEvidenceBundleForSection 按主题裁剪;净化、长度上限、hash 覆盖与 TASK-report-skill-parity-20260901.md 的规则一致。timing 主题 claim card 的 conclusion 可以引用 pratyantar 边界。
  4. 成本:报告每章 inputTokens 改前改后对照写进 PROGRESS,p50 超过改前 1.3 倍必须停下摆数据(这轮只是增补字段,不应接近报告对齐那轮的 2 倍线)。

验收

  • golden 超集测试绿;前端 tsc 0 错;聊天与报告相关测试绿。
  • smoke 数据实跑一次聊天(timing 题)与一份 personal_full 报告:审计表出现新行且三态正确;timing 章节的 claim card 含 pratyantar 边界日期;bundle hash 稳定(同输入两次一致)。
  • 每章 inputTokens 对照表在 PROGRESS 里。

任务 7(P1)· 校正:自适应选题、岁差按请求传递、报告出生时间敏感度节

7a · 自适应选题器(P1

  • 引入上游 scripts/active_rectification_selector.pyselect_next_questions:按可区分答案跨度、事实可靠度、作答成本、域多样性、剩余候选数、分钟相关度打分选题)与其测试 tests/test_active_rectification_selector.py。分钟相关度是核心价值:只优先问"其敏感层在剩余候选分钟窗口内真的会变"的题,直接针对本仓已知的"题库分不开相邻 top-2"问题。
  • scripts/active_rectification_questions.py:按上游给题库加 factual_reliabilitypositive_cluster / negative_cluster_candidate_scanscan_candidate_timesminute_scanbuild_questionnaire / score_answers 返回 selection / next_round_selection新增键next_round_questions 等旧键保留)。不引入 _known_case_regression_hintregression_hintminute_rankingsminute_focus
  • 本仓 scan_candidate_times 只返回各分盘上升星座;选题器的 _minute_feature_value 需要更细特征。按上游改法给扫描行新增 d1_longitude 与完整上升对象(旧字段不动),并把分盘列表里的 D1 去掉。
  • 前端 birth-time-journey-engine-model.ts / birth-time-journey-turn.ts:自适应轮的 nextQuestion 改为优先取服务端 next_round_selection.selected_questions[0],服务端没给时回退现有逻辑。基线轮不变。
  • 验收:tests/test_active_rectification_questions.py(按上游 +64 行的断言更新,但删掉与 regression_hint 相关的用例)与选题器测试绿;npx tsx --test tests/rectification-*.test.ts fail=0 且用例数不少于基线 62 个文件;用本仓虚构 smoke 案例跑一次完整问答,PROGRESS 附"每轮所选题 + 其分钟相关度"表,证明选题确实随候选窗口变化;V5 打分输出对同一答案集逐字节不变(选题只改顺序,不改分数)。

7b · 岁差与交点模式按请求传递(P1,与 TASK-repo-hygiene-20260903.md 串行)

  • scripts/active_rectification_event_engine.pyAYANAMSA / NODE_MODE 全局常量三处)、active_rectification_questions.pycandidate_time_sensitivity_scan.py(本仓签名无 ayanamsa):改为 request.get("ayanamsa", DEFAULT_AYANAMSA_NAME) / request.get("node_mode", ...),默认值不变(Raman)。/api/rectification/*/api/active_rectification_* 的请求体接受这两个键并写进回执。
  • 顺序:仓库整备任务书的任务 0 已规定"校正引擎按 Raman 校准的阈值与 golden 本轮不动,只确认 lahiri 下不崩"。本项在其之后做:整备任务书交付 resolveAyanamsa(profile) 后,校正前端把它传给 Python。若整备任务书尚未合入,本项只做 Python 侧并保持默认值,前端传参留到整备任务书合入后补一个小提交。
  • 验收:默认请求(不带 ayanamsa)的 V5 输出逐字节不变;带 ayanamsa=lahiri 的请求回执里 ayanamsalahiri 且计算确实按 Lahiri(用 smoke 案例对比上升度数);tests/test_active_rectification_api.py 及本仓 38 个 Python 校正测试绿。

7c · 不确定出生时间的报告敏感度节(P2,依赖任务 2 与任务 6)

  • 引入上游四个 flexible_birth_time_* 模块与测试;_build_birth_time_sensitivity 里读 1993 分段表的 _load_1993_candidate_segment_tablecandidate_segment_table 一并删掉,candidate_micro_compare 段不要。窗口来源改为:报告请求带的出生时间精度真值(BIRTH_TIME_ACCURACYTASK-consultation-birth-accuracy-20260901.md 已贯通)为 confirmed不生成本节;为 provisional / approximate 时窗口取校正案例已采用的可信区间(案例不存在时用精度等级对应的固定宽度,宽度表写进代码常量并在 PROGRESS 说明),上限 15 个候选分钟,超出则只取区间两端与代表分钟。
  • 产物:consultation_workflow 响应新增 birth_time_sensitivityschema 沿用上游 jyotish.report_birth_time_sensitivity.v1status ∈ {not_applicable, candidate_window_only}),个人报告 bundle 新增对应的解读性事实(哪些主题结论在窗口内稳定、哪些敏感),报告附录多一节"出生时间敏感度",正文各章在该主题被标为敏感时加一句边界提示。writer 输入隔离与 schema 规则沿用。
  • 验收:confirmed 案例的报告与改前逐字节一致(bundle hash 不变);provisional 案例的报告附录出现敏感度节,且每个"敏感"判断能追溯到窗口内至少一个分钟的层变化;引擎侧 python scripts/jyotish_engine.py full-reading 带窗口参数不依赖任何 references 数据文件;前端 tsc 0 错,报告测试绿。

任务 7 通用红线

  • 仓库内不得出现任何真实出生案例;任务 7 全部 fixture 用虚构 smoke 数据。合并前 grep -rn "1993-04-17\|14:49" scripts tests frontend/src 必须为空(或只命中与该日期无关的既有测试数据,逐条说明)。
  • ALGORITHM_VERSION / POLICY 常量不变;若任何 golden 变化,说明是新增键还是数值变化,数值变化即视为越界。
  • 合入后重跑 docs/testing/ 里校正的浏览器走查清单,结果写 PROGRESS;走不了的写环境缺口。

BUG 编号起点

开工时核对 docs/BUG_HISTORY.md 最大号;截至本任务书为 BUG-510,新条目从 BUG-511 起。

回报格式

docs/tasks/PROGRESS-upstream-sync-20260903.md(任务 02)与 docs/tasks/PROGRESS-upstream-capabilities-20260903.md(任务 3–7):每个任务写做了什么、测试数字、冲突表、偏离与原因、环境缺口;并在 docs/tasks/README.md 状态板改状态。