astroapi-io-client 0.2.6__tar.gz → 0.2.7__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (26) hide show
  1. {astroapi_io_client-0.2.6 → astroapi_io_client-0.2.7}/PKG-INFO +5 -4
  2. {astroapi_io_client-0.2.6 → astroapi_io_client-0.2.7}/README.md +4 -3
  3. {astroapi_io_client-0.2.6 → astroapi_io_client-0.2.7}/pyproject.toml +1 -1
  4. {astroapi_io_client-0.2.6 → astroapi_io_client-0.2.7}/src/astroapi_client/__init__.py +3 -3
  5. {astroapi_io_client-0.2.6 → astroapi_io_client-0.2.7}/src/astroapi_client/_validation.py +1 -1
  6. {astroapi_io_client-0.2.6 → astroapi_io_client-0.2.7}/src/astroapi_client/client.py +7 -3
  7. {astroapi_io_client-0.2.6 → astroapi_io_client-0.2.7}/src/astroapi_client/types.py +3 -0
  8. {astroapi_io_client-0.2.6 → astroapi_io_client-0.2.7}/src/astroapi_io_client.egg-info/PKG-INFO +5 -4
  9. {astroapi_io_client-0.2.6 → astroapi_io_client-0.2.7}/tests/test_client.py +4 -0
  10. {astroapi_io_client-0.2.6 → astroapi_io_client-0.2.7}/LICENSE.txt +0 -0
  11. {astroapi_io_client-0.2.6 → astroapi_io_client-0.2.7}/setup.cfg +0 -0
  12. {astroapi_io_client-0.2.6 → astroapi_io_client-0.2.7}/src/astroapi_client/errors.py +0 -0
  13. {astroapi_io_client-0.2.6 → astroapi_io_client-0.2.7}/src/astroapi_client/py.typed +0 -0
  14. {astroapi_io_client-0.2.6 → astroapi_io_client-0.2.7}/src/astroapi_client/receipts.py +0 -0
  15. {astroapi_io_client-0.2.6 → astroapi_io_client-0.2.7}/src/astroapi_io_client.egg-info/SOURCES.txt +0 -0
  16. {astroapi_io_client-0.2.6 → astroapi_io_client-0.2.7}/src/astroapi_io_client.egg-info/dependency_links.txt +0 -0
  17. {astroapi_io_client-0.2.6 → astroapi_io_client-0.2.7}/src/astroapi_io_client.egg-info/requires.txt +0 -0
  18. {astroapi_io_client-0.2.6 → astroapi_io_client-0.2.7}/src/astroapi_io_client.egg-info/top_level.txt +0 -0
  19. {astroapi_io_client-0.2.6 → astroapi_io_client-0.2.7}/tests/test_aspect_windows_client.py +0 -0
  20. {astroapi_io_client-0.2.6 → astroapi_io_client-0.2.7}/tests/test_calendar_export.py +0 -0
  21. {astroapi_io_client-0.2.6 → astroapi_io_client-0.2.7}/tests/test_davison_input.py +0 -0
  22. {astroapi_io_client-0.2.6 → astroapi_io_client-0.2.7}/tests/test_house_ingresses_client.py +0 -0
  23. {astroapi_io_client-0.2.6 → astroapi_io_client-0.2.7}/tests/test_next_expansions_client.py +0 -0
  24. {astroapi_io_client-0.2.6 → astroapi_io_client-0.2.7}/tests/test_onboarding_context_client.py +0 -0
  25. {astroapi_io_client-0.2.6 → astroapi_io_client-0.2.7}/tests/test_planetary_events_client.py +0 -0
  26. {astroapi_io_client-0.2.6 → astroapi_io_client-0.2.7}/tests/test_varga_input.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: astroapi-io-client
3
- Version: 0.2.6
3
+ Version: 0.2.7
4
4
  Summary: Synchronous Python client for the AstroAPI.io calculation gateway
5
5
  License-Expression: ISC
6
6
  Classifier: Programming Language :: Python :: 3
@@ -14,13 +14,13 @@ Dynamic: license-file
14
14
 
15
15
  # AstroAPI.io Python client
16
16
 
17
- The R198 client `astroapi-io-client==0.2.6` covers all forty-six calculation routes: forty-five standard operations plus the separate Pro Nakshatra Timeline. Minor-body calculations are not part of the contract.
17
+ The R199 source client `astroapi-io-client==0.2.7` covers all forty-seven calculation routes: forty-six standard operations plus the separate Pro Nakshatra Timeline. Minor-body calculations are not part of the contract.
18
18
 
19
19
  A synchronous client for Python 3.10+, with no runtime dependencies.
20
20
  The package import is `astroapi_client`; the distribution name is
21
- `astroapi-io-client`. Version 0.2.6 is the current published R198 client; package availability never implies that source-only R198 API capabilities are deployed.
21
+ `astroapi-io-client`. Version 0.2.7 is the R199 client; package availability never implies that source-only R199 API capabilities are deployed.
22
22
 
23
- Install from PyPI with `python -m pip install astroapi-io-client==0.2.6`, or from a local checkout using `python -m pip install ./clients/python`.
23
+ Install from PyPI with `python -m pip install astroapi-io-client==0.2.7`, or install the current source from a local checkout using `python -m pip install ./clients/python`.
24
24
  Building needs setuptools and wheel; the installed client uses only the standard
25
25
  library. Keep API credentials in trusted server or command-line environments.
26
26
 
@@ -99,6 +99,7 @@ Type hints describe the server contract and do not perform response validation.
99
99
  | `civil_time_audit` **beta** | `calculateCivilTimeAudit` | pinned place, local date/time, one explicit profile | both repeated-time chart candidates and exact 22-fact differences, or no shifted gap time |
100
100
  | `chart_input_readiness` **beta** | `calculateChartInputReadiness` | pinned place, exact/approximate/unknown time quality, explicit profile | route readiness plus resolved, candidate, or sampled evidence for 22 facts |
101
101
  | `house_system_readiness` **beta** | `calculateHouseSystemReadiness` | exact birth and explicit tropical/sidereal profile | fixed 25-system availability matrix with fingerprints and no fallback |
102
+ | `house_placement_stability` **beta** | `calculateHousePlacementStability` | exact birth and explicit tropical/sidereal profile | exact assignments, unweighted agreement ratios, and deterministic equivalence groups across available 12-house systems |
102
103
  | `synastry_svg` **beta** | `calculateSynastrySvg` | two births; optional zodiac/houses/theme/aspects/`include_png` | `result["svg"]`, optional `result["png"]` |
103
104
  | `transit_svg` **beta** | `calculateTransitSvg` | birth and transit date; optional display controls/`include_png` | `result["svg"]`, optional `result["png"]` |
104
105
  | `natal_report` **beta** | `calculateNatalReport` | birth; optional zodiac/houses/theme/SVG/download | `result["html"]`, source-linked `result["facts"]`, optional `result["download"]` |
@@ -1,12 +1,12 @@
1
1
  # AstroAPI.io Python client
2
2
 
3
- The R198 client `astroapi-io-client==0.2.6` covers all forty-six calculation routes: forty-five standard operations plus the separate Pro Nakshatra Timeline. Minor-body calculations are not part of the contract.
3
+ The R199 source client `astroapi-io-client==0.2.7` covers all forty-seven calculation routes: forty-six standard operations plus the separate Pro Nakshatra Timeline. Minor-body calculations are not part of the contract.
4
4
 
5
5
  A synchronous client for Python 3.10+, with no runtime dependencies.
6
6
  The package import is `astroapi_client`; the distribution name is
7
- `astroapi-io-client`. Version 0.2.6 is the current published R198 client; package availability never implies that source-only R198 API capabilities are deployed.
7
+ `astroapi-io-client`. Version 0.2.7 is the R199 client; package availability never implies that source-only R199 API capabilities are deployed.
8
8
 
9
- Install from PyPI with `python -m pip install astroapi-io-client==0.2.6`, or from a local checkout using `python -m pip install ./clients/python`.
9
+ Install from PyPI with `python -m pip install astroapi-io-client==0.2.7`, or install the current source from a local checkout using `python -m pip install ./clients/python`.
10
10
  Building needs setuptools and wheel; the installed client uses only the standard
11
11
  library. Keep API credentials in trusted server or command-line environments.
12
12
 
@@ -85,6 +85,7 @@ Type hints describe the server contract and do not perform response validation.
85
85
  | `civil_time_audit` **beta** | `calculateCivilTimeAudit` | pinned place, local date/time, one explicit profile | both repeated-time chart candidates and exact 22-fact differences, or no shifted gap time |
86
86
  | `chart_input_readiness` **beta** | `calculateChartInputReadiness` | pinned place, exact/approximate/unknown time quality, explicit profile | route readiness plus resolved, candidate, or sampled evidence for 22 facts |
87
87
  | `house_system_readiness` **beta** | `calculateHouseSystemReadiness` | exact birth and explicit tropical/sidereal profile | fixed 25-system availability matrix with fingerprints and no fallback |
88
+ | `house_placement_stability` **beta** | `calculateHousePlacementStability` | exact birth and explicit tropical/sidereal profile | exact assignments, unweighted agreement ratios, and deterministic equivalence groups across available 12-house systems |
88
89
  | `synastry_svg` **beta** | `calculateSynastrySvg` | two births; optional zodiac/houses/theme/aspects/`include_png` | `result["svg"]`, optional `result["png"]` |
89
90
  | `transit_svg` **beta** | `calculateTransitSvg` | birth and transit date; optional display controls/`include_png` | `result["svg"]`, optional `result["png"]` |
90
91
  | `natal_report` **beta** | `calculateNatalReport` | birth; optional zodiac/houses/theme/SVG/download | `result["html"]`, source-linked `result["facts"]`, optional `result["download"]` |
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "astroapi-io-client"
7
- version = "0.2.6"
7
+ version = "0.2.7"
8
8
  description = "Synchronous Python client for the AstroAPI.io calculation gateway"
9
9
  readme = "README.md"
10
10
  license = "ISC"
@@ -17,7 +17,7 @@ from .types import (
17
17
  GeographicLocation, RelocationChartInput, AstrocartographyBody, AstrocartographyInput,
18
18
  EclipseType, EclipseGeometryInput, EclipseObserverSnapshot, EclipseEvent, EclipseGeometryResponse, MoonPhaseSector, ElectionalAspectFilter,
19
19
  ElectionalFilters, ElectionalSearchInput,
20
- EventRule, EventRuleSearchInput, ConventionProfile, ConventionCompareInput, ReleaseCompareInput, ChartRobustnessInput, CivilTimeAuditInput, ChartInputReadinessExactTime, ChartInputReadinessApproximateTime, ChartInputReadinessUnknownTime, ChartInputReadinessBirthTime, ChartInputReadinessInput,
20
+ EventRule, EventRuleSearchInput, ConventionProfile, ConventionCompareInput, ReleaseCompareInput, ChartRobustnessInput, CivilTimeAuditInput, ChartInputReadinessExactTime, ChartInputReadinessApproximateTime, ChartInputReadinessUnknownTime, ChartInputReadinessBirthTime, ChartInputReadinessInput, HouseSystemReadinessInput, HousePlacementStabilityInput,
21
21
  NatalAnalysisAspectName, NatalAnalysisAspectOption, NatalAnalysisInput,
22
22
  AshtakootaInput, AshtakavargaInput, NumerologyInput, PlanetaryHoursInput,
23
23
  FixedStar, FixedStarsInput,
@@ -30,7 +30,7 @@ from .types import (
30
30
  PlaceSearchInput, TimezoneResolveInput, NatalContextInput,
31
31
  )
32
32
 
33
- __version__ = "0.2.6"
33
+ __version__ = "0.2.7"
34
34
  __all__ = [
35
35
  "NumerologyInput", "verify_calculation_receipt",
36
36
  "AstroAPIClient", "AstroAPIError", "ClientBusyError", "HTTPError", "DavisonInput",
@@ -45,7 +45,7 @@ __all__ = [
45
45
  "GeographicLocation", "RelocationChartInput", "AstrocartographyBody", "AstrocartographyInput",
46
46
  "EclipseType", "EclipseGeometryInput", "EclipseObserverSnapshot", "EclipseEvent", "EclipseGeometryResponse", "MoonPhaseSector", "ElectionalAspectFilter",
47
47
  "ElectionalFilters", "ElectionalSearchInput",
48
- "EventRule", "EventRuleSearchInput", "ConventionProfile", "ConventionCompareInput", "ReleaseCompareInput", "ChartRobustnessInput", "CivilTimeAuditInput", "ChartInputReadinessExactTime", "ChartInputReadinessApproximateTime", "ChartInputReadinessUnknownTime", "ChartInputReadinessBirthTime", "ChartInputReadinessInput",
48
+ "EventRule", "EventRuleSearchInput", "ConventionProfile", "ConventionCompareInput", "ReleaseCompareInput", "ChartRobustnessInput", "CivilTimeAuditInput", "ChartInputReadinessExactTime", "ChartInputReadinessApproximateTime", "ChartInputReadinessUnknownTime", "ChartInputReadinessBirthTime", "ChartInputReadinessInput", "HouseSystemReadinessInput", "HousePlacementStabilityInput",
49
49
  "NatalAnalysisAspectName", "NatalAnalysisAspectOption", "NatalAnalysisInput",
50
50
  "AshtakootaInput", "AshtakavargaInput", "PlanetaryHoursInput",
51
51
  "FixedStar", "FixedStarsInput",
@@ -702,7 +702,7 @@ def encode_request(route: str, payload: Any) -> bytes:
702
702
  _invalid("tropical profiles cannot include ayanamsa.")
703
703
  if profile["zodiac"] == "sidereal" and ("ayanamsa" not in profile or profile["ayanamsa"] not in _AYANAMSAS):
704
704
  _invalid("sidereal profiles require a supported ayanamsa.")
705
- elif route == "house-system-readiness":
705
+ elif route in {"house-system-readiness", "house-placement-stability"}:
706
706
  _object(data, {"birth", "profile"}, {"birth", "profile"})
707
707
  birth = _object(data["birth"], {"date", "time", "timezone", "lat", "lon"}, {"date", "time", "timezone", "lat", "lon"})
708
708
  _birth(birth)
@@ -32,7 +32,7 @@ from .types import (
32
32
  MoonPhaseInput, MoonPhaseResponse, DavisonInput, PlanetaryEventsInput, PlanetaryEventsResponse,
33
33
  HouseIngressesInput, HouseIngressesResponse,
34
34
  AspectWindowsInput, AspectWindowsResponse,
35
- EventRuleSearchInput, ConventionCompareInput, ReleaseCompareInput, ChartRobustnessInput, CivilTimeAuditInput, ChartInputReadinessInput, HouseSystemReadinessInput,
35
+ EventRuleSearchInput, ConventionCompareInput, ReleaseCompareInput, ChartRobustnessInput, CivilTimeAuditInput, ChartInputReadinessInput, HouseSystemReadinessInput, HousePlacementStabilityInput,
36
36
  EventCalendarInput, SynastrySvgInput, TransitSvgInput, NatalReportInput,
37
37
  BirthTimeSensitivityInput, RelocationChartInput, AstrocartographyInput,
38
38
  PlaceSearchInput, TimezoneResolveInput, NatalContextInput,
@@ -181,7 +181,7 @@ def _perform(
181
181
  "Content-Type": "application/json",
182
182
  "Accept": "application/json",
183
183
  "Accept-Encoding": "identity",
184
- "User-Agent": "astroapi-io-client/0.2.6",
184
+ "User-Agent": "astroapi-io-client/0.2.7",
185
185
  "Connection": "close",
186
186
  **({"X-AstroAPI-Receipt": "v1"} if request_receipt else {}),
187
187
  })
@@ -285,7 +285,7 @@ class AstroAPIClient:
285
285
 
286
286
  def _request(self, route: str, payload: object) -> JSONResponse:
287
287
  body = encode_request(route, payload)
288
- timeout = (self._timeline_timeout if route in {"nakshatra-timeline", "birth-time-sensitivity", "chart-robustness", "chart-input-readiness", "house-system-readiness"}
288
+ timeout = (self._timeline_timeout if route in {"nakshatra-timeline", "birth-time-sensitivity", "chart-robustness", "chart-input-readiness", "house-system-readiness", "house-placement-stability"}
289
289
  else self._planetary_events_timeout if route in {"planetary-events", "house-ingresses", "eclipse-geometry", "electional-search", "event-rule-search"}
290
290
  else self._aspect_windows_timeout if route == "aspect-windows"
291
291
  else self._timeout)
@@ -440,6 +440,10 @@ class AstroAPIClient:
440
440
  """BETA: preflight the fixed 25-system inventory without fallback."""
441
441
  return self._request("house-system-readiness", payload)
442
442
 
443
+ def house_placement_stability(self, payload: HousePlacementStabilityInput) -> JSONResponse:
444
+ """BETA: quantify unweighted planet-house stability across comparable systems."""
445
+ return self._request("house-placement-stability", payload)
446
+
443
447
  def synastry_svg(self, payload: SynastrySvgInput) -> JSONResponse:
444
448
  """BETA: original deterministic double-wheel relationship SVG."""
445
449
  return self._request("synastry-svg", payload)
@@ -419,6 +419,9 @@ class HouseSystemReadinessInput(TypedDict):
419
419
  profile: HouseSystemReadinessProfile
420
420
 
421
421
 
422
+ HousePlacementStabilityInput = HouseSystemReadinessInput
423
+
424
+
422
425
  class ReleaseCompareInput(TypedDict):
423
426
  releases: list[JSONResponse]
424
427
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: astroapi-io-client
3
- Version: 0.2.6
3
+ Version: 0.2.7
4
4
  Summary: Synchronous Python client for the AstroAPI.io calculation gateway
5
5
  License-Expression: ISC
6
6
  Classifier: Programming Language :: Python :: 3
@@ -14,13 +14,13 @@ Dynamic: license-file
14
14
 
15
15
  # AstroAPI.io Python client
16
16
 
17
- The R198 client `astroapi-io-client==0.2.6` covers all forty-six calculation routes: forty-five standard operations plus the separate Pro Nakshatra Timeline. Minor-body calculations are not part of the contract.
17
+ The R199 source client `astroapi-io-client==0.2.7` covers all forty-seven calculation routes: forty-six standard operations plus the separate Pro Nakshatra Timeline. Minor-body calculations are not part of the contract.
18
18
 
19
19
  A synchronous client for Python 3.10+, with no runtime dependencies.
20
20
  The package import is `astroapi_client`; the distribution name is
21
- `astroapi-io-client`. Version 0.2.6 is the current published R198 client; package availability never implies that source-only R198 API capabilities are deployed.
21
+ `astroapi-io-client`. Version 0.2.7 is the R199 client; package availability never implies that source-only R199 API capabilities are deployed.
22
22
 
23
- Install from PyPI with `python -m pip install astroapi-io-client==0.2.6`, or from a local checkout using `python -m pip install ./clients/python`.
23
+ Install from PyPI with `python -m pip install astroapi-io-client==0.2.7`, or install the current source from a local checkout using `python -m pip install ./clients/python`.
24
24
  Building needs setuptools and wheel; the installed client uses only the standard
25
25
  library. Keep API credentials in trusted server or command-line environments.
26
26
 
@@ -99,6 +99,7 @@ Type hints describe the server contract and do not perform response validation.
99
99
  | `civil_time_audit` **beta** | `calculateCivilTimeAudit` | pinned place, local date/time, one explicit profile | both repeated-time chart candidates and exact 22-fact differences, or no shifted gap time |
100
100
  | `chart_input_readiness` **beta** | `calculateChartInputReadiness` | pinned place, exact/approximate/unknown time quality, explicit profile | route readiness plus resolved, candidate, or sampled evidence for 22 facts |
101
101
  | `house_system_readiness` **beta** | `calculateHouseSystemReadiness` | exact birth and explicit tropical/sidereal profile | fixed 25-system availability matrix with fingerprints and no fallback |
102
+ | `house_placement_stability` **beta** | `calculateHousePlacementStability` | exact birth and explicit tropical/sidereal profile | exact assignments, unweighted agreement ratios, and deterministic equivalence groups across available 12-house systems |
102
103
  | `synastry_svg` **beta** | `calculateSynastrySvg` | two births; optional zodiac/houses/theme/aspects/`include_png` | `result["svg"]`, optional `result["png"]` |
103
104
  | `transit_svg` **beta** | `calculateTransitSvg` | birth and transit date; optional display controls/`include_png` | `result["svg"]`, optional `result["png"]` |
104
105
  | `natal_report` **beta** | `calculateNatalReport` | birth; optional zodiac/houses/theme/SVG/download | `result["html"]`, source-linked `result["facts"]`, optional `result["download"]` |
@@ -65,6 +65,7 @@ CONVENTION_INPUT = {"birth": BIRTH, "profiles": [{"zodiac": "tropical", "house_s
65
65
  CIVIL_TIME_AUDIT_INPUT = {"place_id": "geonames:5128581:2026-10-02", "date": "2024-11-03", "time": "01:30", "profile": {"zodiac": "tropical", "house_system": "equal"}}
66
66
  CHART_INPUT_READINESS_INPUT = {"place_id": "geonames:5128581:2026-10-02", "birth_time": {"status": "exact", "date": "2024-11-03", "time": "01:30"}, "profile": {"zodiac": "tropical", "house_system": "equal"}}
67
67
  HOUSE_SYSTEM_READINESS_INPUT = {"birth": BIRTH, "profile": {"zodiac": "tropical"}}
68
+ HOUSE_PLACEMENT_STABILITY_INPUT = HOUSE_SYSTEM_READINESS_INPUT
68
69
  CHART_ROBUSTNESS_INPUT = {"birth_time": {"status": "approximate", "date": "2000-01-01", "time": "12:00", "timezone": "UTC", "uncertainty_minutes": 30}, "lat": 0, "lon": 0, "profiles": [{"zodiac": "tropical", "house_system": "equal"}, {"zodiac": "sidereal", "ayanamsa": "lahiri", "house_system": "whole_sign"}]}
69
70
  ROUTES += [
70
71
  ("event_rule_search", "event-rule-search", RULE_INPUT, {"type": "event_rule_search", "status": "beta", "rule_analysis": {}, "matching_samples": [], "sampled_candidate_windows": [], "metadata": {}}),
@@ -73,6 +74,7 @@ ROUTES += [
73
74
  ("civil_time_audit", "civil-time-audit", CIVIL_TIME_AUDIT_INPUT, {"type": "civil_time_audit", "status": "beta", "resolution": {}, "profile": {}, "calculation_ready": False, "requires_selection": True, "candidates": [], "comparison": {}, "metadata": {}}),
74
75
  ("chart_input_readiness", "chart-input-readiness", CHART_INPUT_READINESS_INPUT, {"type": "chart_input_readiness", "status": "beta", "birth_time_status": "exact", "profile": {}, "resolution": {}, "exact_chart_ready": False, "next_action": "select_civil_time_candidate", "workflows": [{}, {}, {}, {}], "fact_evidence": [], "summary": {}, "evidence": {}, "metadata": {}}),
75
76
  ("house_system_readiness", "house-system-readiness", HOUSE_SYSTEM_READINESS_INPUT, {"type": "house_system_readiness", "status": "beta", "input": BIRTH, "profile": {}, "systems": [{} for _ in range(25)], "summary": {}, "fallback": {"performed": False, "selected_system": None}, "metadata": {}}),
77
+ ("house_placement_stability", "house-placement-stability", HOUSE_PLACEMENT_STABILITY_INPUT, {"type": "house_placement_stability", "status": "beta", "input": BIRTH, "profile": {}, "systems": [{} for _ in range(25)], "planets": [{} for _ in range(10)], "placement_groups": [], "summary": {}, "fallback": {"performed": False, "selected_system": None}, "metadata": {}}),
76
78
  ]
77
79
 
78
80
  @contextmanager
@@ -158,6 +160,7 @@ CONVENTION_INPUT = {"birth": BIRTH, "profiles": [{"zodiac": "tropical", "house_s
158
160
  CIVIL_TIME_AUDIT_INPUT = {"place_id": "geonames:5128581:2026-10-02", "date": "2024-11-03", "time": "01:30", "profile": {"zodiac": "tropical", "house_system": "equal"}}
159
161
  CHART_INPUT_READINESS_INPUT = {"place_id": "geonames:5128581:2026-10-02", "birth_time": {"status": "exact", "date": "2024-11-03", "time": "01:30"}, "profile": {"zodiac": "tropical", "house_system": "equal"}}
160
162
  HOUSE_SYSTEM_READINESS_INPUT = {"birth": BIRTH, "profile": {"zodiac": "tropical"}}
163
+ HOUSE_PLACEMENT_STABILITY_INPUT = HOUSE_SYSTEM_READINESS_INPUT
161
164
  CHART_ROBUSTNESS_INPUT = {"birth_time": {"status": "approximate", "date": "2000-01-01", "time": "12:00", "timezone": "UTC", "uncertainty_minutes": 30}, "lat": 0, "lon": 0, "profiles": [{"zodiac": "tropical", "house_system": "equal"}, {"zodiac": "sidereal", "ayanamsa": "lahiri", "house_system": "whole_sign"}]}
162
165
  ROUTES += [
163
166
  ("event_rule_search", "event-rule-search", RULE_INPUT, {"type": "event_rule_search", "status": "beta", "rule_analysis": {}, "matching_samples": [], "sampled_candidate_windows": [], "metadata": {}}),
@@ -166,6 +169,7 @@ ROUTES += [
166
169
  ("civil_time_audit", "civil-time-audit", CIVIL_TIME_AUDIT_INPUT, {"type": "civil_time_audit", "status": "beta", "resolution": {}, "profile": {}, "calculation_ready": False, "requires_selection": True, "candidates": [], "comparison": {}, "metadata": {}}),
167
170
  ("chart_input_readiness", "chart-input-readiness", CHART_INPUT_READINESS_INPUT, {"type": "chart_input_readiness", "status": "beta", "birth_time_status": "exact", "profile": {}, "resolution": {}, "exact_chart_ready": False, "next_action": "select_civil_time_candidate", "workflows": [{}, {}, {}, {}], "fact_evidence": [], "summary": {}, "evidence": {}, "metadata": {}}),
168
171
  ("house_system_readiness", "house-system-readiness", HOUSE_SYSTEM_READINESS_INPUT, {"type": "house_system_readiness", "status": "beta", "input": BIRTH, "profile": {}, "systems": [{} for _ in range(25)], "summary": {}, "fallback": {"performed": False, "selected_system": None}, "metadata": {}}),
172
+ ("house_placement_stability", "house-placement-stability", HOUSE_PLACEMENT_STABILITY_INPUT, {"type": "house_placement_stability", "status": "beta", "input": BIRTH, "profile": {}, "systems": [{} for _ in range(25)], "planets": [{} for _ in range(10)], "placement_groups": [], "summary": {}, "fallback": {"performed": False, "selected_system": None}, "metadata": {}}),
169
173
  ]
170
174
 
171
175
  @contextmanager