fix(yoga): Neecha Bhanga lists the conditions that hold, never Raja Yoga (T8, BUG-1205)

Astrologer ruling 乙14. One condition source, yogas_doshas.calc_nicha_bhanga_raj_yoga
(conditions A-F, now also structured). New scripts/main_yoga_detectors.py turns it
into yoga_engine-shaped rows (zh + en twins) that YogaEngine.detect appends; the
four neechabhanga_* rules are reference_only (kept, renamed, not evaluated).
Card: traditional_yogas canonical 落陷取消(Neecha Bhanga) with 成立条件; compact
yoga entries keep conditions/reductions. Report: category 落陷取消, mixed group,
not raja; personal-report alias neecha_bhanga -> special.

Changed assertion (test_consultation_yoga_detection_merge): canonical name
'Neecha Bhanga Raja Yoga' -> '落陷取消(Neecha Bhanga)' (ruling 乙14).

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01N4f2nya58RoRu4yEmJgRGE
This commit is contained in:
Jesse_Chen
2026-10-03 11:38:52 +08:00
co-authored by Claude Opus 5.5
parent 0cf2249e6b
commit df21e591e8
10 changed files with 342 additions and 26 deletions
@@ -1163,7 +1163,9 @@ function safeDomainLabel(value: unknown): string | null {
}
const YOGA_CATEGORY_ALIASES: Readonly<Record<string, ReportYogaCategory>> = {
raja: "raja", raja_yoga: "raja", neecha_bhanga: "raja",
raja: "raja", raja_yoga: "raja",
// BUG-1205 (乙14): a Neecha Bhanga lists its conditions and is not a raja yoga.
neecha_bhanga: "special",
dhana: "dhana", dhana_yoga: "dhana", wealth: "dhana",
mahapurusha: "mahapurusha", pancha_mahapurusha: "mahapurusha",
nabhasa: "nabhasa",