Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017eEAG8HD3mm8gsKXgk8uU8
22 KiB
PROGRESS · 数据卡 v2(采纳占星顾问意见)· 2026-09-27
- 执行方式:直接执行(产品负责人授权子代理执行;Claude 事后独立验收)
- 基线:
origin/staging5b061e43(本单任务书提交);已核对含数据卡 v1cd4dde9d与校正 grounding261d7b2e。 - 分支:
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.mdERR-110 / 111 / 112。冻结计分文件(sealed_holdout_rerun.pyPRODUCTION_FILES10 个 + holdout v3frozen_scoring.files12 个)一个都没动;跨进程比较一律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 层)。