fix(rectification): score family events and allow appearance follow-up
Independent Staging Quality Gate / validate (push) Successful in 10m19s
Independent Staging Quality Gate / publish (push) Successful in 8m7s

Dated family evidence now moves candidates via D12 and kin houses, career receipts expose both D1-10 and D10, and appearance/marks may be asked as auxiliary first-house scores. New cases bind Skill 10.0.4.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Jesse_Chen
2026-08-20 08:35:46 +08:00
parent a3196584d2
commit b1b4f5fac9
41 changed files with 1159 additions and 79 deletions
+13 -2
View File
@@ -53,7 +53,15 @@ DOMAIN_CONFIG: Final[dict[EventDomain, DomainConfig]] = {
"career": (("D10",), (10,)),
"finance": (("D2", "D11"), (2, 11)),
"health_pressure": (("D30",), (6, 8, 12)),
# 六亲: D12 parents plus D1 houses 3/4/5/9 (siblings, mother/home, children, father).
"family": (("D12",), (3, 4, 5, 9)),
# Dated appearance/marks: D1 lagna / 1st house only. Not a primary formula.
"appearance": ((), (1,)),
}
AUXILIARY_DOMAINS: Final[frozenset[str]] = frozenset({"appearance"})
AUXILIARY_SCORE_FACTOR: Final = 0.4
class RectificationEventCalculationError(RuntimeError):
"""Raised when stored rectification evidence cannot be calculated safely."""
@@ -235,6 +243,9 @@ def _score_event(
points += 0.35
event_kind = event.get("event_kind", event["domain"])
if event["domain"] in AUXILIARY_DOMAINS:
points *= AUXILIARY_SCORE_FACTOR
rules.append("appearance_auxiliary_not_primary")
if not rules:
rules.append("no_domain_activation")
rules.append(f"event_kind:{event_kind}")
@@ -358,12 +369,12 @@ def build_candidate_static_context(
charts = varga.calc_all_vargas(
planet_longitudes,
ascendant_longitude,
divisions=[2, 4, 9, 10, 24, 30],
divisions=[2, 4, 9, 10, 12, 24, 30],
)
d11_chart = _d11_chart(planet_longitudes, ascendant_longitude)
varga_charts = {
prefix: d11_chart if prefix == "D11" else _varga_chart(charts, prefix)
for prefix in ("D2", "D4", "D9", "D10", "D11", "D24", "D30")
for prefix in ("D2", "D4", "D9", "D10", "D11", "D12", "D24", "D30")
}
available_layers = ["D1"]
blocked_layers = ["KP_cusps"]