Commit Graph
3720 Commits
Author SHA1 Message Date
ClaudeandClaude Opus 5.5 1ce4eec53c fix(rectification): bump scoring identity to scoring-14 for the #166 rulings (BUG-1583..1588)
78f98eba changes the same-input rectification scores: Shadbala Sthana and Drik
feed the Shadbala auxiliary (BPHS Saptavargaja values, Moolatrikona 3 / 15 deg,
whole-sign Kendradi, BPHS 26 special aspects, Mercury with any malefic) and
jaimini.calc_arudha_padas feeds the event engine and feature facts. Per
BUG-1181 the algorithm identity moves rectification-v5-matrix-scoring-13 ->
-14. Policy v4, input contract v5 and the dated window contract (generation
>= 9) are unchanged; the SQL guard accepts scoring-(9|[1-9][0-9]+), so no
migration.

- Memoization golden v7 written by write_golden (source_commit 78f98eba); v6
  stays byte-identical and is pinned by sha256. For this public request the
  candidate scores are unchanged (12:00 8.5336, 12:01 8.5242, 12:02 8.088);
  the Shadbala fingerprints, feature hash and candidate UUID moved.
- New scoring-14 cross-midnight golden from midnight_date_anchor_regression.py
  --golden (baseline = this tree; independent-process A/B 3 x 7 fields equal);
  scoring-13 golden kept as history and opens read-only with recompare.
- Dated-transitions scan unchanged (test passes without regeneration).
- v9EngineVersion() default and the identity tests follow.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyn7Hj3LCW3BUs5bZ8
2026-11-04 21:10:43 +08:00
ClaudeandClaude Opus 5.5 78f98eba93 fix(engine): apply the #166 astrologer rulings to Shadbala, Arudha and D30 (BUG-1581..1589, BUG-1575)
Astrologer ruling 2026-11-04 on #166; product decision the same day (Moon
option C, rulings implemented as given). The default is a named BPHS version;
the pre-#166 precise Sthana / Drik is kept byte-for-byte as variant
"raman_gbb" (Raman, Graha and Bhava Balas Ex. 13 / 55 still pass on it).

- Q3 (BUG-1581): the Moon's own Paksha is P on both sides (Sanskrit 27.11 lists
  indu), Chesta = Paksha, total 2P. Drik still classifies a waning Moon as a
  malefic (Q26), classify_drik_planets unchanged for the Moon.
- Q2 (BUG-1582): the Sun's Ayana is not doubled; Chesta = base Ayana; A + A.
  On the VP Jain fixture Kala + Chesta = 46.73 + 35.07 = published 81.80 + 0.
- Q18 (BUG-1583, BUG-1575): Moolatrikona Moon Taurus from 3 deg, Mercury Virgo
  from 15 deg, in shadbala.py and jyotish_engine.MOOLATRIKONA.
- Q16 / Q20 (BUG-1584): Saptavargaja 45/30/20/15/10/4/2, compound relation from D1.
- Q25 (BUG-1585): Mercury is a natural malefic with any natural malefic in its
  sign (nodes not counted, recorded as an implementation choice).
- Q24 (BUG-1586): BPHS 26.9-12 piecewise special aspects replace the general
  segment for Saturn, Mars and Jupiter; a single aspect stays within 0-60.
- Q21 (BUG-1587): Kendradi Bala by whole sign from the Lagna sign.
- Q27 (BUG-1588): jaimini.calc_arudha_pada_for_house takes the 10th from the
  first-count pada (pada in the 7th -> 4th from the house), as special_lagnas did.
- Q30 (BUG-1589): D30 degree inside the sign is proportional within the
  unequal span in varga.py; divisional_charts_extended uses exact 30/7.
- method_variants names every convention. Q22 edges and the Q24 60 cap are
  locked in tests/test_astrologer_rulings_166.py (42 tests).

Raman / PyJHora comparison tests now run on "raman_gbb"; the VP Jain report
labels the new convention rows; chart-insight-golden.json's planets-only
Shadbala section regenerated from /api/shadbala. Rectification identity,
golden and re-freeze follow in separate commits.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyn7Hj3LCW3BUs5bZ8
2026-11-04 21:08:32 +08:00
ClaudeandClaude Opus 5.5 6491388e9c docs(research): keep the 2026-11-04 data-audit reports and the 31 astrologer questions (#166)
The question list and the wave-2 audit reports lived only in a session
scratchpad; Gitea #166 points at them. Public charts only, no user data.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyeZrYn6ryNcSe5Y2Y
2026-11-04 19:42:46 +08:00
ClaudeandClaude Opus 5.5 71d38b0d67 chore(rectification): re-freeze sealed holdout and offset sweep for D30 and Venus roles at scoring-13 (ERR-110, BUG-1560, BUG-1570)
Independent Staging Quality Gate / validate-python (push) Successful in 7m24s
Independent Staging Quality Gate / validate-frontend (push) Successful in 7m25s
Independent Staging Quality Gate / publish (push) Successful in 2m59s
FREEZE / REPORT constants first, --freeze, then replay: d30_venus_2026_11_04.
Contract rotated with previous = audit_wave2_2026_11_04 (kept byte-for-byte);
freshness test and frontend confirmation-gate test updated.

Versus audit_wave2_2026_11_04 (product accepted these costs 2026-11-04, no
tuning):
- sealed 20: 17 identical / 3 changed (case 5 rank 1 -> 3, case 18 12 -> 10,
  case 14 reasons only); top_1 0.50 -> 0.45, MAE 6.65 -> 7.05; top_3 0.50 and
  coverage 0 unchanged. All from the D30 table.
- reported offset 900: 650 identical / 250 changed; top-1 hits at
  +-15/30/60 14/17/15 -> 4/3/0 of 300 (all from Venus roles); top-3 and
  delivery coverage unchanged at every radius; mean minute error
  19.79 -> 19.51 (from D30).
Attribution from single-fix replays on git-archive copies: D30 alone 3 sealed
/ 166 offset trials, Venus alone 0 / 108; they overlap only in case 20.

BUG-1560 and BUG-1570 resolved; ledger and CHANGELOG lines added.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyeZrYn6ryNcSe5Y2Y
2026-11-04 17:46:58 +08:00
ClaudeandClaude Opus 5.5 9fd3fcd5ba fix(rectification): bump scoring identity to scoring-13 for BPHS D30 and Venus roles (BUG-1560, BUG-1570)
18c685c4 changes the same-input rectification scores (varga.py even-sign D30
feeds health_pressure and feature facts v4; functional roles feed the
*_functional_*_auxiliary rules), so per BUG-1181 the algorithm identity moves
rectification-v5-matrix-scoring-12 -> -13. Policy v4, input contract v5 and
the dated window contract (generation >= 9) are unchanged; the SQL guard
already accepts scoring-13, so no migration.

- Memoization golden v6 written by write_golden (source_commit 18c685c4);
  v5 stays byte-identical and is pinned by sha256. For this public request
  the candidate scores are unchanged; the D30 feature (Capricorn -> Pisces),
  its transition row and the feature hashes moved.
- frontend/tests/fixtures/rectification-dated-transitions.native.json: scan
  regenerated from the real engine (D30 segment start Capricorn -> Pisces),
  CRLF kept.
- New scoring-13 cross-midnight golden from midnight_date_anchor_regression.py
  --golden (independent-process A/B 3 x 7 fields equal); scoring-12 golden kept
  as history and opens read-only with recompare under scoring-13.
- v9EngineVersion() default and the identity tests follow.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyeZrYn6ryNcSe5Y2Y
2026-11-04 17:36:13 +08:00
ClaudeandClaude Opus 5.5 18c685c428 fix(engine): even-sign D30 per BPHS ch. 6 and Venus malefic for Aries / Scorpio per BPHS 34 (BUG-1560, BUG-1570)
Product decision 2026-11-04: the calculation follows the sources even though
rectification scores move.

- scripts/varga.py: even-sign Trimsamsa 12-20 Pisces, 20-25 Capricorn,
  25-30 Scorpio (was Capricorn / Scorpio / Pisces). KNOWN DEFECT comment
  removed; the strict xfail in tests/test_varga_bphs_starts_audit_g.py is now
  an ordinary test and the 0.1-degree BPHS sweep covers varga.py on all signs.
- scripts/functional_benefics.py: ROLE_OVERRIDES adds Venus = malefic for
  Aries (BPHS 34.20) and Scorpio (34.35); profile doc lists both cells.

Both feed rectification scoring; the scoring-13 identity bump, memoization
golden v6 and the ERR-110 re-freeze follow in the next commits.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyeZrYn6ryNcSe5Y2Y
2026-11-04 17:33:26 +08:00
ClaudeandClaude Opus 5.5 607a48b6c3 chore(rectification): re-freeze sealed holdout and offset sweep once for the merged audit wave 2 (ERR-110)
Independent Staging Quality Gate / validate-frontend (push) Successful in 6m27s
Independent Staging Quality Gate / validate-python (push) Successful in 6m34s
Independent Staging Quality Gate / publish (push) Successful in 3m1s
G (BUG-1560/1561: varga.py, divisional_charts_extended.py), H (BUG-1566/1567:
jaimini.py) and J (BUG-1270/1576: shadbala.py) each changed frozen identity
files and each froze its own audit_g / audit_h / audit_j record, which only
matches that branch's tree. Per ERR-110 the merged tree is frozen once as
audit_wave2_2026_11_04 (FREEZE/REPORT constants first, --freeze, then replay).
The contract now points at audit_wave2 with moon_paksha_2026_11_04 as the
previous record; the per-branch records are kept byte-for-byte and named as
intermediate in the superseded_reason notes. Freshness test and frontend gate
test updated.

Compared field by field with moon_paksha_2026_11_04: sealed holdout 20/20
trials identical, metrics unchanged; reported offset 900/900 identical,
summary unchanged; changed_trial_count vs 2026-09-20 stays 8 / 581.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyeZrYn6ryNcSe5Y2Y
2026-11-04 17:24:31 +08:00
ClaudeandClaude Opus 5.5 1cdd9c827c merge: data audit wave 2 J (Dig Bala arc fold BUG-1270, deterministic Drik BUG-1576, BUG-1575 logged)
Freeze contract, FREEZE/REPORT constants and gate tests keep the G state
here; the merged tree is re-frozen once as audit_wave2_2026_11_04 next.
J's audit_j records are kept byte-for-byte as history.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyeZrYn6ryNcSe5Y2Y
2026-11-04 17:05:52 +08:00
ClaudeandClaude Opus 5.5 728b077d44 merge: data audit wave 2 I (yoga rules and Parivartana Raja Yoga, BUG-1570..1573)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyeZrYn6ryNcSe5Y2Y
2026-11-04 17:05:37 +08:00
ClaudeandClaude Opus 5.5 359504a9df merge: data audit wave 2 H (Chara co-lord/antardasha, gulika night, natal vara, BUG-1565..1569)
Freeze contract, FREEZE/REPORT constants and gate tests keep the G state
here; the merged tree is re-frozen once as audit_wave2_2026_11_04 at the end.
H's audit_h records are kept byte-for-byte as history.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyeZrYn6ryNcSe5Y2Y
2026-11-04 17:05:15 +08:00
ClaudeandClaude Opus 5.5 e773655600 merge: data audit wave 2 G (varga BPHS starts, BUG-1560..1562)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyeZrYn6ryNcSe5Y2Y
2026-11-04 17:04:26 +08:00
ClaudeandClaude Opus 5.5 895a75a2ed chore(rectification): re-freeze sealed holdout and offset sweep for the varga fixes (ERR-110)
BUG-1560 / BUG-1561 changed scripts/varga.py and
scripts/divisional_charts_extended.py, both in the frozen scoring identity.
Per ERR-110 new records were created with each script's --freeze and
replayed as audit_g_2026_11_04; scripts, contract, freshness test and the
frontend gate test point at them. Prior records are kept byte-for-byte.

Compared field by field with moon_paksha_2026_11_04: sealed holdout 20/20
trials identical, metrics unchanged; reported offset 900/900 identical,
summary unchanged; changed_trial_count vs 2026-09-20 stays 8 / 581.
(The D16/D20/D27/D45 and extended-module charts are not read by scoring.)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyeZrYn6ryNcSe5Y2Y
2026-11-04 17:02:53 +08:00
ClaudeandClaude Opus 5.5 ba27b0e758 fix(varga): D16/D20/D27/D45 starts and the chart-page D30/D40 follow BPHS ch. 6 (BUG-1560..1562)
Data audit wave 2 (G): 19 fixed charts, Raman and Lahiri, mean nodes, both
engines set explicitly. Against PyJHora method 1 ("traditional Parasara") on
the same longitudes, varga.py matched D16/D20 26%, D27 25%, D45 14%, and
divisional_charts_extended (chart page, consultation varga spectrum) matched
D16/D20 7%, D27 14%, D40/D45 25%, D30 50%. jyotishganit agrees with PyJHora
190/190 on every one of these, and both follow BPHS ch. 6.

- varga.varga_map: D16/D45 movable/fixed/dual from Aries/Leo/Sagittarius,
  D20 from Aries/Sagittarius/Leo, D27 fiery/earthy/airy/watery from
  Aries/Cancer/Libra/Capricorn (were odd/even starts). BUG-1560.
- divisional_charts_extended: D16/D20/D27/D40/D45 signs now read varga_map;
  D30 uses the BPHS signs (odd 25-30 Libra; even Taurus, Virgo, Pisces,
  Capricorn, Scorpio). BUG-1561.
- trimshamsa_d30: even-sign table copied from jyotishganit swapped Jupiter
  and Saturn; now 12-20 Pisces, 20-25 Capricorn, 25-30 Scorpio. BUG-1562.
- shodasavarga guide: D4/D10/D24/D27/D30/D40 rule text corrected.

Held back: varga.py even-sign D30 has the same defect, but it feeds
rectification scoring. Fixing it moved the sealed holdout (top-1 0.50 to
0.45) and 166/900 offset trials and turned the memoization goldens red,
which per BUG-1260/1275 means a scoring-13 identity: a product decision.
It carries a KNOWN DEFECT comment and a strict xfail test.

After: same-longitude agreement with PyJHora is 190/190 for D3-D60 in
divisional_charts_extended and for every varga.py chart except D30.
D9/D10/D12, karakas and Arudha are unchanged; the evidence card check
(27 cards, 765 fields) shows 0 differences before and after.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyeZrYn6ryNcSe5Y2Y
2026-11-04 17:02:53 +08:00
ClaudeandClaude Opus 5.5 a4b5985200 fix(benchmark): pass the ayanamsa to the Arudha and Chara Dasha compares
run_arudha_compare.py and run_chara_dasha_compare.py still set PyJHora to
Lahiri while the engine default is Raman (pre_work_error_ledger 2026-11-04).
Both now take --ayanamsa / --node-mode, set both on PyJHora, and refuse a
local baseline built with other settings (baseline_settings_error, as in
run_pyjhora_compare.py). run_chara_dasha_compare.py imported jaimini from
benchmarks/scripts (parents[2]); it now uses the repo scripts/.

Raman rerun on the 19 fixed samples: A10 vs independent formula 114/114
fields, vs PyJHora 18/19 (one Scorpio/Aquarius co-lord case); Chara Dasha
KN Rao sign sequence 228/228, durations 212/228.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyeZrYn6ryNcSe5Y2Y
2026-11-04 17:02:37 +08:00
ClaudeandClaude Opus 5.5 d4cde02e6f fix(shadbala): fold the Dig Bala arc (BUG-1270) and make Drik Bala deterministic (BUG-1576)
Dig Bala took |powerless point - planet| / 3 without folding arcs above
180 degrees, so 35 of 140 values on the 19 benchmark charts plus Steve Jobs
exceeded the 60 Virupa maximum (up to 98.98). BPHS 27.7 ("hitva
shadbhadhike sati"; Santhanam: "If the sum is above 180 degrees, deduct the
sum from 360") and Raman, Graha and Bhava Balas section 44-45, Ex. 14-15
(Kuja arc 167 05, Digbala 55.70) both fold. PyJHora's default _dig_bala has
the same unfolded formula, which is why the comparison always "matched";
its own _dig_bala_another, VedAstro source, jyotishganit and saravali fold.
After the fix all 140 values equal PyJHora _dig_bala_another.

Drik Bala summed the aspecting planets in set order. Each Sphuta value is
already rounded to 0.01, so the quarter often sits on a .xx5 edge and the
result moved by 0.01 with PYTHONHASHSEED. Sum whole hundredths in sorted
order and round the quarter half away from zero; 14 of 140 values move by
0.01. Formulas, tables and benefic/malefic classification are unchanged.

New tests lock Raman's Standard Horoscope Ex. 13 (Sthana), Ex. 15 (Dig)
and Ex. 55 (Drik), the fold bounds, and seed-independent Drik. Updated
expectations: test_shadbala_precise_context (PyJHora default Dig carried
the bug) and the Jobs Moon total in test_shadbala_moon_paksha_convention.

shadbala.py is in the rectification frozen identity, so per ERR-110 both
fixes were frozen and replayed once as audit_j_2026_11_04. Compared field
by field with moon_paksha_2026_11_04: sealed holdout 20/20 and reported
offset 900/900 identical, metrics and summary unchanged.

Also records BUG-1575 (jyotish_engine MOOLATRIKONA gives the Moon Taurus
0-3; investigating, not changed).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyeZrYn6ryNcSe5Y2Y
2026-11-04 16:57:16 +08:00
ClaudeandClaude Opus 5.5 5f234c315b fix(jyotish): Chara co-lord and antardasha, night time-segment points, pre-sunrise weekday; re-freeze as audit_h (BUG-1565..1568)
Data audit wave 2 (H) against PyJHora 4.8.6 and Swiss Ephemeris, 19 charts,
Raman and Lahiri passed explicitly to both sides.

- BUG-1566 (jaimini.py): the K.N. Rao Chara Scorpio / Aquarius lord read both
  co-lords' dignity in the dasha sign itself, so Scorpio was always Ketu and
  Aquarius always Saturn. Now one lord in the sign gives way to the other
  (K.N. Rao; Rath p.43 (c); PyJHora); otherwise compared where each stands
  (companions, Jupiter / Mercury / dispositor, dignity, modality, degrees).
  MD years vs PyJHora 212/228 -> 225/228 (Raman), 226/228 (Lahiri).
- BUG-1567 (jaimini.py): K.N. Rao antardashas now run each MD's own
  direction with the MD sign last (pp.35-36); book order 19/228 -> 228/228.
- BUG-1565 (gulika.py): Wednesday-Saturday night share table started one lord
  early; Maandi and the four other time-segment points 79/114 -> 114/114
  against an independent Swiss computation. Gulika unchanged (19/19).
- BUG-1568 (jyotish_engine.py): natal Panchanga vara / hora used the civil
  date; a birth before sunrise belongs to the previous weekday (15/19 -> 19/19
  vs PyJHora drik.vaara).

Narayana (legacy and Rath), transits, sunrise and day/night: no defect; the
second-cycle rule matches PyJHora's. Variants are listed in BUG_HISTORY.

jaimini.py is in the frozen identity: per ERR-110, new records frozen and
replayed as audit_h_2026_11_04; contract, freshness test and frontend gate
test rotated. Versus moon_paksha_2026_11_04: sealed 20/20 and reported offset
900/900 identical, metrics and summary unchanged. Chara sections of two
frontend fixtures and the rashi-dasha PyJHora fixture's native rows updated.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyeZrYn6ryNcSe5Y2Y
2026-11-04 16:53:31 +08:00
ClaudeandClaude Opus 5.5 e17098248f fix(benchmark): pass the ayanamsa to both sides in the Chara, transit and node-mode compares (BUG-1569)
Same failure as 74169e1b: run_chara_dasha_compare, run_chara_dasha_knrao,
run_transit_true_compare and run_node_mode_compare hard-coded Lahiri on the
PyJHora / Swiss side while the engine default is Raman, or never checked the
canonical baseline's ayanamsa. Each now takes --ayanamsa (the Chara ones also
--node-mode), passes it to both sides, and refuses a baseline or engine
output built differently. The Chara and transit compares pointed at a
non-existent benchmarks/scripts/ path; fixed. run_skill_baseline.py main
gained --ayanamsa / --node-mode.

Raman rerun (19 charts): Chara MD signs 228/228, years 225/228; K.N. Rao on
shared positions 117/120; transit 646/646; Swiss mean node 152/152.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyeZrYn6ryNcSe5Y2Y
2026-11-04 16:53:31 +08:00
ClaudeandClaude Opus 5.5 5a112bf5f5 fix(yoga): revive nine custom rules and Raja Yoga (Parivartana) (BUG-1571, BUG-1572)
Data audit wave 2 (I). 04d901e1 (2026-06-27) renamed the evaluator's
pyjhora_* helpers to external_benchmark_* but left the rule expressions
calling the old names; the NameError is swallowed, so nine rules (Matru
Sneha on the parents card, Bhratruvriddhi, Amala, Sumukha, Bandhu Pujya,
Kaalanirdesat Puthranaasa, ...) never formed. The rule library now calls
the current names; logic is unchanged. Against PyJHora (Raman, mean nodes,
19 samples) the revived rules agree 18-19/19; the 20 Raman packet rules
go from 302/380 to 327/380.

_eval_parivartana resolved "$a" / "$b" with ctx.resolve, which knows no
any_pair bindings, so raja_yoga_parivartana (kendra lord <-> trikona lord
exchange, BPHS 34.11) never fired. Bare "$x" refs now go through
_resolve_binding.

New test scans every custom expression for names the evaluator does not
define (only parvata_yoga, non-classical and left off, is excepted).
Neither file is in the rectification frozen identity; sealed 20/20 and
reported-offset 900/900 replay identical to moon_paksha_2026_11_04.

BUG-1570 (Aries / Scorpio Venus malefic by BPHS 34.20 / 34.35) and
BUG-1573 (packet members with no evaluable detector, no D9 context in the
consultation yoga path) are recorded, not changed: the BUG-1570 trial cut
reported-offset top-1 by 3-5 pp and needs a product decision.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyeZrYn6ryNcSe5Y2Y
2026-11-04 16:44:42 +08:00
Claude 8f15745ca1 Merge remote-tracking branch 'origin/staging' into codex/login-rectify-loading-1103
Independent Staging Quality Gate / validate-python (push) Successful in 6m35s
Independent Staging Quality Gate / validate-frontend (push) Successful in 6m35s
Independent Staging Quality Gate / publish (push) Successful in 2m51s
# Conflicts:
#	docs/BUG_HISTORY.md
2026-11-04 15:48:14 +08:00
ClaudeandClaude Opus 5.5 98443ece4a fix(consult): no name opener, bold the conclusion and key grounds, asked-for items as a list (BUG-1557)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyn7Hj3LCW3BUs5bZ8
2026-11-04 15:47:48 +08:00
ClaudeandClaude Opus 5.5 18b01c23e5 fix(shadbala): count the Moon's Paksha 2x, not 4x; adopt BPHS-Santhanam 27.10-11 + 27.18 (BUG-1557)
Independent Staging Quality Gate / publish (push) Canceled after 0s
Independent Staging Quality Gate / validate-python (push) Canceled after 1m32s
Independent Staging Quality Gate / validate-frontend (push) Canceled after 1m33s
The precise path doubled the Moon's Paksha in Kala (Raman, Graha and Bhava
Balas §55(c)) and then took that doubled value again as her Chesta (BPHS
27.18), so her Paksha entered the total four times; Chesta could reach 120,
clamping Kashta to 0 and pushing Ishta past 60. Every surveyed source
counts 2P.

Product decision 2026-11-04: BPHS (Santhanam) 27.10-11 + 27.18, as in
saravali.github.io, Maitreya8 (default) and jyotishyamitra. The Moon's
Paksha is the folded base, not doubled; waxing Moon benefic, waning Moon
malefic (BPHS 3.11, already what classify_drik_planets does, unchanged);
Chesta = Paksha. method_variants.moon_paksha names the convention. Other
planets, Drik and the legacy calc_kala_bala path are unchanged.

shadbala.py is in the rectification frozen identity, so per ERR-110 new
records were frozen and replayed as moon_paksha_2026_11_04. Compared field
by field with data_audit_2026_11_04: sealed holdout 20/20 and reported
offset 900/900 identical, metrics and summary unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyeZrYn6ryNcSe5Y2Y
2026-11-04 15:46:16 +08:00
Claude a4ce48abe9 Merge remote-tracking branch 'origin/staging' into codex/login-rectify-loading-1103 2026-11-04 15:44:37 +08:00
Claude 74f819000f wip: answer bold weight 600 2026-11-04 15:44:37 +08:00
Claude 6c1bb0dfd4 merge: Ashtakavarga strength on the evidence card
Independent Staging Quality Gate / validate-frontend (push) Successful in 6m49s
Independent Staging Quality Gate / validate-python (push) Successful in 6m58s
Independent Staging Quality Gate / publish (push) Successful in 2m48s
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyeZrYn6ryNcSe5Y2Y

# Conflicts:
#	docs/research/pre_work_error_ledger.md
2026-11-04 14:57:12 +08:00
ClaudeandClaude Opus 5.5 20a00ebef7 fix(dasha): continue Vimshottari past the first 120-year cycle (BUG-1556)
The first mahadasha starts before birth, so the nine periods end before the
120th birthday. Historical charts past that point had no covering period:
cmd_dasha's current_dasha was null and the consultation card's
timing.vimshottari was empty (Frida Kahlo at 2026-09-27).

next_cycle_mahadashas (chart_dasha/birth_moment.py) continues with the same
lords, order and full 365.25-day years until a period covers the reference
day; cmd_dasha, the chart surfaces and the consultation sub-periods share it.
Nothing is added inside the first cycle. The frozen rectification identity
(dasha_analyzer, domain_calculation_service) is untouched, so no re-freeze.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyeZrYn6ryNcSe5Y2Y
2026-11-04 14:54:19 +08:00
ClaudeandClaude Opus 5.5 df7c0702f9 feat(consult): put Ashtakavarga strength on the evidence card house rows
Each domain house row on the consultation evidence card now carries
sav_strength: the raw SAV of the house's sign as 强 / 中 / 弱, never the
bindus. The band is the chart page's savBand (>= 28 强, 25-27 中, <= 24 弱),
sourced from references/ashtakavarga-complete-system.md §三 and the same
cut-offs as scripts/ashtakavarga.py sav_assessment (SAV_BAND_SOURCE).
A missing or mismatched engine row leaves the label off and lists a gap.
The system prompt's card description names the field in one clause.
Shadbala stays off the card (engines disagree).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyeZrYn6ryNcSe5Y2Y
2026-11-04 14:42:12 +08:00
ClaudeandClaude Opus 5.5 1b367e6ba8 chore(rectification): re-freeze sealed holdout and offset sweep for the data-audit engine fixes (ERR-110)
Independent Staging Quality Gate / validate-frontend (push) Successful in 6m17s
Independent Staging Quality Gate / validate-python (push) Successful in 6m20s
Independent Staging Quality Gate / publish (push) Successful in 2m43s
BUG-1545 (scripts/narayana_dasha.py, scripts/active_rectification_event_engine.py)
and BUG-1546 (scripts/shadbala.py) changed files in the frozen scoring
identity, so the integrity gate went red. Per ERR-110, new records were
created with each script's --freeze and replayed under the label
data_audit_2026_11_04; the scripts, contract, freshness test and frontend
gate test now point at them, following 129313e1. Prior records are kept
byte-for-byte.

Compared field by field with the d60_mapping_2026_10_29 records:
- sealed holdout: 20/20 trials identical; metrics unchanged.
- reported offset: 898/900 identical; 2 trials changed true_rank only
  (one case, radius 60, offsets -30/-20: 76->67, 80->77). Top-1,
  minute error, delivery coverage and summary are unchanged. Reverting
  only the BUG-1545 files restores the old ranks; reverting shadbala.py
  does not; a different PYTHONHASHSEED gives the same result.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyeZrYn6ryNcSe5Y2Y
2026-11-04 14:13:00 +08:00
Claude f91608244a merge: upstream sync 10 into the data audit branch
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyeZrYn6ryNcSe5Y2Y

# Conflicts:
#	docs/BUG_HISTORY.md
2026-11-04 12:41:54 +08:00
ClaudeandClaude Opus 5.5 80c3763fc4 chore(backtest): CONSULT_BACKTEST_GOLDEN swaps in a regenerated engine capture
Lets a before/after engine comparison run side by side without overwriting the
tracked fixture.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyeZrYn6ryNcSe5Y2Y
2026-11-04 12:33:32 +08:00
ClaudeandClaude Opus 5.5 1c69c1b7e2 fix(chart): chart-page Shadbala takes the precise path readings use (BUG-1548)
The chart API called calc_shadbala without a context and so used the
simplified fallback, and it rewrote `degree` as the in-sign degree, which the
precise Dig bala reads as a longitude. Readings and reports took the precise
path, so the same chart showed different strengths and a different strongest
planet (Jobs: Moon 10.61 vs 6.61 Rupa). The endpoint now builds the same
context as cmd_shadbala and passes absolute longitudes; a test locks the two
equal per planet. Also records the astrologer's ruling on waning-Moon Paksha.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyeZrYn6ryNcSe5Y2Y
2026-11-04 12:33:23 +08:00
ClaudeandClaude Opus 5.5 7dcf8112ad fix(saham): natal Vivaha Saham uses the shared day/night rule (BUG-1547, upstream 26d5a52d)
The natal marriage point was hard-coded to Venus - Saturn + Asc with no
zodiacal-order exception, while the annual Tajika point already followed
references/saham_rules.json (PVR Table 74: night reverses the operands, plus
the +30 exception). The same night-born person had two marriage points; 6 of
the 9 public charts move. The full reading, the vivah-saham command and the
consult card now share tajika._formula_saham_trace, with day/night from the
card's own day_night evidence. 0 deg Aries is no longer "missing".

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyeZrYn6ryNcSe5Y2Y
2026-11-04 12:23:21 +08:00
ClaudeandClaude Opus 5.5 9cd1e35f94 fix(shadbala): fold the Sun-Moon elongation before Paksha bala (BUG-1546)
abs(Sun - Moon) / 3 was never folded to 0-180 degrees, so on charts whose
raw difference passes 180 benefics got more than 60, malefics went negative
and the doubled Moon passed 120 (Monroe's Moon -45.76; 5 of 19 benchmark
charts). PyJHora has the same line, which is why the comparison agreed.

Same audit, no code change: the +/-60 Kala gap is PyJHora's hora formula;
PyJHora is the outlier on Mars/Jupiter/Venus Chesta; Sun/Moon Chesta is a
school difference. Shadbala totals stay off the card until those settle.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyeZrYn6ryNcSe5Y2Y
2026-11-04 12:14:20 +08:00
ClaudeandClaude Opus 5.5 a6f5ffbb4f docs(sync10): record sync 10 in the ledger, changelog and progress note
Ledger entry for upstream 5fb8379c with target 9d69cd56 and rollback list.
The progress note has the inventory, what was not ported and why, test
results, and the status of the two 2026-10-03 upstream issues. Both are
fixed upstream: KARAKA_8 now follows BPHS order, and Narayana profiles now
reach calc_narayana_mahadasha.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyeZrYn6ryNcSe5Y2Y
2026-11-04 12:08:51 +08:00
ClaudeandClaude Opus 5.5 71510682dc fix(narayana): run the second cycle instead of replaying the first (BUG-1545)
The legacy current-period lookup took the age modulo the first-cycle total,
so anyone older than their first cycle (61-96 years on the nine public
charts) got a first-cycle period: an 80-year-old was placed in 2-12. The
second cycle runs the same signs for 12 minus their first-cycle years; the
lookup now places the age on both cycles and subdivides with the second
cycle's years. The rectification cache only covers the first cycle and falls
back to the live lookup past it, so first-cycle scoring is unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyeZrYn6ryNcSe5Y2Y
2026-11-04 12:05:22 +08:00
ClaudeandClaude Opus 5.5 9d69cd5625 fix(kp): feed sub-lord analysis unrounded cusps, degrees and time (BUG-1543, upstream 26d5a52d)
cmd_kp handed calc_kp_analysis the cusps from calculate_bhava_boundaries
(rounded to 4 decimals), degree_in_sign (4 decimals) and the chart's
display julian_day (6 decimals). KP star, sub and sub-sub boundaries are
cut on raw longitude, so a body or cusp sitting on a boundary could land
one cell off. The fix recomputes the JD from the civil instant with the
compute_chart_data formula, uses calculate_cusps directly, and uses
degree_raw % 30.

Only the KP part of 26d5a52d is ported. Its Vivaha Saham day/night change
and Yoga status pass-through are left for a separate decision. Test ported
from upstream tests/test_kp_unrounded_inputs.py.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyeZrYn6ryNcSe5Y2Y
2026-11-04 12:01:47 +08:00
ClaudeandClaude Opus 5.5 8137c692b1 fix(full-reading): one observation date for Narayana, nakshatra and annual age (BUG-1542, upstream 933f254e)
today_str and transit_reference_date already followed transit_date, then
today, then now. Narayana's current period read only args.today, and the
nakshatra-dasha age and the annual fallback age used datetime.now(). A
dated report therefore mixed two dates. The annual fallback age also used
days // 365, which moves to the next year of age early.

All three now take the same observation date. The fallback age counts
calendar birthdays. Tests are ported from upstream
test_full_reading_observation_date.py and test_tajika_report_age.py and
adapted to cmd_full_reading. Same-day web consultations are unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyeZrYn6ryNcSe5Y2Y
2026-11-04 12:00:44 +08:00
ClaudeandClaude Opus 5.5 4b6aa08726 fix(varga): count D12 linkage houses from the D12 ascendant (BUG-1541, upstream cf6c316d)
The full reading's inter-chart linkage appended D12 with a hard-coded None
ascendant, so every D12 row had house None even though d12_asc_idx was
already computed a few lines above. An unknown sign name also fell back to
Aries. Port upstream cf6c316d and f60568a0: pass d12_asc_idx through, and
raise on an unknown sign or a non 0-11 ascendant index. The full reading
records the error and the consult native layer marks it blocked.

Test ported from upstream tests/test_inter_chart_d12_house.py.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyeZrYn6ryNcSe5Y2Y
2026-11-04 11:59:33 +08:00
ClaudeandClaude Opus 5.5 74169e1bfc fix(benchmark): pass the ayanamsa to both engines and refuse a mismatched baseline
The local baseline still claimed "lahiri_assumed_by_skill" after the engine
default moved to Raman, so the PyJHora comparison reported 59% instead of
~95% (every longitude 1.446 deg off). The baseline now passes --ayanamsa and
--node-mode to the engine and records what the engine reports; the compare
takes --ayanamsa and stops when the baseline was built differently. The nine
public Rodden AA backtest figures join the fixed samples.

Raman run (19 samples): ascendant, planets, nakshatras, D2/D4/D9/D10 and
Ashtakavarga all 100%; Shadbala and three old-chart dashas differ (separate).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyeZrYn6ryNcSe5Y2Y
2026-11-04 11:55:22 +08:00
ClaudeandClaude Opus 5.5 2539d57fee docs(skill): take upstream's source corrections to five reference guides
Upstream corrected guides whose calculations we already ported. Our guides
still described the old rules:

- argala: secondary Argala is house 5, blocked by house 9 (PVR Integrated
  Approach 10.5-10.7). The 8th-house and planet-gender rules are dropped.
  scripts/argala.py already does this (BUG-1386).
- sahams: the calculator carries all 36 PVR Table 74 formulas with day and
  night exceptions (BUG-1474). references/saham_rules.json is byte-equal to
  upstream.
- shodasavarga: Shodasa-varga weights are D27 0.5 and D30 1. The old 1 and
  1.5 summed to 21. They now match vimsopaka_calculator.py.
- yogi-avayogi: the mixed historical notes are marked as not a formula. The
  live profile is Sun + Moon + 93 deg 20 min in
  scripts/annual_native/yogi_sphuta.py; the upstream path is adapted.
- ai-reading workflow: adds the 2026-10-02 full-text evidence boundary
  (conditional openings, untested is not "absent", no celebrity fill-in).

event_judgment_wealth and SKILL.md now name finance-timing-strict with
wealth-timing-strict as the legacy alias, as the router already does. Chat
binds only the 商业运行时路由 section of SKILL.md and router sections, so
no chat prompt text changes.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyeZrYn6ryNcSe5Y2Y
2026-11-04 11:55:13 +08:00
ClaudeandClaude Opus 5.5 297e27e0bd docs(privacy): swap the leftover private sample for upstream's public example
Upstream replaced the redacted-year sample (April 17, 14:45, about 36.5N
114.2E) with a public birth (1935-06-21 11:00, Cajarc, France) in the
reading workflow and in the narayana-dasha / solar-return usage text. Our
copies still carried the private date, time and place. The PDF guide's
example coordinates now name the San Francisco values it already labels.

Doc and docstring text only; no calculation changes. The same sample is
still a quality-gate fixture in scripts/run_quality_gate.py and appears in
older docs/research notes; neither is changed here.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyeZrYn6ryNcSe5Y2Y
2026-11-04 11:54:12 +08:00
ClaudeandClaude Opus 5.5 3bae79fbca docs(upstream): mirror upstream SKILL.md at main 5fb8379c (sync 10)
Run scripts/import_yinduzhanxing.py --apply from a clean clone of upstream
main 5fb8379c, the upstream HEAD on 2026-11-04. Only the root SKILL.md
moves into references/upstream/yinduzhanxing; the six semantic-merge paths
stay review_required and untouched. The new mirror drops the private
"yn-1993" sample wording the b9a0ef8f mirror still carried.

source-manifest.json and import-plan.json now pin 5fb8379c. The b9a0ef8f
import record stays as history and its test now checks only the record.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyeZrYn6ryNcSe5Y2Y
2026-11-04 11:51:04 +08:00
ClaudeandClaude Opus 5.5 db2fc3fcfe fix(consult): cut what the agent reads from 24.5k to 18.4k characters (BUG-1540, step 2)
Independent Staging Quality Gate / validate-python (push) Successful in 6m14s
Independent Staging Quality Gate / validate-frontend (push) Successful in 6m14s
Independent Staging Quality Gate / publish (push) Successful in 2m56s
The writing rules were only a slice of the agent's input; the rest pulled
answers toward a report. Product approved six cuts (2026-11-04):
1. Chat tool results no longer carry the router's English "Shared
   mandatory baseline" (degrees, nakshatra, MEVG, case calibration, A/B/C
   labels for every reading).
2. Checklist wording the model read aloud: house-counting is for judging
   only; "双体星座" becomes the four sign names.
3. The bound skill excerpt keeps only the truth-boundary paragraph (KP /
   Muhurta table, Ashtottari, P0/P1 list and three-layer method dropped;
   marker kept).
4. The reference_transparency block goes: the card never carries it.
5. English rules that restated VISIBLE VOICE go; "keep conclusions
   conditional" becomes "never call it verified, but say plainly what the
   chart shows".
6. The rectification offer rule is the offer tool's description instead of
   riding in every user turn.

Parents backtest: unglossed terms 16 -> 11 (std) and 25 -> 11 (verbatim
question); no absent parent written as present or involved.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyeZrYn6ryNcSe5Y2Y
2026-11-04 11:00:54 +08:00
ClaudeandClaude Opus 5.5 788de754f9 fix(consult): list every ground with its meaning; say the presence range once per answer (BUG-1540)
Independent Staging Quality Gate / validate-frontend (push) Successful in 6m19s
Independent Staging Quality Gate / validate-python (push) Successful in 6m21s
Independent Staging Quality Gate / publish (push) Successful in 3m4s
Product 2026-11-04: grounds may be listed in full as long as each one says
what it means; the "can't tell distance from friction" range is said once
per answer (merged when both parents are heavy). Backtest: answers repeating
the range 11/18 -> 6/18 (std) and 6/9 -> 1/9 (verbatim question); unglossed
terms 33 -> 16; still no absent parent written as present or warm.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyeZrYn6ryNcSe5Y2Y
2026-11-04 10:38:27 +08:00
ClaudeandClaude Opus 5.5 7fe337d420 fix(consult): keep a one-sentence range for heavily afflicted parents; plain words over jargon (BUG-1540)
Independent Staging Quality Gate / validate-python (push) Successful in 6m14s
Independent Staging Quality Gate / validate-frontend (push) Successful in 6m20s
Independent Staging Quality Gate / publish (push) Successful in 3m4s
Backtest (parents, 9 Rodden AA figures, blind-scored) showed the slim voice
wrote absent parents as present and warm (severe 0 -> 8, then 1 -> 5) once
the presence range was gone. Product chose the hybrid: when a person's line
carries heavy pressure, give the range once in the model's own words and
write no portrait of that person's conduct or warmth on that side.
Hybrid round: severe 3 -> 0 (std), 2 -> 0 (correction), 4 -> 2 (verbatim
question); closing asks 26/26 -> 3/27; control false positives unchanged.

Also: correction turns say which line was off and never blame the user;
jargon and varga codes are said in plain words; house-counting is a named
ban; no mind-reading when the user asks for objectivity.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyeZrYn6ryNcSe5Y2Y
2026-11-04 10:26:16 +08:00
ClaudeandClaude Opus 5.5 feb16ed358 fix(consult): one short VISIBLE VOICE instead of 17k characters of stacked answer rules (BUG-1540)
The parents answer read as house-by-house fact chains with a gloss on every
house, opened with "both lines show pressure" instead of the pattern asked
for, and copied the example's 「实际是哪一种,告诉我一句」. The model was
satisfying ~13.9k characters of writing rules stated three times (voice,
English contract, user turn) plus copyable Good/Bad examples.

- VISIBLE VOICE is now the single statement: follow the user's own
  structure, open with the overall picture, explain why each placement
  means what it means, gloss terms briefly; then the red lines only.
- Contract and first/follow-up user turns point at it instead of
  restating it; all example answers removed.
- AFFLICTION_RANGE_RULE keeps the red line (no biographical verdicts, no
  reverse reassurance) but drops the forced range and closing ask; the
  question's own premise counts.
- Contract tests cap the voice at 2600 characters and lock every red line
  the old tests guarded; backtest script gains --question.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyeZrYn6ryNcSe5Y2Y
2026-11-04 09:53:27 +08:00
ClaudeandClaude Opus 5.5 9a6244bcc0 feat(consult): follow-up questions written from this question and answer, saved with it (BUG-1539)
Independent Staging Quality Gate / validate-python (push) Successful in 6m18s
Independent Staging Quality Gate / validate-frontend (push) Successful in 6m21s
Independent Staging Quality Gate / publish (push) Successful in 2m49s
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyn7Hj3LCW3BUs5bZ8
2026-11-04 09:41:32 +08:00
ClaudeandClaude Opus 5.5 f577dcd279 fix(chat): readable 常用问题 hover, aligned answer actions, no 本轮技法 list, no keyword follow-ups (BUG-1539)
Independent Staging Quality Gate / validate-frontend (push) Successful in 6m11s
Independent Staging Quality Gate / validate-python (push) Successful in 6m14s
Independent Staging Quality Gate / publish (push) Successful in 2m30s
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyn7Hj3LCW3BUs5bZ8
2026-11-04 09:23:13 +08:00
ClaudeandClaude Opus 5.5 5c9a51c4dd fix(sidebar): one hover colour per row, lighter than the current row; no credits under the name (BUG-1538)
Independent Staging Quality Gate / validate-python (push) Successful in 6m18s
Independent Staging Quality Gate / validate-frontend (push) Successful in 6m17s
Independent Staging Quality Gate / publish (push) Successful in 2m22s
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyn7Hj3LCW3BUs5bZ8
2026-11-04 09:06:54 +08:00
ClaudeandClaude Opus 5.5 f0f570e17b feat(sidebar): option B — solid sidebar, outlined 新建对话, 3×2 tool grid, neutral selection (BUG-1537)
Independent Staging Quality Gate / validate-frontend (push) Successful in 6m19s
Independent Staging Quality Gate / validate-python (push) Successful in 6m29s
Independent Staging Quality Gate / publish (push) Successful in 2m59s
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyn7Hj3LCW3BUs5bZ8
2026-11-03 23:47:05 +08:00
ClaudeandClaude Opus 5.5 3ec682763d test: header title assertions follow the shortened rectification title (BUG-1536)
Independent Staging Quality Gate / validate-frontend (push) Successful in 6m23s
Independent Staging Quality Gate / validate-python (push) Successful in 6m44s
Independent Staging Quality Gate / publish (push) Successful in 3m20s
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyn7Hj3LCW3BUs5bZ8
2026-11-03 23:26:30 +08:00