Files
Jyotisha/docs/tasks/PROGRESS-consult-evidence-card-v2-20260927.md
T
Jesse_ChenandClaude Opus 5.5 5671039af0
Independent Staging Quality Gate / validate (push) Successful in 12m30s
Independent Staging Quality Gate / publish (push) Successful in 3m42s
docs(tasks): evidence-card v2 acceptance
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017eEAG8HD3mm8gsKXgk8uU8
2026-09-27 17:09:56 +08:00

22 KiB
Raw Blame History

PROGRESS · 数据卡 v2(采纳占星顾问意见)· 2026-09-27

  • 执行方式:直接执行(产品负责人授权子代理执行;Claude 事后独立验收)
  • 基线:origin/staging 5b061e43(本单任务书提交);已核对含数据卡 v1 cd4dde9d 与校正 grounding 261d7b2e。
  • 分支:codex/consult-evidence-card-v2-20260927,工作树 .worktrees/consult-evidence-card-v2-20260927(本地提交,未推送)
  • 串行:TASK-consult-gender-optional-20260927(性别选填)排在本单之后,基线须含本单。
  • BUG 编号:开工核对 docs/BUG_HISTORY.md 最大号 BUG-1059;本单新记 BUG-1060(investigating,未修)。
  • Skill:不 bump(Skill 文本未改;精简清单是前端常量,见 T4)。
  • 预检(AGENTS §9):pre_work_check.py 已跑,退出 0(远端 verified、适配器 / 碎片扫描 / focused 测试全部 ok);读过 pre_work_error_ledger.md ERR-110 / 111 / 112。冻结计分文件(sealed_holdout_rerun.py PRODUCTION_FILES 10 个 + holdout v3 frozen_scoring.files 12 个)一个都没动;跨进程比较一律 PYTHONHASHSEED=0;每次提交只 git add 具体路径并看 --cached --stat。

提交

阶段 提交 内容
T1 d5616c34 引擎:新模块 scripts/consultation_native_layers.py 接入已有原生技法;薄注册;Python 定向测试;golden 加年运 / 时运问法
T2 33739e37 投影:原生层按层白名单进入模型投影;golden 逐值断言
T3 db170744 数据卡 v2(evidence-card-v2);补取枚举扩展;系统提示与工具说明同步
T4 7ad40043 事业 / 婚恋 / 财富精简清单(方案 B),只在普通对话下发
T5 本提交 CHANGELOG、本记录、真机清单、任务索引、BUG-1060

结论

项 结果
T1 引擎接入 完成。见「接入的原生模块」。只新增输出:3 张公开 AA 盘 × 4 条路由(婚恋 / 事业 / 年运 / 时运)A/B,除新键外逐项相同(环境字段:图缓存时间戳、VedAstro 网关状态除外);Python 测试里也有同进程开关对照。本机一轮多约 40 ms(原生层 37–49 ms;工作流缓存命中时整轮约 0.6 s)
T1 年盘让步 未触发。3 张盘年盘包全部可用(Solar Return、年盘上升、Muntha、年主、Mudda 分段均 partial_verified),状态标 parameter_sensitive。不可靠时的「年盘未接入」路径有测试(冲突 / 阻塞时不输出任何年盘字段,不拿本命数据顶替)
T1 关键换座日期让步 未触发。木星、土星换座与逆行 / 顺行转向来自 ephemeris_events;罗睺计都换座用同样的每日正午采样读引擎的交点位置(原扫描器不含交点)
T2 投影 完成。7 个原生层各自一张嵌套键白名单(参照 BUG-1054),不放宽既有 natal / timing 键集,不改深度与条数上限;golden 断言投影值与引擎层逐值相等(双重过运只少一条带表情符的每宫摘要句)。另放行 pada A1(引擎的 AL)
T3 数据卡 v2 完成。见「最终对照表」。「本轮技法」面板:v1 的逐行一致测试原样通过
T4 精简清单 完成。见「清单下发设计」
体量 单领域 3 盘 ×(10 问法 + 年运 + 时运)全部 ≤ 12,000(最大 11,659,年运);见「体量」

接入的原生模块(T1)

全部写在一个新的图表顶层键 chart.consultation_native_layers(schema jyotish.consultation_native_layers.v1)。不放进 chart.modules:主题报告会数它拿到的模块个数(full_reading_module_count),放进去这个既有值会从 23 变 24。

层 原生来源 输出字段 路由
d9_summary jyotish_engine._get_dignity_level(D9 旺弱,上下文规则同全读 D9 步骤 _build_dignity_context)、_calc_vargottama;D1 旺弱取图表自带 status 标签 lagna、lagna_vargottama、planets.<行星>.{d9_sign, d9_dignity, vargottama}、vargottama、reversals[{planet, d1, d9}]、reversal_rule 全部
punarphoo punarphoo.detect_punarphoo(行运土星取参考日本地正午) status: observation_only、natal_present、orb_deg、orb_limit_deg、same_house、saturn_return_to_natal_moon.{active, orb_deg, orb_limit_deg}、claim_boundary 全部
vivah_saham jyotish_engine._calc_vivah_saham(全读 Step 16 的本命婚姻点) longitude、sign、degree_in_sign、house、natal_conjuncts、boundary 全部
day_night chart.modules.gulika.daynight_evidence(swisseph 日出日落) is_day 全部
slow_transits 位置:jyotish_engine._calc_sidereal_planets_for_jd(参考日本地正午,按请求岁差 / 交点口径);木土换座与转向:ephemeris_events.build_ephemeris_events;交点换座:同采样法读引擎交点;SAV / BAV:modules.ashtakavarga current.{Jupiter,Saturn,Rahu,Ketu}.{sign, degree_in_sign, retrograde, natal_house}(木土另有 sav、bav)、`key_dates[{kind, date, body, from_sign, to_sign, to_natal_house motion}](参考日起 365 天)、houses_in_window、window`
double_transit jyotish_engine.cmd_double_transit_pac(1–12 宫各跑一次);DK / UL 不是该函数的目标,用同一 PAC 规则 _check_pac 检查并注明 active_houses、conclusions[{house, layer, target, strength, jupiter_pac, saturn_pac}](不含度数)、karaka_targets.{DK,UL}、house_7_summary、boundary 全部
karakamsha jaimini.calc_karakamsha(AK 在 D9) atmakaraka、karakamsha_sign / degree / lord、karakamsha_natal_house 全部(只补取)
argala argala.calc_argala 原生输出(houses / planets / summary) 全部(只补取)
dispositor_chains jyotish_engine.calc_all_dispositor_chains(宫主链) chains 全部(只补取)
inter_chart_linkage jyotish_engine.calc_all_inter_chart_linkages(D1→D9→D10) planets.<行星>.{D1,D9,D10}.{sign, house, lord} 全部(只补取)
moon_transit _calc_sidereal_planets_for_jd sign、degree_in_sign、natal_house、house_from_natal_moon 全部(只补取)
annual_tajika annual_tajika_pack.build_annual_tajika_pack(solar_return_full_report + cmd_tajika) status: parameter_sensitive、target_year、age、varsha_year.{start,end}、annual_lagna、varshesha、muntha.{sign, lord, house_in_annual_chart, house_in_natal_chart}、mudda_dasha[{lord, months, start, end}]、tajika_aspects[{name, planets, aspect, motion}](太阳 / 月亮 / 年主参与的 Ithasala / Easarapha 候选)、producers、boundary 只 annual;其余 not_applicable

说明:

  • 年份取「参考日所在的太阳年」:当年太阳回归若晚于参考日,改用上一年。Mudda Dasha 的原生输出只有各段月数(Vimshottari 比例分 12 个月);本模块把「本次到下次太阳回归」按月数比例切成起止日期,这是唯一新增的换算,写在模块文档和 _mudda_segments 测试里。
  • 宫位:凡是「某星座落本命第几宫」都用整宫制从上升算(与引擎 house 字段同法)。
  • 每个层独立 try/except:一个原生函数抛错只让自己那层 blocked,工作流照常成功(有测试)。
  • 注册:_attach_local_consultation_layers 里合并字段之后加一行调用(jyotish_api_server.py +4 行:一行 import、一个三行调用;类方法数、伪造点均不变,注释里没有伪造点字面量)。

最终对照表(数据卡 v2)

每张卡都有基础段:上升、十二宫星座、行星落宫(星座 / 宫 / 度数 / 星宿 / 逆行 / 庙旺)、功能吉凶与宫主归属、Vimshottari 当前 MD / AD / PD 起止与下一段、大运内全部子运、Narayana 当前 md / ad / pd,v2 新增 D9 摘要(D9 上升、各行星 D9 星座与旺弱、Vargottama、D1↔D9 重大反转;不含 D9 宫位与相位)。

领域 分盘 宫 其他(v1 保留) v2 新增 v2 移除 / 改补取
事业 D10 10 A10、AmK、格局、行运、Shadbala AL(引擎 pada A1)、10 宫 SAV、木星 / 土星当前星座、所落本命宫与 SAV 补取:Karakamsha、宫主链、D1→D9→D10 联动、Argala、KP(带 blocked 说明)、Chara 大运
婚恋 D9 7、5 UL、A7、DK、金星、木星、行运 5 宫 / 5 宫主、昼夜盘 is_day、Punarphoo(observation_only)、双重过运(7 宫这次运行的结论 = 7 宫 / 7 宫主 / 命主 / D9 / 月亮盘;DK、UL 两行)、Vivah Saham(度数与落宫)、「性别未知」 补取:KP 7 宫副主星(带 blocked 说明)、Chara 大运
财富 D2、D11 2、11、9、5、8、12 格局、Ashtakavarga、Shadbala 8 / 12 宫点名 补取:D10(收入来自工作时)、Argala、KP
年运 D1 1 + 当前 AD 主与下一 AD 主所主管的宫 + 全年木土过境所落本命宫(附 house_basis) — 年盘(年盘上升、年主、Muntha 与主星及落宫、Mudda 全年分段起止、太阳 / 月亮 / 年主的 Tajika 相位,parameter_sensitive);不可用时写「年盘未接入」;关键日期(木土换座、逆行 / 顺行、罗睺计都换座,不逐月) 移除:Chara 大运、泛行运层(改为关键日期)
时运 D1 + 随同轮另一领域(单独时 D9;另一领域的段已有该分盘时不重复,记 vargas_follow) — 土星、木星、行运 罗睺 / 计都(星座、度数、本命宫、换座日期)、木土当前星座 SAV 与 BAV、双重过运结论列表(宫、层、目标、强度,不给度数) 移除:Chara 大运;月亮行运改补取
健康 / 学习 / 迁居 / 家庭 / 父母 / 子女 / 综合 同 v1 同 v1 同 v1 只多了基础段 D9 摘要 —
  • KP 不在任何卡上;补取时返回 {kp_cusps, note: "KP 精确宫头仍 blocked:只作参考,不得作为结论依据"}。
  • 补取枚举新增:karakamsha、dispositor_chains、inter_chart_linkage、argala、moon_transit(D10 用既有 varga:D10,Chara 用既有 chara_dasha)。活动行中文名:灵魂星在九分盘的落点(Karakamsha)、宫主链、本命、九分盘、十分盘的联动、门闩(Argala)、月亮行运。
  • 卡自己写的字只有两个标签(EVIDENCE_CARD_LABELS):「性别未知」「年盘未接入」;其余值全部抄自投影 / 引擎(「每个卡值都是引擎已有值」测试只对这两个标签放行)。
  • 基础段已有 D9 摘要,所以 varga:D9 不再列为可补取。

体量(模型可见字符,JSON.stringify 长度)

改前 = v1 代码(基线 5b061e43)、改后 = 本分支,同一批引擎输出:本分支引擎对 3 张公开 AA 盘 × 12 问法(10 问法 + 年运 + 时运)现跑的 36 份结果(scripts/research/measure_consult_evidence_card.ts)。

问法 改前均值 改前最大 改后均值 其中卡 契约 清单 不含清单 改后最大
事业 13,416 13,494 9,822 6,416 777 2,616 7,191 9,880
婚恋 15,476 15,550 10,450 6,969 775 2,693 7,742 10,633
财富 13,103 13,125 9,912 6,564 777 2,557 7,340 9,950
健康 10,048 10,135 10,925 6,327 813 3,772 7,138 10,988
学习 7,473 7,479 8,351 5,528 785 2,024 6,312 8,383
迁居 7,459 7,473 8,336 5,473 825 2,024 6,297 8,361
家庭 7,519 7,535 8,396 5,544 818 2,021 6,360 8,409
综合 9,213 9,276 10,101 7,285 780 2,022 8,064 10,140
父母 7,298 7,312 8,175 5,329 810 2,022 6,138 8,196
子女 7,313 7,329 8,191 5,342 812 2,023 6,153 8,218
年运 8,125 8,191 11,533 8,728 771 2,021 9,497 11,659
时运 9,175 9,250 11,318 7,626 774 2,904 8,399 11,440
  • 36 次全部 ≤ 12,000(v1 时事业 / 婚恋 / 财富 9 次超出)。每张卡多约 870 字(基础段 D9 摘要)。
  • 年运构成(均值):年盘约 1,730、关键日期与木土罗计当前约 1,400、宫位 8 行约 550 + 依据 200、基础段约 4,800;时运:双重过运结论约 1,000–1,300、罗计与木土 SAV / BAV 约 750。
  • 两领域一轮(同一盘,参考):事业 + 时运 14.6–14.8K;婚恋 + 时运 14.8–15.3K;年运 + 事业 14.9–15.1K;财富 + 时运 14.5–14.9K;事业 + 财富 13.1K(v1 23.9K);婚恋 + 事业 13.4–13.8K(v1 26.1K)。单领域目标不覆盖两领域,如实记数。

清单下发设计(T4)

  • 谁消费 methodology:consultationMethodologyForDomains 在 frontend/src 里只被 mastra/consultation-tools.ts(普通对话计算工具的结果)调用;strict-workflow-router.md 在 frontend/src 与 scripts/*.py 里只被 lib/consultation-methodology.ts 读取(系统块的 sharedConsultationMethodMarkdown 取 router 的 Full-Spectrum 段 + 事件裁决骨架,不变)。报告(personal-report.ts、Python 报告编排)不读这两者。
  • 做法:新增前端常量 frontend/src/lib/consultation-condensed-checklist.ts,事业 5 行、婚恋 7 行、财富 5 行(必看项 + 分三层 + 禁写 + 卡外补取,婚恋另含「性别未知:金星与木星都要看,不按性别指定夫星 / 妻星」)。consultationMethodologyForDomains 对这三类用精简清单替换「严格路线段 + 事件裁决文件」两段,标题仍带路线名(如「事业 · career-timing-strict · 普通对话精简清单」),来源写明据 router §2–§5 与 event_judgment_*.md 精简。共用基线段照旧;时运 / 健康仍送 router 原文段;无命名清单的领域照旧如实上报。
  • 禁写规则逐字含:「5 宫主大运 ≠ 法律婚」「金星过本命月亮 ≠ 心动月」「Punarphoo 不得写成结婚」「土星回到本命月亮是观察项,不是结婚」;分三层:事业「接触 / 结构性机会 / 公开落地」、婚恋「心动接触 / 关系成对 / 社会法律落地」、财富「挣钱机会 / 收入或资产真实增长 / 到账变现」。
  • Skill 文本未改、router 与三份事件裁决文件未改(本分支 git diff origin/staging -- skills/ 为空),所以不 bump。系统提示里对 methodology 的描述同步为「事业 / 婚恋 / 财富是精简清单,其余路线引用 live Skill」。
  • 证明其他路径不变:consult-condensed-checklist-20260927.test.ts「only the consultation tool builds the methodology」(源码扫描:只有 methodology 模块与咨询工具引用)、「other routes still quote the live skill」(时运 / 健康来源仍是 router,系统块仍含 Full-Spectrum 与骨架)。

红线测试清单

红线 / 验收 测试
1 只新增输出、不改既有结果 tests/test_consultation_native_layers.py「the new layer leaves every existing output unchanged」(同进程开关对照);另做 3 盘 × 4 路由跨工作树 A/B(PYTHONHASHSEED=0)只差新键;golden 的 family 工作流除新键外与旧 golden 逐字节相同
1 growth contract 门禁集内 tests/test_api_server_growth_contract.py 通过(类方法数、伪造点不变;行数 +4)
2 原生值、卡只复制 Python:每层与原生函数直接调用逐值比对(D9 旺弱 / Vargottama / Punarphoo / Vivah / 双重过运 7 宫 / 换座日期 / SAV-BAV / 年盘字段 / Mudda 月数);前端:consult-projection-native-20260927(投影 = 引擎层)、consult-evidence-card-v2-20260927(逐卡逐项 = 引擎层)、v1「every card value is a value the projection or the engine already holds」
2 golden 来源 scripts/research/capture_consult_evidence_card_golden.py 重新生成(3 张公开 AA 盘;family / annual / timing)
3 v1 红线 v1 的卡、补取、遥测、BUG-1053 单次作答测试全部仍通过(改动的断言见三栏)
让步 2 年盘不可靠 Python「an unreliable annual pack is blocked and never filled with natal data」;前端「a missing or blocked annual pack says 年盘未接入」
KP 不上卡 前端「no card carries Chara Dasha or KP; both are lookups」;补取返回 blocked 说明
T4 精简清单 前端「the writer's prompt carries the condensed list…」(真实 Agent + 记录提示词的假模型,事业 / 婚恋 / 财富逐一断言含清单与禁写、不含长清单原文)
体量 前端 T3「contract + card under 12,000 without the checklist」、T4「every single-domain turn stays within 12,000」(golden 3 盘 × 12)

改动的既有断言(原值 / 新值 / 原因)

文件 原值 新值 原因
frontend/tests/consult-evidence-card-20260927.test.ts「every card value is a value…」 卡上每个叶子值都必须是引擎 / 投影已有值 同上,另对 EVIDENCE_CARD_LABELS 两个标签放行 决策表要求卡写「性别未知」「年盘未接入」
frontend/tests/consult-evidence-lookup-20260927.test.ts(2 处) 提示词含 evidence-card-v1 含 evidence-card-v2 卡版本升级
frontend/tests/consult-evidence-card-telemetry-20260927.test.ts(4 处) cardVersion: "evidence-card-v1"、agentVersion: "consultation-evidence-card-v1" v2 同上(记录字段集合不变)
frontend/tests/consultation-methodology.test.ts 事业用例 来源为 strict-workflow-router.md、正文含 Opportunity contact、领域段 2 个(路线 + 事件裁决) 来源为精简清单、正文含「接触」与 D10、领域段 1 个 T4 方案 B
同上 财富用例 正文含 wealth-timing-strict 别名 来源为精简清单、正文含 D2 T4 方案 B(标题仍是 finance-timing-strict,旧名不单列)

测试与构建(Node 22.14;无 Docker)

项 基线 5b061e43 交付 7ad40043 结论
tsc --noEmit — 0 错 通过
npm run lint 0 error / 127 warning 0 error / 127 warning 通过
npm test 全量 4152 条:4100 过 / 24 败 / 28 跳 4174 条:4122 过 / 24 败 / 28 跳 / 0 cancelled 失败名单与基线逐条相同(24 条全是需 Docker / PostgreSQL 的数据库与部署套件);按名单比对 0 条消失,新增 22 条
中间阶段 — T1 4152、T2 4157、T3 4169 每段失败名单同基线、0 消失
Python 门禁集(gate-pytest-args + 调研 + 领域注册表 + 本单新测试) 953 过 / 1 跳(门禁集 + 调研) 975 过 / 1 跳(+ 领域注册表 15 + 本单 7) 通过(含 growth contract)
tests/test_consultation_contract_golden.py(键路径超集) — 通过 新顶层键是超集
npm run build -- --webpack /、/chart、/ephemeris、/people ○ Static 同 通过
首屏 gzip(level 9) rootMainFiles 4 个 130,933 B;index.html 引用 36 个 660,416 B 130,933 B(0.00%);660,409 B(−0.001%) 通过
frontend/frontend/ 残留 — 构建后出现(只含 node_modules),已删 —

发现的问题与观察(未在本单修)

  • BUG-1060(investigating):cmd_double_transit_pac 的 D9 层「D9_N宫」目标用的是 D9 上升星座中点(d9_asc_idx * 30 + 15),不是 D9 第 N 宫;标签写第 N 宫的星座,实际检查的是 D9 上升。本单红线不许改既有计算结果,卡照原生输出复制;需产品决定是否另开单修(会改变报告等既有路径的双重过运结果)。
  • annual_tajika_pack 的 mudda_dasha / patyayini_dasha 字段 producers_checked 里含字段自身(循环引用),整个包也含 datetime,不能直接 json.dumps;本单只复制分段列表,不受影响。报告路径走 normalize_report_pack_contract,是否受影响未核对。
  • 引擎里有两个本命 Vivah Saham 公式:全读 Step 16 _calc_vivah_saham(金星 − 土星 + 上升,带落宫)与 tajika.calc_all_sahams(金星 − 火星 + 上升,注释写「简化」)。卡用前者(它就是全读的婚姻敏感点并直接给落宫)。
  • SKILL.md「关联技法完整调取」列举的基础段内容没写 D9 摘要(不矛盾、只是不全);本单不改 Skill 文本以免 bump,若要同步可随性别单一起改。

环境缺口

  • 无 Docker:数据库 / 部署套件 24 条失败,名单与基线逐条一致。
  • 无真实模型凭据与浏览器登录态:模型是否真的引用年主 / Muntha / Mudda、是否分三层、是否不把 Punarphoo 写成结婚,留给 docs/testing/consult-evidence-card-v2-20260927.md 真机清单。

验收(Claude,2026-09-27)

基于 5b061e43 独立复跑(Node 22.14,顺序执行):tsc 0;lint 0 error;npm test 4174 / 24 fail / 28 skip,失败名单与上一轮基线逐条一致,无消失测试名;Python 门禁集退出 0(含 growth contract);tests/test_consultation_native_layers.py + 领域注册表测试通过;/、/chart、/ephemeris、/people ○ Static;rootMainFiles gzip(level 9)130933 B。未碰 skills/、.gitea/、vendor/、deploy/、迁移;jyotish_api_server.py 只加 4 行薄注册,新模块每层 _guard + 外层兜底,异常只把该层标 blocked、不影响咨询。

BUG-1060 我已核对:cmd_double_transit_pac 中 d9_event_house_lon = (d9_asc_idx * 30) + 15 应为 d9_event_si;jyotish_engine.py 不在冻结计分清单内。另开小修复单处理(同时影响全读 / 报告的双重过运 D9 层)。