mcpField
V
vedic-calculator

vedic-calculator

github.com/cnwu16その他996100 回インストール今日更新
リポジトリ

vedic-calculator について

vedic-calculatorは、出生日時と場所からヴェーダ占星術のチャートデータを計算するエージェントスキルです。分割図、Dashaの時系列、検証情報を含む、vedic-reader互換のstructured_data.mdを出力します。

主な機能

  1. 01出生情報からチャート全体を計算
  2. 02互換性のあるstructured_data.mdを作成
  3. 03分割図、SAV/BAV、Shadbalaを計算
  4. 04MD・AD・PDのDasha時系列を生成
  5. 05分割図の安定性とデータ整合性を確認

活用シーン

  1. 01出生情報から鑑定用データを作成
  2. 02vedic-core向けの標準チャートデータを準備
  3. 03出生時刻の不確かさが分割図に与える影響を確認
  4. 04日付に対応するDasha期間を照会

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/cnwu16/vedic-astro-skills --skill vedic-calculator

インストール後、Claude Code で/vedic-calculatorを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

requirements.txt
resources/
ja-calculator.md
scripts/
ashtakavarga_pyjhora.py
chara_dasha.py
check_env.py
dasha_pyjhora.py
dasha_query.py
divisional_pyjhora.py
engine.py
extras_pyjhora.py
formatter.py
make_xiaohuo_person_card.py
setup_env.py
shadbala_pyjhora.py
transit.py
scripts/ephe/
seas_18.se1
sepl_18.se1

詳細

vedic-calculator:ヴェーダ占星術チャート作成エンジン

言語契約

  • client_language は、ユーザーが明示的に指定した言語に設定します。指定がない場合は、直近の実質的なユーザーメッセージの言語に合わせます。
  • すべてのチャット返信、聞き取りの質問、確認、進捗報告、ユーザー向けの警告、レポート、Q&A には client_language を使用します。以下の中国語の例や引用テンプレートは意味上のテンプレートです。client_language が中国語以外の場合は、そのままコピーせずに翻訳してください。
  • 正式なファイル名、CLI フラグ、JSON キー、structured_data.md のスキーマ見出し、技術コード、サンスクリット語/英語の識別子は変更しないでください。これらは内部の相互運用性を保つための契約です。ユーザーに示す場合は、client_language で説明してください。
  • 専門用語を初めて使うときは、平易な訳語の後に正式な用語を括弧内に示してください。計算や根拠の引用内にある正式な識別子は翻訳しないでください。
  • 実行中にユーザーが言語を変更した場合は、既存のデータと成果物の系譜を維持し、その時点以降のユーザー向けの言語を切り替えてください。ユーザーが以前の成果物の再生成を明示的に求めた場合は除きます。
  • client_language が日本語の場合、日本語で最初のユーザー向けメッセージを送る前に、resources/ja-calculator.md を最後まで読んでください。適用範囲は用語、文体、聞き取り、表示のレイヤーに限ります。計算、スキーマ、根拠、フェーズ、出力要件は変更しません。

pysweph 天文エンジンと PyJHora の高精度アルゴリズムに基づき、出生時刻から完全なチャートデータを直接計算します。 出力形式はvedic-readerのstructured_data.mdと完全互換で、そのままvedic-coreに渡して分析できます。

前提条件

  • Python 3.8 ~ 3.13(pysweph は C 拡張のため、3.14 は未対応です)
  • 依存関係:pysweph、PyJHora==4.8.6、pytz

⚠️ pip install -r requirements.txt を直接実行しないでください! PyJHora は実行時依存関係を宣言しておらず、また pip パッケージには .se1 天体暦ファイルが含まれていません。 setup_env.py を使って自動インストールしてください(下記参照)。

環境の自動検出
运行前检查依赖是否可用(按优先级):

  1. 检查 <skill目录> 或工作目录下是否有已有 venv/:
     - <skill目录>/venv/
     - <工作目录>/vedic-calc-env/
     - <工作目录>/venv/
     找到 → 用其 Python 运行 → 尝试 import swisseph → 成功 → 直接使用

  2. 尝试当前 Python import swisseph:
     - 成功且 swe.version 不是 '0.0.0' → 直接使用
     - 失败或空壳 → 继续

  3. 自动创建 venv(运行 setup_env.py):
     <合适的Python> <skill目录>/scripts/setup_env.py
     脚本会自动:检测 Python 版本 → 创建 venv → 按正确顺序安装 → 验证 SAV=337

⚠️ <skill目录> = vedic-calculator skill のインストールパスです。AI が実際の環境に応じて自動入力します。 ⚠️ システムのデフォルト Python が 3.14 の場合、setup_env.py は 3.12/3.13 を自動で探して venv を作成します。

⚠️ 初回使用時は、必ず最初に環境診断を実行してください
在新机器/新环境首次使用 vedic-calculator 前,必须先运行:

  python <skill目录>/scripts/check_env.py

该脚本会自动检查:
  ✅ venv 位置和 Python 版本
  ✅ 3个核心依赖(pysweph/PyJHora/pytz)
  ✅ swisseph 空壳检测
  ✅ 星历表文件
  ✅ 最小计算测试(SAV=337)

如果输出 🎉 → 直接使用它报告的 Python 路径
如果输出 ⚠️ → 按提示运行 setup_env.py 修复

注意:check_env.py 本身可以用任何 Python 版本运行(包括3.14),
它会自动找到正确的 venv Python 来做依赖检查。

使用手順

Step 1: 出生情報の収集

ユーザーから以下を収集します:

- 出生日期 (YYYY-MM-DD)
- 出生时间 (HH:MM,24小时制)
- 出生地点 (城市名)
- 性别
- 感情状态(可选)
- 时间精度(精确到分钟 / ±15分钟 / ±1小时 / 不确定)
- 时间来源(出生证 / 家人记忆 / 大概回忆 / 未追问)

⚠️ 夏時間の確認(出生年月日が現地の夏時間期間にあたる場合は必須です。例:中国本土では1986~1991年の各年4月中旬~9月中旬):

向用户输出一句确认(默认=墙上钟,绝大多数记录是当时钟表显示时间):
"您出生时当地正实行夏令时。您提供的时间是当时钟表显示的时间吗?(通常是,直接回'是'即可)
 若家里记录的是未拨快的'标准时/北京时间',请说明。"
→ 墙上钟(默认)→ 正常排盘(引擎 pytz 自动按夏令时换算 UTC,正确)
→ 用户声明标准时 → 用固定时区排盘(如中国用 'Etc/GMT-8' 替代 'Asia/Shanghai'——
   注意 Etc 时区符号反转,GMT-8 即 UTC+8),并在备注记录"用户声明标准时"
排盘后 structured_data 元信息会自动带"夏令时"标注行,供用户核对。
Step 2: AI による地理座標への変換

ユーザーが提示した都市名に基づき、AI が以下を直接入力します:

  • 緯度 (lat)
  • 経度 (lon)
  • タイムゾーン文字列 (tz_str)

よく使う参照値:

北京:     39.9042, 116.4074, "Asia/Shanghai"
上海:     31.2304, 121.4737, "Asia/Shanghai"
广州:     23.1291, 113.2644, "Asia/Shanghai"
成都:     30.5728, 104.0668, "Asia/Shanghai"
台北:     25.0330, 121.5654, "Asia/Taipei"
香港:     22.3193, 114.1694, "Asia/Hong_Kong"
新德里:   28.6139, 77.2090,  "Asia/Kolkata"
孟买:     19.0760, 72.8777,  "Asia/Kolkata"

⚠️ 中国全土では "Asia/Shanghai" (UTC+8) を使用します。 ⚠️ インド全土では "Asia/Kolkata" (UTC+5:30) を使用します。

Step 3: エンジンの実行

作業ディレクトリに計算スクリプトを作成して実行します:

import sys, os

# ⚠️ 动态路径:AI根据skill安装位置自动填写
# Claude Code 示例: ~/.claude/skills/vedic-calculator/scripts
# 其它客户端: 换成该客户端实际的 skill 安装目录下的同名路径
SCRIPTS_DIR = r"<vedic-calculator skill 的 scripts 目录绝对路径>"
sys.path.insert(0, SCRIPTS_DIR)

from engine import calculate_full_chart
from transit import calc_transit
from formatter import format_structured_data

# 计算本命盘
chart = calculate_full_chart(
    year=YYYY, month=MM, day=DD, 
    hour=HH, minute=MM,
    lat=LAT, lon=LON, 
    tz_str="TIMEZONE",
    # 按“有效精度”传入:出生证分钟记录至少审计±1;家人明确记忆通常5;
    # ±15分钟报时传15。它审计输入稳定性,不改变报时本身。
    uncertainty_minutes=1
)

# 计算当前过运
transit = calc_transit(
    chart['lagna']['sign_idx'],
    chart['planets']['Moon']['sign_idx'],
    "TIMEZONE"
)

# 元信息
meta = {
    'dob': 'YYYY-MM-DD',
    'time': 'HH:MM',
    'place': '城市名',
    'lat': LAT, 'lon': LON,
    'time_precision': '精确到分钟',
    'time_source': '未追问'
}

# 用户信息
user_info = {
    'gender': '男/女',
    'relationship': '单身/恋爱中/已婚'
}

# 生成structured_data.md
md = format_structured_data(chart, transit, meta, user_info)
with open(r"WORKDIR\structured_data.md", 'w', encoding='utf-8') as f:
    f.write(md)

# ⚠️ 正确的 SAV 验证方式(不要自己猜 key!)
SIGNS = ['Aries','Taurus','Gemini','Cancer','Leo','Virgo','Libra','Scorpio','Sagittarius','Capricorn','Aquarius','Pisces']
sav_total = sum(chart['sav'].get(s, 0) for s in SIGNS)
print(f"✅ SAV total: {sav_total}")
assert sav_total == 337, f"SAV FAILED: {sav_total} != 337"

実行コマンド(AI が環境に応じて Python を自動選択します):

# 优先级:skill目录下的venv → 系统Python
# Windows:  <skill目录>\venv\Scripts\python.exe SCRIPT_PATH
# Linux/Mac: <skill目录>/venv/bin/python SCRIPT_PATH
# 都没有venv: python SCRIPT_PATH(需已全局安装依赖)

⚠️ chart データを読み取るために print を自分で書くことは禁止です! formatter.py を使って structured_data.md を出力してください。 chart のデータ構造については、下記の「engine の返却データ構造」を参照してください。

Step 4: 出力の検証

生成されたstructured_data.mdを確認します:

  1. SAV の合計 = 337 ✅
  2. 惑星の完全性 = 10個 ✅
  3. Ra-Ke の差 = 180° ✅
  4. Lagna の星座が妥当か
  5. Vimsottari = 9段のMD、81段のAD、729段のPD。各階層で [start,end) に隙間がなく連続していること ✅
  6. 分割図の境界監査:分盘可信度声明を読み、有効な精度範囲内でD1/D9/D10/D4/D5が「安定」か「境界に敏感」かを確認します。「出生証明書」や「直接計算」であることを理由に、すべての分割図を自動的に信頼できるものとして記載することは禁止です。これらが示すのはそれぞれ記録の由来と数学的な再現可能性であり、入力の変動に対する安定性ではありません。

分割図の利用に関する厳格な制約:

  • ✅ 审计区间内稳定:対応する分割図は、現在のLagnaに基づいて通常どおり使用できます。
  • ⚠️ 边界敏感:指定時刻における計算表は保持しますが、分割図のハウス、内部のハウス支配星、およびすべての下流の形態に関する結論は、条件付きにするか、確度を下げる必要があります。
  • 古いstructured_dataに境界監査がない場合は「未検証」と記載し、高い信頼性があるものとして補完してはなりません。
  • 出生証明書に記録時点が初声、分娩、臍帯切断、事後入力のいずれか明記されていない場合、時刻の意味は依然として不明です。

時間分解能に関する厳格な制約:

  • MDのみを読む場合は、背景となる傾向のみを出力します。
  • MD×ADまで読む場合は、期間の範囲までを出力できます。
  • ユーザーが月単位、またはADより狭い期間を求める場合は、MD×AD×PDを必ず読み取ってください。
  • PDが欠落しているか、検証に失敗した場合は、月単位の判定を停止してください。ADや365.25日による近似を使って、月単位の精度を作り出すことは禁止です。
Step 4.5: 3階層の段階的読み込み(canonicalデータは変更しない)

Calculatorによる通常のチャート作成では、完全な9 MD + 81 AD + 729 PDを一度に計算、検証し、書き込む必要があります。 段階的な読み込みで最適化するのは下流モデルのコンテキストであり、データの削除、計算の省略、タイムラインの変更ではありません。

下流のreader/rectifier/core/core-pro/QAはすべて、次の3階層で利用します:

  1. MD背景階層:まず人生の大きな段階を特定します。
  2. AD段階階層:次に領域の候補と出来事の段階を特定します。
  3. PDの微細トリガー階層:ユーザーが月/日単位を求める場合、実際の出力が完全なADより狭い場合、または隣接するAD/PD間の引き継ぎによって結論が変わる場合に限って読み取ります。

structured_data.mdにある729行のPD全体を、デフォルトでモデルのコンテキストに渡すことは禁止です。決定論的なツールを使用してください:

# 默认读盘:输出全部非PD数据与MD/AD,折叠729行PD
python <calculator>/scripts/dasha_query.py --file structured_data.md --overview

# 完整性校验:只输出校验结果,不展开PD
python <calculator>/scripts/dasha_query.py --file structured_data.md --check

# 月级下钻:只返回命中的PD与相邻上下文
python <calculator>/scripts/dasha_query.py --file structured_data.md --month 2023-06 --context 1

# 日级或自定义[start,end)窗口
python <calculator>/scripts/dasha_query.py --file structured_data.md --date 2023-06-15 --context 1
python <calculator>/scripts/dasha_query.py --file structured_data.md --start 2023-05-01 --end 2023-07-01 --context 1

候補を比較するときは、まず同じ方法ですべての候補のMD/ADマトリクスを完成させ、PDによる判別がまだ必要なすべての候補を確定してから、まとめて掘り下げてください。現在最も有力だと思う候補だけのPDを読むことも、729行をすべて読んでから答えに最も近い期間を逆算して選ぶことも禁止です。

Step 5: モードの選択

structured_data.md の生成後、ユーザーに次の内容を出力します:

✅ 排盘完成!所有数据已生成(行星/分盘/SAV/Dasha大运+小运+三级运/宫主表/尊贵度/过运…)

📊 Shadbala 精度说明:
   structured_data以calc为主数据源。
   Shadbala始终先写入calc基准值。如没有JHora PDF,直接采用calc。
   如有同一出生时间生成的JHora PDF,则逐行对照并展示PDF值;
   二者不一致时会明确提示"当前采用PDF"。其余PDF数据只用于交叉验证。

下一步:
  a) 直接进入验前事(推荐)
  b) 发送 JHora PDF 补充 Shadbala

チャートの作成後、小火人用の資料をエクスポートして、上記の通常の a/b フローに挿入しないでください。まず、ユーザーには上記のフローを続けてもらい、 メッセージの最後に任意の案内を一文だけ追加してください:「このチャートを小火人で使いたい場合は、『小火人にコピーできる資料を整理して』と伝えてください。」 ユーザーが「小火人用の資料」「コピーできる資料」「関係資料」または類似のリクエストを明確にした場合にのみ、エクスポート分岐に進みます。通常のチャート作成ユーザーには、追加の長い資料を自動で渡さないでください。

  • ユーザーが a) を選択するか、「直接分析」「開始」と伝えた場合 → vedic-reader を起動します(簡潔モード:抽出をスキップし、structured_data を直接読み取って過去の出来事を検証します)

  • ユーザーが PDF を送信した場合 → 出生情報の整合性を確認 → PDF のテキストレイヤーから有効な Shadbala を抽出 → calc の Shadbala と行ごとに照合 → PDF に存在する行には PDF の値を表示し、差異がある行には注記してユーザーに伝えます → PDF にない行は calc の値を保持 → その他の PDF データは相互検証にのみ使用します → その後、reader を起動して過去の出来事を検証します

  • ユーザーが小火人用の資料を明確にリクエストした場合 → 生成済みの canonical structured_data.md は変更せずに保持し、 scripts/make_xiaohuo_person_card.py structured_data.md を実行して、stdout に返された xiaohuo-person-v1 のプレーンテキストをそのままユーザーに送信します。画像は生成せず、ユーザーにファイルを開いたり理解したりするよう求めず、 また資料カードを新しいチャート作成結果として扱わないでください。2人で使用する場合は、それぞれ別々にチャートを作成し、個人資料を1つずつ生成したうえで、 2人の会話内に A/B として貼り付けます。エクスポートには、明確な Lagna、現在の MD/AD/PD、および日付付きの遅い惑星のトランジットスナップショットが含まれます。 エクスポーターは天体暦を呼び出さず、古いスナップショットの日付を今日に変更しません。ユーザーが実際の当日のトランジットを求め、ソースファイルの日付が古い場合は、 エクスポート前に完全な Calc を再実行する必要があります。エクスポーターだけを再実行したり、日付を手動で変更したりしてはいけません。

engine の返却データ構造

⚠️ 必読! キー名を推測しないでください。以下は calculate_full_chart() が返す dict の構造です。

chart = {
    # 基础天文
    'ayanamsa': 23.8982,           # float, True Chitra ayanamsa 度数(约23.9°,与Lahiri差<1′)
    'lagna': {
        'sign': 'Cancer',          # str, 英文星座名
        'sign_idx': 3,             # int, 0-indexed (Aries=0)
        'degree': 13.61,           # float, 绝对度数 (星座内)
        'deg_str': "13°36'",       # str, 格式化度分
        'longitude': 103.61,       # float, 黄道经度
        'nakshatra': {'name': 'Pushya', 'pada': 4, 'lord': 'Saturn'}
    },
    'planets': {
        'Sun': {
            'sign': 'Scorpio', 'sign_idx': 7,
            'degree': 25.41, 'deg_str': "25°24'",
            'longitude': 235.41,
            'house': 5,            # int, 1-indexed 从 Lagna 数
            'retrograde': False,
            'nakshatra': {'name': 'Jyeshtha', 'pada': 3, 'lord': 'Mercury'}
        },
        # ... Moon, Mars, Mercury, Jupiter, Venus, Saturn, Rahu, Ketu 同结构
    },

    # SAV — ⚠️ key 是英文星座名,不是 'by_sign'!
    'sav': {
        'Aries': 36, 'Taurus': 34, 'Gemini': 22, 'Cancer': 28,
        'Leo': 34, 'Virgo': 29, 'Libra': 29, 'Scorpio': 25,
        'Sagittarius': 32, 'Capricorn': 20, 'Aquarius': 26, 'Pisces': 22
    },
    'sav_by_house': {
        1: {'sign': 'Cancer', 'value': 28},  # 按宫位编号
        # ... 2-12 同结构
    },

    # BAV
    'bav': {
        'Sun': {'Aries': 6, 'Taurus': 5, ...},  # 12星座
        # ... Moon, Mars, Mercury, Jupiter, Venus, Saturn
    },

    # Shadbala — ⚠️ 用 strength_pct (不是 strength_ratio)!
    'shadbala': {
        'Sun': {
            'total_60ths': 288.6,  'total_rupas': 4.81,
            'sthana': 82.0, 'kaala': 55.0, 'dig': 6.7,
            'cheshta': 44.9, 'naisargika': 60.0, 'drik': 40.0,
            'strength_pct': 96.2,  # ⚠️ 百分比,直接用!
            'classification': '弱',
            'ishta_phala': 7.64,   # Ishta Phala
            'kashta_phala': 50.18  # Kashta Phala
        },
        # ... Moon, Mars, Mercury, Jupiter, Venus, Saturn 同结构
    },

    # Dasha
    'dashas': [
        {
            'planet': 'Jupiter', 'start': '1998-02', 'end': '2014-02',
            'years': 16, 'is_current': False,
            'antardashas': [
                {
                    'planet': 'Jupiter',
                    'start': '1998-02-11', 'end': '2000-04-01',
                    'start_time': '1998-02-11 12:34', 'end_time': '2000-04-01 08:20',
                    'is_current': False,
                    'pratyantardashas': [
                        {
                            'planet': 'Jupiter',
                            'start': '1998-02-11', 'end': '1998-05-26',
                            'start_time': '1998-02-11 12:34', 'end_time': '1998-05-26 04:15',
                            'is_current': False
                        },
                        # ... 每个AD共9个PD
                    ]
                },
                # ... 9个小运
            ]
        },
        # ... 共9段大运
    ],

    # 分盘 — (sign_name, sign_idx) tuple
    'd9':  {'Lagna': ('Scorpio', 7), 'Sun': ('Aquarius', 10), ...},
    'd10': {'Lagna': ('Cancer', 3),  'Sun': ('Pisces', 11), ...},
    'd4':  {'Lagna': ('Libra', 6),   'Sun': ('Leo', 4), ...},
    'd5':  {'Lagna': ('Pisces', 11), 'Sun': ('Scorpio', 7), ...},
    'vargottama': {'Sun': False, 'Moon': False, 'Rahu': True, ...},
    'divisional_charts': {'D2': ..., 'D3': ..., ...},  # 额外分盘

    # 预分析
    'karakas': {'7k': [...], '8k': [...], 'dk_7k': 'Saturn', 'dk_8k': 'Rahu', 'dk_note': '7K(主)=Saturn, 8K(参考)=Rahu'},
    'dignity': {'Sun': {'compound': 'great_friend', ...}, ...},
    'aspects': [{'p1':'Rahu','p2':'Ketu','type':'对冲(180°)','degree_diff':'180.0'}, ...],
    'house_lords': {1: {'lord':'Moon','domain':'自我','lord_house':8}, ...},
    'special_points': {'AL': {'sign':'Virgo','house':3}, 'UL': {'sign':'Pisces','house':9}},
    'combustion': {},
    'moon_phase': {'waxing': True, 'sun_moon_diff': 88.6},
}

出力仕様

出力される structured_data.md には、以下のデータセクションが含まれます(data_contract.md と完全に一致):

セクション内容
メタ情報出生時刻、場所、Ayanamsa、チャートの読み方
惑星位置10個の惑星+Lagna、星座/ハウス/度数/逆行
Nakshatraすべての惑星の Nakshatra+Pada
Chara Karakas7K の主表(KN Rao)+ 8K の参考情報
Shadbala7個の惑星の Rupas/パーセンテージ/順位/強弱/Ishta/Kashta
SAV元の値(星座別)+ ハウスへのマッピング(ハウス別)
BAV7個の惑星×12星座のマトリックス
Vimsottari Dasha9期間の大運 + 81期間の Antardasha + 729期間の Pratyantardasha;現在の MD/AD/PD
特殊ポイントAL(Arudha Lagna)+ UL(Upapada Lagna)
Compound DignityPanchadha Maitri(高揚/自室/減衰は直接確定)
Graha Drishtiヴェーダ惑星アスペクト(ハウスへのアスペクト:惑星→7th など;西洋占星術の orb アスペクト表は廃止・削除済み)
ハウス主表12ハウスすべて
分割図D9/D10/D4/D5 + Vargottama + 出生時刻不確定区間の境界監査
検証12項目の自動検証
トランジット遅い惑星のトランジット + Sade Sati + 2重トランジット

技術仕様

  • Ayanamsa: True Chitrapaksha (TRUE_CITRA)(固定、変更不可;Lahiri 系に属し、差は<1′)
  • ノードモード: Mean Node
  • 天文学コア: pysweph (Swiss Ephemeris C binding)
  • SAV/BAV: PyJHora ネイティブ (ashtakavarga_pyjhora.py)
  • Dasha: PyJHora ネイティブ MD/AD/PD (dasha_pyjhora.py);区間は一律[start,end)とし、独自の近似による第3レベルの運勢期間の補完は禁止
  • Shadbala: PyJHora + 9項目の補正 (shadbala_pyjhora.py)
  • 分割図: PyJHora ネイティブ (divisional_pyjhora.py) — D1~D60 の15種類
  • 分割図の安定性: 呼び出し元から渡されたuncertainty_minutesの範囲内で、D1/D9/D10/D4/D5 の Lagna を1分ごとに再計算します;数学的な正確性と入力の安定性をそれぞれ報告します
  • Dignity: 独自実装(高揚/自室/減衰を事前判定);燃焼 orb / 方位の強さは engine.py 内の2つの表に記載
  • Chara Karakas: 7K(KN Rao)+ 8K の参考情報
  • フォールトトレランス方針: fail-fast(依存関係が不足している場合は直接エラーを返し、誤った結果は出力しません)

他のskillとの関係

路径1(纯calc,推荐):
  用户给出生信息 → vedic-calculator → structured_data.md → vedic-reader(验前事) → vedic-core

路径2(PDF + calc主数据):
  用户给PDF → reader提取出生信息 → calculator生成canonical structured_data
  → PDF交叉验证(仅有效Shadbala可覆盖)→ reader(验前事) → core

路径3(兜底):
  用户材料无法提供完整出生信息 → reader提取模式(标注降级)→ reader(验前事) → core

どのパスから出力しても、structured_data.md の形式は完全に一致するため、core はデータソースを区別する必要がありません。

コメント