v3.4:童限小运、全量流年与节气边界提示;解释输出契约 v3.0 直答先行

排盘输出 schema 1.1→1.2:
- ## 流年 改为出生年至今+10 年全量,逐年标注所属区间(童限/某运/交运年)
- 新增 ## 小运(童限各虚岁干支,自时柱起、一位一岁、顺逆同大运)
- 生于交节前后 12 小时内出 ⚠️ 节气边界提示(月令敏感性)
- 神煞改由脚本按查法直接计算并列锚点;新增 scripts/query_shensha.py 查岁运神煞

规则库 380→541(16→20 文件,版本 3.4):
- 新增 89_旺衰扶抑 / 91_何知事类 / 92_调候 / 93_性情(滴天髓、穷通宝鉴参看层)
- 90_行运.md 新增 §10 童限(R-运-36~39,蒸馏《命理探源》《三命通会》小运诸法)
- R-运-33 改写为核对前置:intake 一问定场景,可核对走锚点、不可核对直推,输出只出现一次
- R-运-32 增前提挑战、直答收敛(一个主答案+置信度)、同机制证伪降权
- R-运-34 增救应回查(合绊解冲折减引动并回写排序);R-运-10 补「缓急非早晚」之辨
- 94 神煞扩展 19 条(三命通会书证);规则编号记录移调试层
- sources 按书归档五书全文;黄金集扩至 291 例(真诠 92 + 滴天髓 199)

SKILL.md 输出契约 v2.1→v3.0:
- 骨架改为 排盘口径→直答→现实对应→分析推理→存疑与边界→免责
- 说人话段改现实对应段(问题域优先);编号默认不进用户面输出
- Intake 增场景判定一问(命主本人/替人看/能否核对)

测试:新增 test_luck.py 9 项,全套 65 项通过
This commit is contained in:
2026-10-08 13:07:23 +08:00
parent d9da4301cd
commit 618bf8dcab
564 changed files with 26154 additions and 614 deletions
+82
View File
@@ -0,0 +1,82 @@
#!/usr/bin/env python3
"""岁运神煞实时查询 —— 模型按需调用。
用法:
python query_shensha.py --gender 女 \
--pillars "丁亥 乙巳 庚子 辛巳" --target 丙午 [--label "2026 流年"]
输出(stdout):
- 以本命锚点(日干、年支、日支、月令、年柱纳音、阴阳男女)查得、目标干支所逢之神煞;
- 目标干支自身所属之日柱固定组(阴差阳错、十灵日、魁罡、十恶大败、天赦,供流日参看)。
查法口径与排盘输出 `## 神煞` 一致(chart/shensha.py,规则见 rules/94_神煞细节.md)。
退出码:0 成功;2 输入不可用;3 内部错误。
"""
import argparse
import sys
import traceback
from pathlib import Path
sys.path.insert(0, str(Path(__file__).resolve().parent))
def main() -> int:
ap = argparse.ArgumentParser(
prog="query_shensha.py",
description="查询某一干支(流年/流月/大运/流日)相对本命四柱所逢的神煞",
)
ap.add_argument("--gender", required=True, choices=["男", "女"], help="性别")
ap.add_argument("--pillars", required=True,
help='本命四柱干支,年月日时顺序,空格分隔,如 "丁亥 乙巳 庚子 辛巳"')
ap.add_argument("--target", required=True,
help="目标干支(流年/流月/大运/流日),如 丙午")
ap.add_argument("--label", default="", help='目标说明,如 "2026 流年",仅用于输出标题')
a = ap.parse_args()
try:
from chart.shensha import evaluate_target, GAN, ZHI
parts = a.pillars.split()
if len(parts) != 4 or any(len(p) != 2 or p[0] not in GAN or p[1] not in ZHI
for p in parts):
print("ERROR: --pillars 应为年月日时四组干支,如 \"丁亥 乙巳 庚子 辛巳\"。",
file=sys.stderr)
return 2
target = a.target.strip()
if len(target) != 2 or target[0] not in GAN or target[1] not in ZHI:
print("ERROR: --target 应为一组干支,如 丙午。", file=sys.stderr)
return 2
pillars = dict(zip(("year", "month", "day", "hour"), parts))
result = evaluate_target(pillars, a.gender, target)
title = f"# 神煞查询:{target}"
if a.label:
title += f"({a.label})"
title += f" 对 {' / '.join(parts)}({a.gender})"
print(title)
print()
print("## 本命锚点查得(岁运逢)")
print()
if result["anchored"]:
for star, note in result["anchored"]:
print(f"- {star}({note})")
else:
print("- (无)")
print()
print("## 目标干支自身所属")
print()
if result["own"]:
for star, note in result["own"]:
print(f"- {star}({note})")
else:
print("- (无)")
return 0
except Exception:
print("ERROR: 查询内部错误。", file=sys.stderr)
traceback.print_exc(file=sys.stderr)
return 3
if __name__ == "__main__":
raise SystemExit(main())