From d312efbc78a0b899e5bb413bfb64d507f7b472da Mon Sep 17 00:00:00 2001 From: 732642856 <732642856@qq.com> Date: Sun, 19 Jul 2026 16:46:35 +0800 Subject: [PATCH] feat: sync high value technique gap registries --- ...dvanced_usage_gap_registry_2026_07_19.json | 66 ++++++++++++++ ...y_full_system_gap_registry_2026_07_19.json | 66 ++++++++++++++ .../evidence_packet_index_2026_07_19.json | 44 +++++++++- ...cision_timing_gap_registry_2026_07_19.json | 66 ++++++++++++++ ...a_full_system_gap_registry_2026_07_19.json | 66 ++++++++++++++ scripts/kp_precision_timing_probe.py | 88 +++++++++++++++++++ tests/test_high_value_gap_registries.py | 78 ++++++++++++++++ tests/test_kp_precision_timing_probe.py | 50 +++++++++++ 8 files changed, 522 insertions(+), 2 deletions(-) create mode 100644 references/oracle/ashtakavarga_advanced_usage_gap_registry_2026_07_19.json create mode 100644 references/oracle/compatibility_full_system_gap_registry_2026_07_19.json create mode 100644 references/oracle/kp_precision_timing_gap_registry_2026_07_19.json create mode 100644 references/oracle/muhurta_full_system_gap_registry_2026_07_19.json create mode 100644 scripts/kp_precision_timing_probe.py create mode 100644 tests/test_high_value_gap_registries.py create mode 100644 tests/test_kp_precision_timing_probe.py diff --git a/references/oracle/ashtakavarga_advanced_usage_gap_registry_2026_07_19.json b/references/oracle/ashtakavarga_advanced_usage_gap_registry_2026_07_19.json new file mode 100644 index 00000000..07cd760a --- /dev/null +++ b/references/oracle/ashtakavarga_advanced_usage_gap_registry_2026_07_19.json @@ -0,0 +1,66 @@ +{ + "scope": "ashtakavarga_advanced_usage_gap_registry", + "created_at": "2026-07-19", + "status": "gap_registry_v1", + "production_tuning_allowed": false, + "source_scan_policy": "Separate core BAV/SAV calculation from advanced transit, age and relationship usage claims.", + "top_external_references": [ + { + "name": "Kala calculation list", + "url": "https://www.vedic-astrology.net/kala/List-of-Calculations.asp", + "relevance": "Top-tier Ashtakavarga usage reference: Kakshas, sensitive transit nakshatras/rashis, important ages and relationship overlays." + }, + { + "name": "PyJHora", + "url": "https://github.com/naturalstupid/PyJHora", + "relevance": "External AGPL oracle/reference candidate for Ashtakavarga variants; do not vendor." + } + ], + "items": [ + { + "technique_id": "bav_sav_core", + "local_code_status": "present", + "skill_invocation_status": "invoked", + "api_ui_entry_status": "present", + "external_oracle_status": "partial", + "commercial_sync_status": "ready_after_guarded_contract", + "claim_boundary": "Core BAV/SAV can be used with method-variant and parity boundary." + }, + { + "technique_id": "kakshya_transit", + "local_code_status": "missing_runtime", + "skill_invocation_status": "not_invoked", + "api_ui_entry_status": "missing", + "external_oracle_status": "missing", + "commercial_sync_status": "blocked_until_oracle", + "claim_boundary": "Observation-only design item; do not use for precise transit timing until source and holdout gates close." + }, + { + "technique_id": "sensitive_transit_nakshatra_rashi", + "local_code_status": "missing_runtime", + "skill_invocation_status": "reference_only", + "api_ui_entry_status": "missing", + "external_oracle_status": "missing", + "commercial_sync_status": "blocked_until_oracle", + "claim_boundary": "Research-only until rules, source examples and negative controls are available." + }, + { + "technique_id": "important_ages_directional_usage", + "local_code_status": "missing_runtime", + "skill_invocation_status": "not_invoked", + "api_ui_entry_status": "missing", + "external_oracle_status": "missing", + "commercial_sync_status": "research_only", + "claim_boundary": "Do not infer life events from age/direction lists without verified case calibration." + }, + { + "technique_id": "annual_sav_timing_scan", + "local_code_status": "missing_runtime", + "skill_invocation_status": "not_invoked", + "api_ui_entry_status": "missing", + "external_oracle_status": "missing", + "commercial_sync_status": "blocked_until_oracle", + "claim_boundary": "Blocked for verified timing until independent negative holdout passes." + } + ] +} diff --git a/references/oracle/compatibility_full_system_gap_registry_2026_07_19.json b/references/oracle/compatibility_full_system_gap_registry_2026_07_19.json new file mode 100644 index 00000000..2edfc39a --- /dev/null +++ b/references/oracle/compatibility_full_system_gap_registry_2026_07_19.json @@ -0,0 +1,66 @@ +{ + "scope": "compatibility_full_system_gap_registry", + "created_at": "2026-07-19", + "status": "gap_registry_v1", + "production_tuning_allowed": false, + "source_scan_policy": "Separate mature match-score modules from advanced compatibility overlays and Western-style composite techniques.", + "top_external_references": [ + { + "name": "Kala calculation list", + "url": "https://www.vedic-astrology.net/kala/List-of-Calculations.asp", + "relevance": "Compatibility feature reference: Kutas from Moon/planets/Lagna, Rajju/Vedha/Stree Deergha/Mahendra/Vasya, interaspects, Davidson, Composite and AV overlay." + }, + { + "name": "Local relationship registry", + "url": "references/oracle/relationship_combinations_rule_family_registry_2026_07_19.json", + "relevance": "Current local indexed relationship-combination families requiring source closure and tests." + } + ], + "items": [ + { + "technique_id": "ashtakoota_core", + "local_code_status": "present", + "skill_invocation_status": "invoked", + "api_ui_entry_status": "present", + "external_oracle_status": "partial", + "commercial_sync_status": "ready_after_guarded_contract", + "claim_boundary": "Usable as compatibility factor, not deterministic marriage outcome." + }, + { + "technique_id": "extended_koota_planet_lagna", + "local_code_status": "partial_or_missing", + "skill_invocation_status": "reference_only", + "api_ui_entry_status": "missing", + "external_oracle_status": "missing", + "commercial_sync_status": "blocked_until_oracle", + "claim_boundary": "Do not claim full top-tier compatibility until planet/Lagna Kuta variants and examples are validated." + }, + { + "technique_id": "relationship_combinations_rule_families", + "local_code_status": "registry_only", + "skill_invocation_status": "not_invoked", + "api_ui_entry_status": "missing", + "external_oracle_status": "missing", + "commercial_sync_status": "research_only", + "claim_boundary": "Research-only until deduplication, source packet and tests exist." + }, + { + "technique_id": "relationship_av_overlay", + "local_code_status": "missing_runtime", + "skill_invocation_status": "not_invoked", + "api_ui_entry_status": "missing", + "external_oracle_status": "missing", + "commercial_sync_status": "blocked_until_oracle", + "claim_boundary": "Observation-only until Ashtakavarga relationship overlay rules and examples close." + }, + { + "technique_id": "composite_davidson_charts", + "local_code_status": "missing_runtime", + "skill_invocation_status": "not_invoked", + "api_ui_entry_status": "missing", + "external_oracle_status": "not_applicable_vedic_core", + "commercial_sync_status": "not_for_commercial_runtime", + "claim_boundary": "Western-derived compatibility overlay; keep out of Vedic commercial runtime unless explicitly scoped as cross-system research." + } + ] +} diff --git a/references/oracle/evidence_packet_index_2026_07_19.json b/references/oracle/evidence_packet_index_2026_07_19.json index 864d0cf0..6554c8bd 100644 --- a/references/oracle/evidence_packet_index_2026_07_19.json +++ b/references/oracle/evidence_packet_index_2026_07_19.json @@ -5,8 +5,8 @@ "production_tuning_allowed": false, "boundary": "Index of current governance packets only. Raw oracle artifacts remain in references/oracle/artifacts and are not all duplicated here.", "summary": { - "packet_count": 21, - "blocked_or_partial_count": 13, + "packet_count": 26, + "blocked_or_partial_count": 20, "human_review_required_count": 1 }, "packets": [ @@ -177,6 +177,46 @@ "claim_status": "partial", "consumer_policy": "research_only", "claim_boundary": "All planned rectification layers have partial guarded runtime surfaces; Shadbala-AV remains formula/unit partial and Gochara remains negative-holdout blocked, so outputs stay exploratory." + }, + { + "packet_id": "kp_precision_timing_gap_registry", + "path": "references/oracle/kp_precision_timing_gap_registry_2026_07_19.json", + "domain": "kp_precision_timing", + "claim_status": "partial", + "consumer_policy": "research_to_commercial_contract_only", + "claim_boundary": "KP precision timing gap registry exists; star/sub-lord, ruling planets and significator tables remain blocked until source/oracle/holdout gates close." + }, + { + "packet_id": "muhurta_full_system_gap_registry", + "path": "references/oracle/muhurta_full_system_gap_registry_2026_07_19.json", + "domain": "muhurta", + "claim_status": "partial", + "consumer_policy": "research_to_commercial_contract_only", + "claim_boundary": "Panchanga base exists, but full Muhurta scoring remains blocked until Tarabala/Chandrabala/Panchaka/Rahu Kalam examples and source contracts close." + }, + { + "packet_id": "ashtakavarga_advanced_usage_gap_registry", + "path": "references/oracle/ashtakavarga_advanced_usage_gap_registry_2026_07_19.json", + "domain": "ashtakavarga_advanced_usage", + "claim_status": "partial", + "consumer_policy": "research_to_commercial_contract_only", + "claim_boundary": "Core BAV/SAV exists; Kakshya transit, sensitive transit signs/nakshatras and annual SAV timing remain observation-only until oracle/holdout gates close." + }, + { + "packet_id": "compatibility_full_system_gap_registry", + "path": "references/oracle/compatibility_full_system_gap_registry_2026_07_19.json", + "domain": "compatibility", + "claim_status": "partial", + "consumer_policy": "research_to_commercial_contract_only", + "claim_boundary": "Ashtakoota core exists; extended planet/Lagna Kuta, relationship AV overlay and rule-family combinations remain partial/research-only." + }, + { + "packet_id": "kp_precision_timing_probe", + "path": "scripts/kp_precision_timing_probe.py", + "domain": "kp_precision_timing", + "claim_status": "partial", + "consumer_policy": "research_to_commercial_contract_only", + "claim_boundary": "KP star/sub-lord and significator probe exposes raw fields and hash, but cannot drive precise event timing without exact KP cusp oracle and independent negative holdout validation." } ] } diff --git a/references/oracle/kp_precision_timing_gap_registry_2026_07_19.json b/references/oracle/kp_precision_timing_gap_registry_2026_07_19.json new file mode 100644 index 00000000..6c486d3f --- /dev/null +++ b/references/oracle/kp_precision_timing_gap_registry_2026_07_19.json @@ -0,0 +1,66 @@ +{ + "scope": "kp_precision_timing_gap_registry", + "created_at": "2026-07-19", + "status": "gap_registry_v1", + "production_tuning_allowed": false, + "source_scan_policy": "Local repo + referenced OSS/web sources only; .workbuddy remains read-only reference.", + "top_external_references": [ + { + "name": "VedicAstro", + "url": "https://github.com/diliprk/VedicAstro", + "relevance": "KP-focused open source surface: planet/house significators, KP horary ascendant, nakshatra/sub-lord style timing candidates." + }, + { + "name": "Kala calculation list", + "url": "https://www.vedic-astrology.net/kala/List-of-Calculations.asp", + "relevance": "Commercial top-tier feature reference for KP cusps, nakshatra lords and sub-lords." + } + ], + "items": [ + { + "technique_id": "kp_cusps", + "local_code_status": "partial", + "skill_invocation_status": "reference_only", + "api_ui_entry_status": "partial_api_no_truth_gate", + "external_oracle_status": "missing", + "commercial_sync_status": "blocked_until_oracle", + "claim_boundary": "Reference/probe only until KP house cusp settings, ayanamsa, Placidus/KP house contract and numeric oracle pass." + }, + { + "technique_id": "star_sub_lord", + "local_code_status": "minimal_probe_present", + "skill_invocation_status": "not_invoked_runtime_probe_available", + "api_ui_entry_status": "missing_api_probe_script_available", + "external_oracle_status": "partial_sublord_csv_only", + "commercial_sync_status": "blocked_until_oracle", + "claim_boundary": "Reference/probe only; KP star/sub-lord fields are exposed by scripts/kp_precision_timing_probe.py but cannot make precise event claims until exact cusp oracle and holdout gates close." + }, + { + "technique_id": "ruling_planets", + "local_code_status": "missing_runtime", + "skill_invocation_status": "not_invoked", + "api_ui_entry_status": "missing", + "external_oracle_status": "missing", + "commercial_sync_status": "blocked_until_oracle", + "claim_boundary": "Reference/probe only; ruling planets cannot drive rectification or timing before external oracle and negative holdout gates." + }, + { + "technique_id": "kp_significators", + "local_code_status": "minimal_probe_present", + "skill_invocation_status": "not_invoked_runtime_probe_available", + "api_ui_entry_status": "missing_api_probe_script_available", + "external_oracle_status": "missing_significator_oracle", + "commercial_sync_status": "blocked_until_oracle", + "claim_boundary": "Reference/probe only; significator ABCD tables are exposed by scripts/kp_precision_timing_probe.py but require exact cusp contract and field-level oracle before runtime use." + }, + { + "technique_id": "kp_horary", + "local_code_status": "missing_runtime", + "skill_invocation_status": "not_invoked", + "api_ui_entry_status": "missing", + "external_oracle_status": "missing", + "commercial_sync_status": "research_only", + "claim_boundary": "Research-only until question-time input contract, KP number handling, and external examples are available." + } + ] +} diff --git a/references/oracle/muhurta_full_system_gap_registry_2026_07_19.json b/references/oracle/muhurta_full_system_gap_registry_2026_07_19.json new file mode 100644 index 00000000..34485cc2 --- /dev/null +++ b/references/oracle/muhurta_full_system_gap_registry_2026_07_19.json @@ -0,0 +1,66 @@ +{ + "scope": "muhurta_full_system_gap_registry", + "created_at": "2026-07-19", + "status": "gap_registry_v1", + "production_tuning_allowed": false, + "source_scan_policy": "Compare local Panchanga/Muhurta fragments against top-tier Muhurta software surfaces before implementation.", + "top_external_references": [ + { + "name": "Kala calculation list", + "url": "https://www.vedic-astrology.net/kala/List-of-Calculations.asp", + "relevance": "Extensive Muhurta feature surface: Vara, Hora, Rahu Kalam, Sankranti, Vyatipata, Vaidhriti and Panchanga factors." + }, + { + "name": "dashaflow reference candidate", + "url": "references/open_source_sources/dashaflow", + "relevance": "Local OSS candidate requiring license/formula audit before adaptation." + } + ], + "items": [ + { + "technique_id": "panchanga_base", + "local_code_status": "present", + "skill_invocation_status": "invoked_as_supporting_layer", + "api_ui_entry_status": "partial", + "external_oracle_status": "partial", + "commercial_sync_status": "ready_after_guarded_contract", + "claim_boundary": "Can support day context, but cannot be marketed as full Muhurta scoring." + }, + { + "technique_id": "full_muhurta_scoring", + "local_code_status": "missing_runtime", + "skill_invocation_status": "reference_only", + "api_ui_entry_status": "missing", + "external_oracle_status": "missing", + "commercial_sync_status": "blocked_until_oracle", + "claim_boundary": "Do not present as auspicious-date selection until Tarabala/Chandrabala/Panchaka/Rahu Kalam weights and examples are validated." + }, + { + "technique_id": "tarabala_chandrabala", + "local_code_status": "partial_or_fragment", + "skill_invocation_status": "not_invoked", + "api_ui_entry_status": "missing", + "external_oracle_status": "missing", + "commercial_sync_status": "blocked_until_oracle", + "claim_boundary": "Observation-only until natal Moon matching, Tara sequence, Chandra Bala rules and external examples pass." + }, + { + "technique_id": "rahu_yamaganda_gulika_kalam", + "local_code_status": "partial", + "skill_invocation_status": "not_invoked", + "api_ui_entry_status": "missing", + "external_oracle_status": "partial", + "commercial_sync_status": "ready_after_guarded_contract", + "claim_boundary": "Can be shown as Panchanga interval after sunrise/sunset contract; not a full Muhurta verdict." + }, + { + "technique_id": "abhijit_sankranti_vyatipata_vaidhriti", + "local_code_status": "missing_runtime", + "skill_invocation_status": "reference_only", + "api_ui_entry_status": "missing", + "external_oracle_status": "missing", + "commercial_sync_status": "blocked_until_oracle", + "claim_boundary": "Reference-only until formula source, timezone handling and worked examples close." + } + ] +} diff --git a/scripts/kp_precision_timing_probe.py b/scripts/kp_precision_timing_probe.py new file mode 100644 index 00000000..c2c6bd0e --- /dev/null +++ b/scripts/kp_precision_timing_probe.py @@ -0,0 +1,88 @@ +#!/usr/bin/env python3 +"""Minimal KP star/sub-lord + significator probe. + +This is a probe artifact, not a timing oracle. It reuses the local +`kp_system.py` implementation and keeps exact event timing blocked until +external examples and negative holdout validation exist. +""" + +from __future__ import annotations + +import hashlib +import json +from pathlib import Path +from typing import Any + +from kp_system import calc_kp_analysis + + +ROOT = Path(__file__).resolve().parents[1] + + +CANONICAL_PLANETS = { + "Sun": {"sign": "Aries", "degree": 10.0, "house": 1}, + "Moon": {"sign": "Taurus", "degree": 5.0, "house": 2}, + "Mars": {"sign": "Gemini", "degree": 18.0, "house": 3}, + "Mercury": {"sign": "Pisces", "degree": 22.0, "house": 12}, + "Jupiter": {"sign": "Cancer", "degree": 12.0, "house": 4}, + "Venus": {"sign": "Aquarius", "degree": 27.0, "house": 11}, + "Saturn": {"sign": "Capricorn", "degree": 3.0, "house": 10}, + "Rahu": {"sign": "Scorpio", "degree": 17.0, "house": 8}, + "Ketu": {"sign": "Taurus", "degree": 17.0, "house": 2}, +} + + +def _stable_hash(data: Any) -> str: + payload = json.dumps(data, ensure_ascii=False, sort_keys=True, separators=(",", ":")) + return hashlib.sha256(payload.encode("utf-8")).hexdigest() + + +def build_probe() -> dict[str, Any]: + raw = calc_kp_analysis(CANONICAL_PLANETS, asc_sign="Aries") + planets = raw.get("planets", {}) + houses = raw.get("houses", {}) + kp_lords_by_planet = { + planet: value.get("kp_lords", {}) + for planet, value in sorted(planets.items()) + } + planet_significators = { + planet: value.get("significators", {}) + for planet, value in sorted(planets.items()) + } + house_significators = { + str(house): value.get("significators", {}) + for house, value in sorted(houses.items(), key=lambda item: int(item[0])) + } + return { + "scope": "kp_star_sub_lord_significator_probe", + "created_at": "2026-07-19", + "production_tuning_allowed": False, + "claim_status": "probe_only_not_timing_truth", + "external_oracle_status": "partial_sublord_csv_only", + "negative_holdout_status": "missing", + "input_contract": { + "planet_format": "{planet: {sign, degree_in_sign, house}}", + "asc_sign": "Aries", + "ayanamsa": "caller_supplied_sidereal_positions", + "house_contract": "whole-sign house probe, not precise KP cusp oracle", + }, + "local_reuse": { + "module": "scripts/kp_system.py", + "functions": ["calc_kp_analysis", "get_kp_lords", "get_planet_significators", "get_house_significators"], + "license_boundary": "Local implementation cites diliprk/VedicAstro MIT; keep source/oracle audit before commercial precise timing.", + }, + "kp_lords_by_planet": kp_lords_by_planet, + "planet_significators": planet_significators, + "house_significators": house_significators, + "raw_sha256": _stable_hash(raw), + "claim_boundary": "This probe can expose KP star/sub-lord and significator fields, but cannot drive precise event timing without exact KP cusp oracle and independent negative holdout validation.", + } + + +def main() -> int: + print(json.dumps(build_probe(), ensure_ascii=False, indent=2, sort_keys=True)) + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/tests/test_high_value_gap_registries.py b/tests/test_high_value_gap_registries.py new file mode 100644 index 00000000..46c628b0 --- /dev/null +++ b/tests/test_high_value_gap_registries.py @@ -0,0 +1,78 @@ +from __future__ import annotations + +import json +from pathlib import Path + + +ROOT = Path(__file__).resolve().parents[1] +REGISTRY_DIR = ROOT / "references/oracle" +REGISTRIES = [ + "kp_precision_timing_gap_registry_2026_07_19.json", + "muhurta_full_system_gap_registry_2026_07_19.json", + "ashtakavarga_advanced_usage_gap_registry_2026_07_19.json", + "compatibility_full_system_gap_registry_2026_07_19.json", +] +REQUIRED_FIELDS = { + "technique_id", + "local_code_status", + "skill_invocation_status", + "api_ui_entry_status", + "external_oracle_status", + "commercial_sync_status", + "claim_boundary", +} + + +def _load(name: str) -> dict: + return json.loads((REGISTRY_DIR / name).read_text(encoding="utf-8")) + + +def test_high_value_gap_registries_exist_and_keep_required_fields() -> None: + for name in REGISTRIES: + data = _load(name) + assert data["status"] == "gap_registry_v1" + assert data["production_tuning_allowed"] is False + assert data["items"] + for item in data["items"]: + assert REQUIRED_FIELDS.issubset(item) + assert item["claim_boundary"] + assert item["commercial_sync_status"] in { + "ready_after_guarded_contract", + "research_only", + "blocked_until_oracle", + "not_for_commercial_runtime", + } + + +def test_kp_registry_keeps_precision_timing_blocked_without_oracle() -> None: + data = _load("kp_precision_timing_gap_registry_2026_07_19.json") + ids = {item["technique_id"]: item for item in data["items"]} + assert {"kp_cusps", "star_sub_lord", "ruling_planets", "kp_significators", "kp_horary"}.issubset(ids) + assert ids["star_sub_lord"]["local_code_status"] == "minimal_probe_present" + assert ids["star_sub_lord"]["external_oracle_status"] == "partial_sublord_csv_only" + assert ids["kp_significators"]["local_code_status"] == "minimal_probe_present" + assert ids["kp_significators"]["claim_boundary"].startswith("Reference/probe only") + + +def test_muhurta_registry_distinguishes_panchanga_from_full_muhurta() -> None: + data = _load("muhurta_full_system_gap_registry_2026_07_19.json") + ids = {item["technique_id"]: item for item in data["items"]} + assert ids["panchanga_base"]["local_code_status"] == "present" + assert ids["full_muhurta_scoring"]["local_code_status"] == "missing_runtime" + assert ids["full_muhurta_scoring"]["claim_boundary"].startswith("Do not present") + + +def test_ashtakavarga_advanced_registry_keeps_advanced_usage_observation_only() -> None: + data = _load("ashtakavarga_advanced_usage_gap_registry_2026_07_19.json") + ids = {item["technique_id"]: item for item in data["items"]} + assert ids["bav_sav_core"]["local_code_status"] == "present" + assert ids["kakshya_transit"]["external_oracle_status"] == "missing" + assert ids["annual_sav_timing_scan"]["commercial_sync_status"] == "blocked_until_oracle" + + +def test_compatibility_registry_separates_basic_koota_from_advanced_overlays() -> None: + data = _load("compatibility_full_system_gap_registry_2026_07_19.json") + ids = {item["technique_id"]: item for item in data["items"]} + assert ids["ashtakoota_core"]["local_code_status"] == "present" + assert ids["composite_davidson_charts"]["commercial_sync_status"] == "not_for_commercial_runtime" + assert ids["relationship_av_overlay"]["external_oracle_status"] == "missing" diff --git a/tests/test_kp_precision_timing_probe.py b/tests/test_kp_precision_timing_probe.py new file mode 100644 index 00000000..237adedb --- /dev/null +++ b/tests/test_kp_precision_timing_probe.py @@ -0,0 +1,50 @@ +from __future__ import annotations + +import json +import subprocess +import sys +from pathlib import Path + + +ROOT = Path(__file__).resolve().parents[1] +PROBE = ROOT / "scripts" / "kp_precision_timing_probe.py" + + +def test_kp_precision_timing_probe_outputs_star_sub_lord_and_significators() -> None: + completed = subprocess.run( + [sys.executable, str(PROBE)], + cwd=ROOT, + check=True, + capture_output=True, + text=True, + ) + report = json.loads(completed.stdout) + + assert report["scope"] == "kp_star_sub_lord_significator_probe" + assert report["claim_status"] == "probe_only_not_timing_truth" + assert report["production_tuning_allowed"] is False + assert report["raw_sha256"] + + assert "Sun" in report["kp_lords_by_planet"] + sun_lords = report["kp_lords_by_planet"]["Sun"] + assert {"rasi_lord", "nakshatra_lord", "sub_lord", "sub_sub_lord"} <= set(sun_lords) + + assert "Sun" in report["planet_significators"] + assert {"A", "B", "C", "D"} <= set(report["planet_significators"]["Sun"]) + assert "10" in report["house_significators"] + assert {"A", "B", "C", "D"} <= set(report["house_significators"]["10"]) + + +def test_kp_precision_timing_probe_preserves_oracle_and_holdout_blockers() -> None: + completed = subprocess.run( + [sys.executable, str(PROBE)], + cwd=ROOT, + check=True, + capture_output=True, + text=True, + ) + report = json.loads(completed.stdout) + + assert report["external_oracle_status"] == "partial_sublord_csv_only" + assert report["negative_holdout_status"] == "missing" + assert "cannot drive precise event timing" in report["claim_boundary"]