fix(rectification): split D4/D5 stages and recast after adopt
Independent Staging Quality Gate / validate (push) Successful in 9m19s
Independent Staging Quality Gate / publish (push) Failing after 7m45s

Keep family on D12+D7 instead of mixing it into D4, score D5 on education, and show a natal recast plus technique audit after adopt without unique-minute claims.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Jesse_Chen
2026-08-20 09:11:54 +08:00
parent b1b4f5fac9
commit a93a3cc1a9
40 changed files with 1195 additions and 66 deletions
+22 -5
View File
@@ -113,11 +113,19 @@ def _split_track_points(rule_ids: Sequence[str], points: float) -> tuple[float,
return points * vim / total, points * narayana / total
_LAYER_LABEL = {"d1": "本命上升", "d9": "D9", "d10": "D10", "d4": "D4", "d12": "D12"}
_LAYER_LABEL = {
"d1": "本命上升",
"d9": "D9",
"d10": "D10",
"d4": "D4",
"d5": "D5",
"d7": "D7",
"d12": "D12",
}
def window_scan(built: dict[str, Any]) -> dict[str, Any]:
"""D1/D9/D10/D4 diversity plus change minutes. Indices only; never sign names."""
"""D1/D9/D10/D4/D5/D7/D12 diversity plus change minutes. Indices only; never sign names."""
counts: dict[str, set[int]] = {layer: set() for layer in _LAYER_LABEL}
transitions: list[dict[str, Any]] = []
previous: dict[str, int | None] | None = None
@@ -128,6 +136,8 @@ def window_scan(built: dict[str, Any]) -> dict[str, Any]:
"d9": vargas.get("D9") if isinstance(vargas.get("D9"), int) else None,
"d10": vargas.get("D10") if isinstance(vargas.get("D10"), int) else None,
"d4": vargas.get("D4") if isinstance(vargas.get("D4"), int) else None,
"d5": vargas.get("D5") if isinstance(vargas.get("D5"), int) else None,
"d7": vargas.get("D7") if isinstance(vargas.get("D7"), int) else None,
"d12": vargas.get("D12") if isinstance(vargas.get("D12"), int) else None,
}
for layer, bucket in counts.items():
@@ -154,11 +164,15 @@ def window_scan(built: dict[str, Any]) -> dict[str, Any]:
"d9_lagna_count": len(counts["d9"]),
"d10_lagna_count": len(counts["d10"]),
"d4_lagna_count": len(counts["d4"]),
"d5_lagna_count": len(counts["d5"]),
"d7_lagna_count": len(counts["d7"]),
"d12_lagna_count": len(counts["d12"]),
"d1_candidates_differ": len(counts["d1"]) > 1,
"d9_candidates_differ": len(counts["d9"]) > 1,
"d10_candidates_differ": len(counts["d10"]) > 1,
"d4_candidates_differ": len(counts["d4"]) > 1,
"d5_candidates_differ": len(counts["d5"]) > 1,
"d7_candidates_differ": len(counts["d7"]) > 1,
"d12_candidates_differ": len(counts["d12"]) > 1,
"transitions": transitions,
}
@@ -360,14 +374,17 @@ def precision_stage(scan: dict[str, Any], event_count: int) -> dict[str, Any]:
current = "d10_refine"
meaning = "关系盘已较稳,事业盘仍会换升。可再补一件记得时间的工作变化。"
elif scan.get("d4_candidates_differ"):
current = "theme_refine"
meaning = "核心分盘已较稳。若还想收窄,可再补一件记得时间的家或住处变化;也可以先采用代表性时间"
current = "d4_refine"
meaning = "事业盘已较稳,居所盘仍会换升。可再补一件记得时间的家或住处变化。"
elif scan.get("d5_candidates_differ"):
current = "d5_refine"
meaning = "居所盘已较稳,成就盘仍会换升。可再补一件记得时间的学业、考试或被委以责任的变化;不要贴类型标签。"
else:
current = "ready_to_adopt"
meaning = "核心分盘已不再换升。可以采用代表性时间看盘,也可以再补主题经历。"
return {
"current": current,
"can_stop": current in {"d9_refine", "d10_refine", "theme_refine", "ready_to_adopt"},
"can_stop": current in {"d9_refine", "d10_refine", "d4_refine", "d5_refine", "theme_refine", "ready_to_adopt"},
"user_meaning": meaning,
"unique_minute_claim": False,
}