fix(transit): double-transit rows in a stable order; cross-layer tests follow the aspect fix (BUG-1185)

With the aspect count from 1 (42d1582f) the public charts get same-layer
overlaps for the first time, and the overlap / cross-layer loops iterated
Python sets, so the double_transit list order changed with PYTHONHASHSEED
(the D1/CL golden failed under seeds 1 and 2). The loops now iterate sorted
names; the golden is recaptured and passes under seeds 0/1/2/5.
tests/test_double_transit_cross_layer_pairing.py: three expectations updated
with original / new / reason (Jobs house-7 summary now leads with the D1
layer; the ninth-house non-pairing example moves to Jobs house 9; the
same-house set is recomputed).

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-02 14:29:28 +08:00
co-authored by Claude Opus 5.5
parent 0176cb3008
commit db5a0509da
3 changed files with 44 additions and 26 deletions
+8 -7
View File
@@ -13306,7 +13306,8 @@ def cmd_double_transit_pac(args):
# D1 层 overlap
d1_overlap = jup_d1 & sat_d1
for t in d1_overlap:
# 按名字排序:集合遍历顺序随 PYTHONHASHSEED 变,结果列表不得随之变(BUG-1185)。
for t in sorted(d1_overlap):
results['double_transit'].append({
'layer': 'D1', 'target': t,
'jupiter_pac': results['d1']['jupiter'][t],
@@ -13316,7 +13317,7 @@ def cmd_double_transit_pac(args):
# D9 层 overlap
d9_overlap = jup_d9 & sat_d9
for t in d9_overlap:
for t in sorted(d9_overlap):
results['double_transit'].append({
'layer': 'D9', 'target': t,
'jupiter_pac': results['d9']['jupiter'][t],
@@ -13326,7 +13327,7 @@ def cmd_double_transit_pac(args):
# Chandra Lagna 层 overlap
cl_overlap = jup_cl & sat_cl
for t in cl_overlap:
for t in sorted(cl_overlap):
results['double_transit'].append({
'layer': 'CL', 'target': t,
'jupiter_pac': results['cl']['jupiter'][t],
@@ -13341,8 +13342,8 @@ def cmd_double_transit_pac(args):
for name, rows in target_meta['D1'].items()}
d9_ids = {name: _double_transit_target_identities(rows, event_house, event_lord)
for name, rows in target_meta['D9'].items()}
for d1t in jup_d1:
for d9t in sat_d9:
for d1t in sorted(jup_d1):
for d9t in sorted(sat_d9):
if d1_ids[d1t] & d9_ids[d9t]:
results['double_transit'].append({
'layer': 'D1+D9', 'target': f'Jupiter(D1){d1t} + Saturn(D9){d9t}',
@@ -13350,8 +13351,8 @@ def cmd_double_transit_pac(args):
'saturn_pac': results['d9']['saturn'][d9t],
'strength': 'moderate',
})
for d1t in sat_d1:
for d9t in jup_d9:
for d1t in sorted(sat_d1):
for d9t in sorted(jup_d9):
if d1_ids[d1t] & d9_ids[d9t]:
results['double_transit'].append({
'layer': 'D1+D9', 'target': f'Saturn(D1){d1t} + Jupiter(D9){d9t}',