|
2 | 2 |
|
3 | 3 | ## [Unreleased] |
4 | 4 |
|
| 5 | +### Fixed (pre-6.0.0 zero-bug review campaign, rounds 26β35) |
| 6 | + |
| 7 | +Ten further review rounds, each rotating a fresh runtime-reproduced lens. Every |
| 8 | +finding below was reproduced offline before fixing and covered by a regression |
| 9 | +test; the fixes are error-contract / validation / display-consistency hardening |
| 10 | +with no change to any correct computed value. |
| 11 | + |
| 12 | +- **Error contract at the ephemeris/date boundary.** `from_iso_utc_time` wrapped a |
| 13 | + raw `OverflowError`/`OSError` for an instant near `datetime.max/min` whose local |
| 14 | + wall time overflows during the UTCβlocal conversion (round 26). The |
| 15 | + `PlanetaryReturnFactory` crossing searches (`solcross_ut`/`mooncross_ut` and the |
| 16 | + sibling `helio_cross_ut`/`mooncross_node_ut`, forward **and** backward) leaked a |
| 17 | + raw `libephemeris` error when the search stepped off the loaded ephemeris range; |
| 18 | + all are now normalized to `KerykeionException` like every sibling event factory |
| 19 | + (rounds 31β32). `RelocatedChartFactory` leaked the same `astimezone` overflow for |
| 20 | + an extended-kernel extreme-year subject (round 27). |
| 21 | +- **Year 0 / BCE calendrical & ISO.** Year 0 (1 BCE) stored as the ISO-8601 unsigned |
| 22 | + `"0000"` crashed chart rendering because two display helpers |
| 23 | + (`format_datetime_with_timezone`, `format_iso_display`) routed it to |
| 24 | + `datetime.fromisoformat` (min year 1); both now take the manual branch (round 27). |
| 25 | + BCE subjects rendered the local ISO's LMT offset at minute resolution while |
| 26 | + deriving the Julian Day / UTC ISO from the exact offset, so the two ISO fields of |
| 27 | + one subject disagreed about the instant by up to ~30 s; the offset is now quantized |
| 28 | + to the whole second (matching the CE LMT path) and rendered `+HH:MM:SS` (round 34). |
| 29 | +- **Serialization / display consistency.** The text and LLM-context serializers |
| 30 | + rendered a within-~0.005Β°-of-cusp `position`/`abs_pos` as the impossible `"30.00"` |
| 31 | + / out-of-range `"360.00"`; a shared `format_degrees_below_bound` now clamps just |
| 32 | + below the cusp (round 27). `dominants.zodiac_breakdown` raised `IndexError` on a |
| 33 | + tiny-negative input; a fold-back guard mirrors `get_kerykeion_point_from_degree` |
| 34 | + (round 27). |
| 35 | +- **Input validation.** `EclipseFactory.search_from_location` and |
| 36 | + `OccultationFactory.search_local` accepted an impossible latitude (`|lat|>90`, |
| 37 | + reachable via a lat/lng swap) and returned a bogus "visible" event; both now |
| 38 | + `validate_latitude`. Occultation search accepted non-physical calculated points |
| 39 | + (nodes, Lilith, Uranian hypotheticals) and fabricated events; it is now restricted |
| 40 | + to an occultable-body allowlist (round 35). |
| 41 | +- **Documentation & type-contract accuracy.** `KerykeionPointModel.dignity_score` |
| 42 | + documented range corrected to its true `[-9, +11]` net-sum span (round 28); the |
| 43 | + four Solar/Lunar `PlanetaryReturnFactory` methods narrowed `return_type` from the |
| 44 | + 4-member `ReturnType` to `Literal["Solar","Lunar"]` (the accepted set); several |
| 45 | + `Raises:`/parameter docstrings aligned to the actual `KerykeionException` contract |
| 46 | + (rounds 31, 34); stale example output values in the SunTimes docstring and the |
| 47 | + README Moon-phase examples refreshed (round 33). |
| 48 | + |
| 49 | +Lenses that ran fully **clean** across these rounds (extensive runtime evidence, no |
| 50 | +defect): algebraic/property invariants, aliasing/shared-mutable-state, concurrency & |
| 51 | +shared-cache thread-safety, resource lifecycle/long-run stability, cross-field model |
| 52 | +internal-consistency, model serialization round-trip (all types), SVG rendering at |
| 53 | +degenerate/extreme configs, two-subject techniques (composite/Davison/synastry/score), |
| 54 | +transit-series & chart-data assembly, predictive-technique arithmetic (progressions/ |
| 55 | +returns/directions/zodiacal-releasing), perspective & coordinate transforms, peripheral |
| 56 | +reference values (Arabic parts/fixed stars/nodes/ACG/eclipses/nutation), settings & |
| 57 | +translation completeness (10 languages), configurable-input correctness & public-API |
| 58 | +integrity. The southern-polar quadrant-house MC behavior flagged in round 29 was |
| 59 | +confirmed upstream (libephemeris#46) as intended Swiss Ephemeris parity, not a defect β |
| 60 | +see Known limitations. |
| 61 | + |
5 | 62 | ### Fixed (pre-6.0.0 invariants + calendrical + doc-contract review, round 25) |
6 | 63 |
|
7 | 64 | - **BCE dates reject an impossible day-of-month instead of silently rolling it |
|
0 commit comments