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
+37 -3
View File
@@ -114,9 +114,43 @@ def decade_pillars(
return pillars
def flow_years(current_year: int, n: int = 10) -> list[tuple[int, str]]:
"""从今年起 n 个流年干支。"""
return [(y, ganzhi_of_year(y)) for y in range(current_year, current_year + n)]
def flow_years(birth_year: int, current_year: int, n: int = 10) -> list[tuple[int, str]]:
"""出生年至今 +n 个流年干支(回溯断运需要过往流年)。"""
return [(y, ganzhi_of_year(y)) for y in range(birth_year, current_year + n)]
def childhood_luck(
hour_gan: str,
hour_zhi: str,
forward: bool,
start_age_years: float,
birth_year: int,
) -> list[tuple[int, int, str]]:
"""小运(童限):自时柱起,一位一岁,顺逆与大运同(阳男阴女顺、阴男阳女逆)。
覆盖虚岁 1 岁至起运前;起运不足一岁者返回空表。
返回 (虚岁, 公元年, 干支)。
"""
step = 1 if forward else -1
last_age = int(start_age_years)
out = []
for age in range(1, last_age + 1):
gan, zhi = ganzhi_cycle_next(hour_gan, hour_zhi, step * age)
out.append((age, birth_year + age - 1, gan + zhi))
return out
def luck_label_for_year(year: int, luck_pillars: list[LuckPillar]) -> str:
"""该流年所属区间标签(按起运整数年归属):童限 / 某运干支 / 交运年。"""
if not luck_pillars or year < luck_pillars[0].start_year:
return "童限"
label = f"{luck_pillars[0].gan}{luck_pillars[0].zhi}运"
for lp in luck_pillars:
if year >= lp.start_year:
label = f"{lp.gan}{lp.zhi}运"
if year == lp.start_year:
label = f"交运年·入{lp.gan}{lp.zhi}运"
return label
def flow_months(year: int) -> list[tuple[str, str]]: