Spaces:
Running
Running
Commit History
21 days ago
-
Handle absent wealth relation in complete BaZi interpretation Running
th94ffb73 -
Fix BaZi timezone and historical daylight-saving calculation
th40d3e55
-
fix(zodiac): route all-date fortune requests correctly
th0d81a1d
-
feat(dayun): clarify evidence and trigger explanations
the49ec16 -
chore: remove generated test artifacts
th687c6b1 -
feat(bazi): add evidence-first dayun assessment
th0d792fe
-
feat(bazi): expose redacted dayun score preview
thd8fc2e3 -
feat(bazi): version canonical strength contract
thf61ed21 -
test(shensha): 神煞守卫从黑名单升级为不变式
th变异审计(2026-08-23)发现原守卫可穿透: M4b —— 把词表里已有的 '天乙贵人' 主题改成 「必有贵人扶持,事业必成,凡事化险为夷」, 该句直接进入付费正文,而 test_spirit_sections_are_deduped_and_boundaried 等 4 条测试全绿。原因:它用的是 banned 词表黑名单, 只挡住列进去的那几句旧断语。 黑名单挡已知的坏句子,不变式挡「这一类」句子。 新测试守的是 _spirit_theme 的词表本身(唯一真源), 不是 9 张盘碰巧渲染出来的那几条。 ⚠️ 第一版仍有洞:正则只扫键值对,改兜底默认句(M4)仍然全绿。 已把 themes.get(name, '默认句') 的默认参数一并纳入。 M4 / M4b 现在都能杀。 变异结果留档:M1(官杀互换) 杀、M2(格局法标签回退) 杀、 M4/M4b 原为存活,现已封。 🦊 Generated with Sisib23c70d -
fix(reading): add multi-chart evidence guardrails
thfefbb42 -
fix(ten-gods): 十神统计归一到全称 —— 两处长期静默失效的分支复活
th根因:BaZiCalculator 的 ten_gods 输出是简写(杀/枭/才/劫…), _calculate_ten_gods_stats 原样透传,而**所有**下游都按全称取值。 没有任何报错,只是永远取不到: 1. ai_interpreter.py:1053 `'正官' in ten_gods or '七杀' in ten_gods` 恒为 False → 关煞分析 9/9 从不运行。修复后 6/9 触发 (6 是对的,没有官杀的盘本就不该触发)。 2. SHISHEN_XINXING 的 key 是全称 → 主导十神心性解读 0/9 查得到, 十神心性整节只有标题没有正文(与滴天髓空壳同类)。修复后 9/9。 3. 用户看到的是「主导十神:杀」—— 内部简写被直接摊进付费报告。 4. test_p0_features / test_dinghuo_complete 的 fixture 写的就是 {'正官': 2, '偏财': 1} —— 全称一直是事实上的契约,只有产出端没遵守。 这是本仓库同一系列缺陷的又一例(财格写死常量、官职读不存在的 key、 健康用示例数据、CAREER_EXPLANATIONS 键不匹配):数据算对了,下游取不到。 测试 5 条,逐条变异验证。其中 M2(把 '杀' 错映射成 '正官')第一轮全部存活 —— 总数仍是 7、键仍是全称、关煞仍触发、心性仍查得到。补了 test_normalisation_is_a_faithful_one_to_one_rename 拿原始简写逐个对账 + 断言映射表是单射,才抓得住语义映射错误。 全量确定性测试 44 passed。 🦊 Generated with Sisibe3b8cb -
fix(genju): 补上正格分支从未返回的「日主强度」
th前端 PatternAnalysisCard 一直在渲染 yongshen_analysis.日主强度, 但 _determine_yongshen_proper 从来没有返回过这个字段 → 9/9 命盘的付费卡上都显示一个标着「日主强度」的空框。 数据本来就算好了(bazi_calculator.wuxing_strength),只是下游没读 —— 与本仓库这一系列缺陷同源(财格写死常量、官职读不存在的 key、 健康五行用示例数据)。顺带一并返回「旺衰」标签。 测试 1 条,已变异验证(M6:改回不返回 → 该条必红)。 🦊 Generated with Sisi377b5a3 -
feat(yongshen): 用神流派分歧不再隐藏 —— 计算两法并如实呈现
th问题:GenjuAnalyzer 是二选一分支 —— 正格走 _determine_yongshen_proper (格局法),杂气/无格走 _determine_yongshen_general(扶抑法),两套从不同时跑。 于是「两派不同意」这件事根本没被计算出来,产品对每张盘只报一个用神。 9 张验证盘实测,两法结论相反 3/9,且不是随机的 —— 相反的三张全部是「身弱 + 正格(七杀格/正财格)」:格局法对七杀格取食神制杀、 对正财格取食神生财,两者都泄身;扶抑法认为身弱该扶身(印比)。 小鱼盘是关键证据:引擎独立算出 21.2% 身弱,与她本人命理档案的 「旺衰 20.98% 偏弱、取水木为喜用」高度一致 —— 而她档案的用神站扶抑法这边, 产品当时只报格局法的「食神」,方向正相反且毫无提示。 改动: 1. 新增 _compare_yongshen_schools(),把扶抑法独立算出来跟格局法摆在一起, **不裁决谁对**。分歧本身就是判读: 格局法用神 = 命局要求你产出的形态(该走的路) 扶抑法用神 = 你的承载力缺口(先要补的底) 两者冲突 = 你要做的那件事,正在消耗你本来就不够的那部分 中和盘扶抑法本就不判方向,如实标 not_applicable,不硬凑结论。 2. 修掉夸大的标签:_determine_yongshen_proper 返回的 '判断方法': '扶抑法 + 格局法' 改为 '格局法' —— 该函数只读 favorable_gods, 一行扶抑计算都没有。 测试 6 条,逐条变异验证。其中 test_method_label_no_longer_overstates 第一版写成同义反复(if method=='格局法' 才断言),被变异 M2 抓出是死测试,已改为 按 pattern_type 断言确切值并加样本量下限。 🦊 Generated with Sisi0a908bf
-
fix(marriage): 移除写死的「准确率 94%」
thmarriage_analyzer.py:1358/1370 的 spouse_direction 返回 'accuracy': '94%', 是一个写死的常量,从来没有任何测量支撑,而前端把它渲染成付费用户可见的 绿色徽章「准确率: 94%」。 与「财格写死食伤生财」是同一种病(常量冒充计算结果),但性质更重: 那个是判断错,这个是对客户的量化准确率承诺。 违反 CLAUDE.md 红线「宁可少承诺,不可做不到」, 也正是 trinity-destiny Step 5.5 ② 禁止的那类数字 (算不出假阳性率就不能给出准确率)。 改为在 note 里如实说明:由命盘结构推出,尚未经过真实结果验证。 🦊 Generated with Sisi09b1028 -
test(baseline): 逐年预测撒网密度 / 分辨力基线实验
th按 trinity-destiny Step 5.5 ②:算不出假阳性率的规律只能标「待追踪」。 逐年吉凶是付费正文的一部分,本实验回答「闭眼猜能中多少」。 9 张盘(含 3 张有真实答案)实测,当前大运窗口内: - 单领域密度 24-25%(婚姻/官非/升迁/灾劫) - 四领域并集密度 54%,其中 3 张盘达 67% - 36 个格子里 34 个恰好是 3 年 —— 这是 _focus_years 的 [:3] 配额, 不是命盘算出来的量。数量零信息,信息只在「是哪三年」。 已排除的替代解释:_focus_years 按 (level, age) 排序取前三, 理论上偏向窗口前段。实测仅官非风险显著前倾(19/27, p=0.026), 4 次检验 Bonferroni 校正后不达标 → 标「待追踪」,不作结论。 脚本里记了三个 harness 陷阱(错用 calculate_bazi 会得到全 0、 绕过 _focus_years 会量到封顶前的数、分母该用窗口长度)。 🦊 Generated with Sisidd8d145 -
fix: align strength and wealth readings with chart evidence
thf5bedf7 -
fix(career): 职业解释 key 不匹配导致同一句话连出五条
th格局层(genju_analyzer)输出的职业名与解释表(CAREER_EXPLANATIONS)的 key 不一致:格局给「军人 / 警察 / 企业CEO / 会计师 / 金融分析师…」,解释表的 key 却是「军官 / 警官 / 企业管理 / 会计 / 金融分析」。59 个实际产出的职业里 仅 5 个能查到解释,其余全部落到兜底句「这是一个适合你的职业方向。」,于是 报告中出现: 1. 军人:这是一个适合你的职业方向。 2. 警察:这是一个适合你的职业方向。 3. 武术家:这是一个适合你的职业方向。 与「财格 9/9 同一个常量」「健康五行写死示例」同类:数据齐备,只是取不到。 - 新增 CAREER_ALIASES 与 get_career_explanation():先查原名、再查别名, 覆盖率由 5/59 提升至 52/59 - 查不到解释时返回空字符串,调用方只列职业名——对同一份清单反复输出同一句 通用话,比不解释更伤可信度 - 渲染层去重:近义职业(会计师 / 财务经理)归一到同一条解释后仍会重复, 同一段落内重复者只列名 - 不做语义错配的映射:武术家未映射到军官(后者文案为「适合在军队中发展」), 宁可不解释也不给错的解释 职业名由 9 个真实命盘实跑收集,非凭空罗列。 test_career_explanations.py 4 绿;其中「渲染后不得重复」一条在编写过程中 即捕获了别名归一后残留的会计师/财务经理重复,据此补上渲染层去重。 🦊 Generated with Sisi6d78f13 -
fix(interpreter): 不再输出只有标题、没有内容的滴天髓章节
th_interpret_ditianshi_insights 的空内容守卫只比对光秃秃的主标题,漏掉了 「已写入子标题但子标题下无正文」这一种:八格分析仅在某五行占比 ≥60% (专旺格,罕见)时才产出正文,普通命盘会先写入「**【八格分析】**」 再无下文,守卫因此失效,线上出现一个只有标题的空章节。 改为检查是否存在实质内容行(剔除主标题与所有 **【…】** 子标题后是否 还有剩余),无则整节不输出——宁可不出这一节,也不出一个空壳。 关于这一节的去留:滴天髓材料本身并不缺(天干论/八格/官杀/调候/合止/ 性情/夫妻,另有带验证等级的案例库,约 1180 行)。但「滴天髓深层洞察」 是一个出处标签而非用户需求——用户想知道的是事业与婚姻,古籍引在那些 章节内部比单开附录更有说服力(天干论现已在 personality 节发挥作用, 调候亦有独立章节)。后续宜将官杀折进格局、夫妻折进婚姻,而非补厚这 一节。本次只做「不出空壳」这一必须项。 🦊 Generated with Sisiff5c1ad -
fix(fortune): 流年清单裁到当前大运,并修正配偶星统计
th一、流年年龄错配 + 撒网过密 婚姻/官职/法律三个模块各自生成 1–100 岁吉凶年,再按 0-20/20-40/40-60/60-80 分段各取代表。45 岁的命主因此收到「10 岁、20 岁、70 岁的婚姻吉年」「3 岁的 灾劫年」——对当下毫无决策价值;且整表撒出 20 个高危年,覆盖成年段约七成, 事后总能被解释成命中,无法证伪。 更深一层:_analyze_promotion_years / _analyze_official_risk_years / _predict_disaster_years 结尾均为 sorted(...)[:10],按年龄升序取前十 —— 等于永远只返回最年轻的十年,任何 30 岁以上的命主这三项都拿不到相关年份。 - 新增 fortune_window:按命主当前所在大运求窗口(取不到大运时退回当前 年龄 −2/+8),并提供清单裁剪 - 三处 [:10] 截断移除,改由窗口裁剪选取 - 窗口内再按显著度取前三(high 优先):一个大运约十年,标出五个以上 「关键年」密度回到四成,用户仍分不出哪年真正值得注意 - 完整清单存于 all_risk_years,不作为预测呈现 实测:某 45 岁命主由「20 个、从 3 岁列起」变为窗口内 3 个;另一命主的 灾劫年现包含其实际离异所在的两年——此前被 6–31 岁的条目淹没。 二、配偶星恒为零却报「平衡」 _analyze_spouse_star 读 day_pillar['zhi_ten_god'],该 key 不存在,恒为 '', 故 star_count 永远是 0,却仍输出「配偶星平衡」。本类 __init__ 已正确提取 十神全集,改用之并统计全局;数量为 0 时如实输出「不显」或「仅见偏星」, 不再粉饰。 注:本次只解决「呈现出来的年份与命主当前阶段相关」。逐年预测本身是否 具备分辨力,仍需先测出同密度随机撒网的基线命中率,在此之前不应作为 付费卖点呈现。 🦊 Generated with Sisife2db06 -
fix(official,health): 两处「算出来的数据没被读」
th两个模块的结论都不由命盘推出,属同一类缺陷。 official_analyzer._analyze_official_star 读 pillar['gan_ten_god'] / ['zhi_ten_god'],而柱对象里并无这两个 key (实际字段为 shishen,十神全集在顶层 ten_gods)。两者恒为 None,于是 官星与七杀位置永远为空,任何命盘都被判「命局中无官杀」——包括月令 七杀透干、四柱三见七杀的七杀格,与同一份报告里 genju_analysis 的 「七杀透干成格」当场矛盾。改用顶层 ten_gods,与 wealth_analyzer 同源。 health_analyzer._analyze_five_elements_health 五行旺弱是一段写死的示例数据(注释原文「示例:水偏弱」),与命盘无关, 全站用户拿到逐字相同的健康分析;水 5 个最旺的命盘同样被判「水偏弱、 肾虚、骨质疏松」。现按原局五行实际计数判定(8 字分 5 行,期望 1.6: 0–1 偏弱 / 2 平衡 / ≥3 偏旺)。'偏旺' 分支本已实现,此前永远走不到。 另加风险聚焦:8 字分 5 行通常有 3–4 行偏离均值,若全部列为风险等于 没有风险。按偏离幅度取前二,其余旺弱状态仍完整保留在明细中。 验证:某命主档案独立记载「五行缺水,且金偏旺」,修复后引擎自主选出的 两项风险恰为水与金;其七杀格亦不再与官职模块矛盾。 test_official_health.py 6 绿,并经两次变异(官职退回读空 key、健康退回 写死示例)分别捕获 2 / 3 条失败。财格测试 6 绿未受影响。 🦊 Generated with Sisi33f4459 -
feat(wealth): 移除终身财富评级,改为身财承载力读法
th_judge_rich_or_poor_pattern 原输出「大富 / 小康 / 贫困(财大压身)」等 终身财富层次,并附「富屋贫人」「平淡一生」「非福即祸」类断语。移除原因: 1. 不可证伪且已被反例推翻——一位家境富裕、自身财运亦佳的命主被判 「贫困(财大压身)· 富屋贫人 · 财重身轻,非福即祸」; 2. 终身评级与本站「阶段校准」定位冲突:用户为「我现在该怎么办」付费, 不是来领终身成绩单; 3. 用户带着对未来的期待而来,「平淡一生」直接掐掉这个期待。 保留结构判断(身财关系),移除从结构跳到终身结论的那一步——原局只说明 当下承载力与财路的相对关系,实际际遇还取决于大运引动。 - 新增 CAPACITY_READINGS / _EN:四种身财关系各配读法与可执行建议 - _judge_rich_or_poor_pattern:输出 capacity_label/reading/advice; rich_level、reasons、duanyu 保留为空位以兼容旧调用方 - _generate_summary_enhanced:不再拼接「财富层次」与「断语」 测试 6 绿,并经两次变异验证(读法写死成常量、终身评级放回 summary) 均被对应测试捕获。 🦊 Generated with Sisibff68c7
-
fix(wealth): 财格识别从常量改为按十神实际分布判定
th_identify_wealth_pattern 此前把 pattern_name 硬编码为 '食伤生财', 导致 9 个完全不同的命盘(含食伤为 0 者)拿到同一个财格。该常量进一步 触发 _judge_rich_or_poor_pattern 的 '食伤生财' 分支覆盖 rich_level, 却不清除前一步的 reasons/duanyu,产生「大富 + 小康之命 + 平淡一生」 同时出现的互斥断语。 - 新增 _count_ten_gods():十神统计单一事实源,供财格与身财关系共用 - 新增 _has_wealth_vault():四库判断,与 _analyze_wealth_storage 同口径 - _identify_wealth_pattern:按比劫/财/官杀/食伤分布与身强弱判定五格, 均不成立时输出「财格不显」,不强行套格 - _judge_rich_or_poor_pattern:格局层结论改为「取代」而非「叠加」, 清除已被取代的理由与断语 - WEALTH_PATTERNS / _EN 各补「财格不显」条目 回归测试 test_wealth_pattern.py:改前 5 红,改后 5 绿。 9 盘实测结果由 1 种财格分化为 5 种,均可按十神逐条核对。 🦊 Generated with Sisibe5fa6a
-
feat: 未来3年流年冲标注 — evidence行+timing流年层,补齐Phase 3规范缺口
th流年支冲日支/月支/当前大运支的确定性检测(如2028戊申冲壬寅运)。 timing追加layer=liunian条目(3年),evidence追加Flow-year clashes行。 另修SHISHEN_LANE缺group名别名的漏洞——genju分析器输出'财星'这类 group名时取向行曾静默丢失仇神赛道(实测小鱼盘仇神='财星')。 🦊 Generated with Sisi9d00589 -
feat: 取向赛道语义(Endowment lanes)进evidence块 — 用神=该走的产出形态,忌神=错误用力方式
th十神→赛道确定性映射(食伤=创造输出/印=平台资历/比劫=协作/官杀=规范管理/ 财=经营交易)。用神行指出命盘的原生赛道;忌神/仇神标记的是错误的用力方式 而非禁区——直接扑向那些领域会耗损,那里的成果是原生赛道的结果不是目标。 golden测试锁定小鱼盘:食神=creation & output,忌正官仇财=WRONG WAY标注。 🦊 Generated with Sisi8000850
-
chore: 标记/analyze-dayun为deprecated — 2026-07-12排查确认全仓库零前端调用
th见 API_UNIFICATION_PLAN.md §6。只加注释,不删代码/不改行为。 🦊 Generated with Sisib6b7e9f -
feat: 四层schema追加(meta/strength/timing/evidence) — /calculate-bazi-complete
th只追加新字段,旧字段一个不改(已验证old_keys全部保留)。 - terms.py:天干/地支/十神/格局双语术语单一真相源,AI报告不用自己现翻译 (避免"七杀格"这次译Seven Killings下次译Qi Sha Ge这类漂移) - evidence.py:build_meta/build_strength/build_timing/build_evidence, 学vedic的formatEvidence模式——结论性事实+括号内数据来源,术语内嵌双语 - /calculate-bazi-complete 内部顺带跑一次GenjuAnalyzer(失败不影响老功能, try/except包住),把格局/用神结论也织进evidence——这填上了一个真实的产品缺口: 四条付费产品线此前只调这个endpoint,从未调用/analyze-genju,等于AI报告里 从没用过真正的格局/用神引擎计算结果,全靠LLM自己现场猜 - timing数组带clash flag(跟日支/月支相冲的大运自动标注,比如小鱼盘癸卯运 冲月支酉这类信号,以前只能人工口算) - 已用小鱼盘验证:pattern=七杀格、用神=食神、当前大运=壬寅(43-52)、 空亡=子丑,全部正确;test_golden_charts.py新增1条,13项全过 🦊 Generated with Sisiadccf05 -
refactor: 大运单一真相源 — 移除life_curve第二套排序与dayun_analyzer独立用神判断
th大运漂移根因1:life_curve_generator.py此前有第二套独立排大运的实现(自判阴阳年+ 手排60甲子),跟bazi_calculator.py的getYun()真实排算可能对同一个人给出不同大运。 修复:generate_dayun_sequence()直接读取bazi_complete['dayun'],删除 _calculate_dayun_direction()回退逻辑;缺dayun/yun_direction时构造函数raise ValueError(不再静默排一套可能错的大运)——调用方ai_interpreter.py已有try/except 会优雅降级成life_curve_data=None,不会崩整个请求。 大运漂移根因2:dayun_analyzer.py此前有第二套独立用神判断(纯靠body_strength套 "身弱用印比/身强用食伤官杀财"通用公式),可能跟genju_analysis的格局法结论 (考虑七杀格该用食伤制杀这类具体规则)不一致。修复:yongshen_elements/ jishen_elements改为从genju_analysis给出的十神结论(用神/喜神/忌神/仇神)机械 映射五行,不再独立推导;新增群组标签(比劫/食伤/财星/官杀/印星)映射覆盖 _find_仇神()的实际返回值。 已用小鱼盘(七杀格,用神食神/忌神正官)验证:yongshen_elements=['fire'], jishen_elements包含metal(正官)+earth(财星仇神),跟genju_analysis结论完全一致。 test_golden_charts.py新增3条回归锁定,全部12项测试通过。 🦊 Generated with Sisifa0cfd6 -
test: golden chart回归基线 — 小鱼盘四柱/通根透干/大运/空亡bug修复锁定数值
th- 四柱、日主、wuxing_strength全字段、大运第5步(壬寅@43岁)、空亡表甲午旬bug修复点 - 藏干原始数字权重(hiddenStems.strength)单独盖一条,因为_calculate_wuxing_strength本身 不消费zhi5的具体数字(只用藏干个数查100/70:30/60:30:10固定权重表),避免有覆盖假象 - 已用故意注入错误值验证测试真的会红(改gan5['乙']验证wood分数塌到0),不是摆设 🦊 Generated with Sisi6899956 -
refactor: 自主实现排盘基础数据层(datas.py) — 移除第三方拷贝代码,修复空亡表甲午旬bug,新增通根透干量化(wuxing_strength)
th- datas.py/ganzhi.py/common.py 此前直接拷贝自 china-testing/bazi(含原作者署名),现改为自主实现 - 十神表(ten_deities)改为按五行生克+阴阳同异规则实时计算,不再是手抄表 - 空亡(empties)改为六十甲子算法计算,顺带修复原表"甲午旬→辰己"的错误(己是天干,应为地支"巳") - 藏干/纳音/神煞表按传统权重重新组织,均为公共古籍常识,非任何单一作者原创表达 - bazi_calculator.py 新增 _calculate_wuxing_strength: 通根透干量化打分(天干40分/藏干70:30或60:30:10加权/月令双计), 帮身占比自定义解读带宽(<35% weak / 35-65% balanced / >65% strong) - 删除未使用的 common.py(死代码,全仓库零引用) - 已验证: test_local/test_dayun_api/test_genju_api 全过,四柱与大运输出与改动前一致 🦊 Generated with Sisic164600
-
fix: 4个预存在业务bug — 28宿/rituals分类/月相KeyError/statistics路由遮蔽
th1. Constellation28Calculator.get_constellation_for_date不存在,真实方法名 是get_constellation,导致/api/28-constellations/today 500 2. rituals_service缺get_categories()方法,导致/rituals 500;新增该方法 (去重排序类别列表) 3. get_current_moon_phase_rituals()返回currentPhase/fullMoonRituals/ newMoonRituals,但日志行引用不存在的result['total']/result['moon_phase'] 导致/rituals/moon-phase/current KeyError 500 4. /rituals/statistics与/rituals/{ritual_id}路径形状相同,FastAPI按注册 顺序匹配,后者先注册导致前者被当成ritual_id吞掉→404;statistics函数 挪到动态路由之前解决,顺带修复其读取stats['total_rituals']应为 stats['totalRituals']的字段名错误 TestClient实测四端点均从500/404变为200 🦊 Generated with Sisi27c005d -
fix: 鉴权fail-closed + 44端点async→def + Dockerfile锁依赖commit
th安全: 移除硬编码默认key fallback(sisi_default_key_change_me)。 API_KEY/SISI_HF_API_KEY均未配置时启动记录error日志,所有受保护 端点返回503拒绝服务,不再接受可猜测的默认key。 性能: 44个async def端点全部改为def(FastAPI线程池)。全文件零await, 纯同步CPU计算跑在async def里会阻塞uvicorn事件循环,单worker下 并发请求互相卡死(与ziwei API同类问题,badbcb4)。 供应链: Dockerfile克隆china-testing/bazi锁定到commit 7150d5b (2026-07-09 HEAD),上游变更/删库不再影响生产构建。 冒烟测试: 未配置key→503(任意key), 错误key→403, 正确key→200 (/api/qimen/now)。语法/导入均过。 🦊 Generated with Sisi76b1cf2
-
✨ Add 八宅法 fengshui calculator + API endpoints
th- fengshui_calculator.py: 完整八宅法引擎(命卦/宅卦/游年变卦/房间建议/命宅兼容性) - app.py: 新增 /api/fengshui/home-analysis, /api/fengshui/ming-gua, /api/fengshui/zhai-gua/{facing} 🦊 Generated with Sisicf8055d
-
fix: upgrade to python 3.12 for divicast compatibility
thdivicast requires Python >=3.12 🦊 Generated with Sisiec38125 -
fix: relax pydantic version constraint for divicast compatibility
thdivicast requires pydantic>=2.13.1, was pinned at ==2.10.3 🦊 Generated with Sisid2e9969 -
refactor(liuyao): simplify calculator and harden API input validation
th- Remove dead WUXING_RELATIONS, inline redundant locals, drop what-comments - Single pass over symbol.lines (was 5 passes); O(1) subject_line lookup - Hoist PURPOSE_FOCUS to module-level constant - Extract _liuyao_response() shared helper; use exc_info=True to drop inline traceback imports - Add field_validator on coins: enforces length==6 and values 0-3 (returns 422 instead of 500) 🦊 Generated with Sisi2178c57 -
feat(liuyao): add Liu Yao divination calculator and API endpoints
thAdd complete 六爻 (Liu Yao) divination engine powered by divicast library with full chart data including 六亲, 六神, 世应, 动爻, 空亡. - New liuyao_calculator.py with 64-hexagram meanings database - POST /api/liuyao/divine (manual or auto coin divination) - GET /api/liuyao/now (current-moment divination) - Add divicast>=0.1.1 to requirements.txt 🦊 Generated with Sisi3889732
-
feat: add Qimen Dunjia (奇门遁甲) chart calculation module
th +1: Claude Opus 4.6 (1M context)- New qimen_calculator.py: complete 时家转盘奇门 engine - Earth/sky plate, nine stars, eight doors, eight gods - Kong wang (旬空), Ma star (驿马), palace fortune analysis - Purpose-specific recommendations (事业/财运/感情/etc) - New endpoints: POST /api/qimen/chart, GET /api/qimen/now - Test suite with 5 test cases all passing 🦊 Generated with Sisi Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>a960618
-
feat(i18n): add English translations to all BaZi analysis modules
th +1: Claude Opus 4.6 (1M context)- career_analyzer: 8 English dictionaries, 10 methods bilingual (701→2099 lines) - wealth_analyzer: 5 English dictionaries, 11 methods bilingual - health_analyzer: 4 English dictionaries, organ/disease/advice translations - marriage_analyzer: spouse star, palace, fortune year, 12 female rules bilingual - interpretation_templates: 10 English template dictionaries + get_templates(lang) - app.py: wire language parameter to all analyzers in /ai-interpretation endpoint All backward-compatible: default language='zh', existing callers unchanged. 🦊 Generated with Sisi Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>74e945d
-
fix: getYun() gender param — bool True was treated as 1(male)
th +1: Claude Opus 4.6 (1M context)lunar-python's getYun() expects int: 0=female, 1=male But we passed is_female=True which Python treats as int(1)=male This caused ALL female users to get male dayun sequences Example: 1981-10-04 female - Before (wrong): 丙申 10岁起运 (male sequence) - After (correct): 戊戌 3岁起运 (female sequence, matches 壬寅 43-52 current) Fix: getYun(0 if is_female else 1) 🦊 Generated with Sisi Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>2e5cbc8
-
feat: add /analyze-marriage-destiny endpoint for Love Clarity product
thNew LoveClarityAnalyzer module with: - Day Blade (日刃格) detection - 6 extreme risk day pillars - Enhanced peach blossom analysis - 5 types with quality grading - Hidden clash (暗克) analysis - marriage palace latent conflicts - Children star (食伤星) analysis - child impact on marriage - 2026 annual impact analysis - 丙午年 marriage influence - Cold reading hooks - 3 emotion-resonance anchors per chart New endpoint: POST /analyze-marriage-destiny Returns comprehensive structured JSON for love-clarity AI prompt consumption 🦊 Generated with Sisif25ebdc
-
feat: implement full English BaZi interpretation generation
th- Add _DAY_MASTER_EN, _ELEMENT_EN, _PATTERN_LEVEL_EN class-level dicts - Add _generate_english_basic_sections() dispatcher - Add 6 English methods: personality, career, wealth, marriage, health, overall - _generate_basic_interpretation() now branches on language='en' - Word count uses split() for English vs len() for Chinese 🦊 Generated with Sisi84bace8
-
🖐️ Add Five Elements body reading API for palm/face free preview hook
th- New body_reading_knowledge.py: Five Elements → hand/face/body/personality/health/career mappings - New body_reading_analyzer.py: Rule engine (BaZi → predicted body features, Barnum hooks) - New endpoint POST /analyze-body-reading: Free preview before paid AI analysis - Reduces cart abandonment by showing free Five Element predictions first 🦊 Generated with Sisica484f2
-
feat(career-monthly-fortune): 实施专业八字流月算法 - 多维度评分模型
th**核心改进** (基于小鱼要求 + 在线研究结果): 1. **刑冲合害检测** (20%权重) - 三刑: 寅巳申/丑戌未/子卯/辰午酉亥自刑 - 六冲: 子午/丑未/寅申/卯酉/辰戌/巳亥 - 六合: 子丑/寅亥/卯戌/辰酉/巳申/午未 - 六害: 子未/卯辰/寅巳/丑午/申亥/酉戌 2. **天干地支组合效应** (15%权重) - 官印相生 → 最吉(+20分) - 食伤生财 → 创业最优(+18分) - 伤官见官 → 最凶(-15分) - 印制食伤 → 求职易找到工作(-8分) - 比劫夺财/官星制比劫/比劫生食伤等 3. **喜用神判断** (40%权重) ⭐ 最核心标准 - 从五行平衡原则提取最弱1-2个五行 - 月干五行=喜用神 → 大幅加分 4. **十神组合分析** (20%权重) - 正官 → 升职机会 - 食伤生财格局 → 创业黄金期 - 伤官见官 → 与上级冲突 5. **职业类型检测** - 从商特征: 食伤旺/偏财旺/食伤生财格局 - 打工特征: 正官旺/财官相生/正星旺 - 差异化建议生成 6. **专业建议生成** 🌟 - 参考案例风格: 具体、可操作、接地气 - 示例: '印制食伤,建议放下心态,先入职再说' - 示例: '寅巳申三刑,会因薪资问题产生波折,谈判时要坚守底线' - 不再使用空泛的'稳步推进即可' **API返回增强**: - 新增字段: career_type, favorable_elements, xing_chong_he_hai - 新增字段: gan_zhi_combos, scoring_breakdown - 评分透明化: 显示5个维度的具体得分 **测试状态**: 等待小鱼验证真实案例输出 🦊 Generated with Sisi5dae498
-
feat(career-api): add /career-monthly-fortune endpoint for Career Forecast product
th✨ New Features: - Added CareerMonthlyFortuneRequest model in app.py - Created /career-monthly-fortune API endpoint - Implemented _analyze_career_monthly_fortune() method - Added _get_ten_god() helper (ten-god calculation from gan) - Added _get_ten_god_from_branch() helper (ten-god from branch via canggan) 🎯 Product Differentiation: - Career-ONLY monthly analysis (not comprehensive fortune) - Separates Career Forecast (.99) from Tianji Oracle - Prevents content duplication for users who buy both products 📊 API Response Format (12 months): - month: YYYY-MM - month_ganzhi: 干支 - career_score: 0-100 - quality_cn: 大吉/顺遂/平稳/谨慎 - opportunities: career opportunities array - risks: career risks array - advice: actionable career advice - ten_god_gan/ten_god_zhi: for debugging 🔬 Technical Implementation: - Ten-god calculation based on 五行生克 (5-element relationships) - Seasonal adjustments (spring = growth, autumn = harvest) - Career scoring logic: 正官/七杀 (+10-15), 食神/伤官 (+8-12), 正财/偏财 (+8-10) …5b38521
-
🔮 Add cold-reading English support to monthly fortune API
thCore Changes: - Add language parameter (zh/en) to MonthlyFortuneRequest - Create apply_cold_reading_english() with Barnum Effect triggers - Add _get_ordinal() helper for proper ordinal formatting (1st, 2nd, 3rd) - 5 score-range templates with psychological triggers - Update endpoint to apply cold-reading when language="en" - Add typing.Any import for proper type hints Features: - Specific dates ("the 3rd", "between 8th and 15th") - "You" language ("you've been", "your instincts") - Emotional triggers ("that sinking feeling", "keeps you up at 3am") - Universal specifics ("the conversation you're avoiding") - Time anchors ("before the 8th", "around mid-month") Testing: - Comprehensive test suite (test_cold_reading.py) - Barnum Effect verification - Score range testing - Backward compatibility verified Documentation: - COLD_READING_EXAMPLES.md (examples and comparison) - COLD_READING_IMPLEMENTATION.md (deployment guide) - IMPLEMENTATION_SUMMARY.md (quick reference) Business Impact: - …1b52ac7
-
feat(scoring): professional BaZi scoring based on 滴天髓 principles
th📚 Based on classical BaZi texts (滴天髓, 盲派命理): 1. Weight order: 冲 > 三合 > 六合 > 刑 > 害 - "支神只以冲为重,刑与穿兮动不动" 2. 用神喜忌 integration: - 冲到忌神 = 吉 (冲去凶神转祸为福) - 冲到用神 = 大凶 (冲破用神) - 合住忌神 = 凶 (凶神得势) - 三合忌神局 = 凶 3. 三刑 only counts when complete (3+ branches) - "半刑不要太在意,只有三刑全才计" 4. Adjusted weights per pillar importance: 日柱(25) > 月柱(22) > 年柱(18) > 时柱(15) Sources: - 《滴天髓》 - 盲派刑冲合害应用 (知乎) - 百度百科:冲合刑害 🦊 Generated with Sisi893ce1b -
fix(scoring): check 流月 vs all 4 pillars, not just 流年
thBREAKING: Monthly fortune scores now correctly reflect relationships Changes: - Add ZHI_HAI (六害) relationship table - Add SAN_HE_GROUPS for three harmony detection - New _analyze_liuyue_vs_mingju() checks 流月 vs 年月日时 four pillars - Weighted scoring: 日柱(-20/+15) > 月柱(-15/+12) > 年柱(-12/+10) > 时柱(-10/+8) - Return detailed pillar_relationships for frontend display Before: 9月 has 4 negative relations but scored 64 (wrong) After: Score properly reflects 冲刑害合 with all pillars 🦊 Generated with Sisi63b5f03 -
feat(api): Add /api/yearly-fortune endpoint for 12-month complete forecast
th- New YearlyFortuneRequest model with language support - Returns all 12 months in single API call (reduces frontend complexity) - Includes yearly_overview with avg_score, best/worst months - BaZi calculated once and reused for all months (performance optimization) - Supports both Chinese and English output - Powers Tianji Oracle Premium ($19.99) 🦊 Generated with Sisib0bd2b7
-
Fix Dockerfile to copy data directory for rituals database
th +1: Claude Sonnet 4.5- Add COPY data/ ./data/ to include rituals JSON files - Fixes 'Rituals database not found' error in HuggingFace Space 🦊 Generated with Sisi Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>b590cea -
Fix rituals database path resolution for HuggingFace Space deployment
th +1: Claude Sonnet 4.5- Add multiple path fallback options - Improve error messages with debugging info - Support both local dev and HuggingFace Space paths 🦊 Generated with Sisi Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>df2231e