feat: sync oracle closure probes

This commit is contained in:
732642856
2026-07-19 18:36:25 +08:00
parent 4e695ab15c
commit d6c2a3ece5
31 changed files with 162876 additions and 14 deletions
@@ -0,0 +1,69 @@
{
"contract": "references/cross_project_contract/commercial_astrology_e2e_acceptance_questions_2026_07_19.json",
"question_count": 10,
"rows": [
{
"forbidden_claim_hits": [],
"id": "marriage_timing",
"missing_layers": [],
"status": "pass"
},
{
"forbidden_claim_hits": [],
"id": "career_direction",
"missing_layers": [],
"status": "pass"
},
{
"forbidden_claim_hits": [],
"id": "wealth_pattern",
"missing_layers": [],
"status": "pass"
},
{
"forbidden_claim_hits": [],
"id": "health_risk_window",
"missing_layers": [],
"status": "pass"
},
{
"forbidden_claim_hits": [],
"id": "foreign_migration",
"missing_layers": [],
"status": "pass"
},
{
"forbidden_claim_hits": [],
"id": "family_home_children",
"missing_layers": [],
"status": "pass"
},
{
"forbidden_claim_hits": [],
"id": "education_learning_path",
"missing_layers": [],
"status": "pass"
},
{
"forbidden_claim_hits": [],
"id": "precise_timing_boundary",
"missing_layers": [],
"status": "pass"
},
{
"forbidden_claim_hits": [],
"id": "birth_time_uncertain",
"missing_layers": [],
"status": "pass"
},
{
"forbidden_claim_hits": [],
"id": "annual_forecast",
"missing_layers": [],
"status": "pass"
}
],
"runtime_context_required": true,
"scope": "commercial_astrology_e2e_acceptance_runner",
"status": "pass"
}
@@ -0,0 +1,238 @@
{
"contract": "references/cross_project_contract/commercial_astrology_e2e_acceptance_questions_2026_07_19.json",
"output_dir": "artifacts/commercial_astrology_e2e_contexts_2026_07_19_run6",
"question_count": 10,
"rows": [
{
"available_layers": [
"A10",
"A7",
"D1",
"D10",
"D2",
"D4",
"D9",
"UL",
"dasha_boundaries",
"functional_benefic_malefic",
"house_degrees",
"narayana_dasha",
"planet_degrees",
"shadbala"
],
"context_file": "artifacts/commercial_astrology_e2e_contexts_2026_07_19_run6/marriage_timing.json",
"core_status": "ready",
"id": "marriage_timing",
"missing_route_layers": [],
"route": "relationship"
},
{
"available_layers": [
"A10",
"A7",
"D1",
"D10",
"D2",
"D4",
"D9",
"UL",
"dasha_boundaries",
"functional_benefic_malefic",
"house_degrees",
"narayana_dasha",
"planet_degrees",
"shadbala"
],
"context_file": "artifacts/commercial_astrology_e2e_contexts_2026_07_19_run6/career_direction.json",
"core_status": "ready",
"id": "career_direction",
"missing_route_layers": [],
"route": "career"
},
{
"available_layers": [
"A10",
"A7",
"D1",
"D10",
"D2",
"D4",
"D9",
"UL",
"dasha_boundaries",
"functional_benefic_malefic",
"house_degrees",
"narayana_dasha",
"planet_degrees",
"shadbala"
],
"context_file": "artifacts/commercial_astrology_e2e_contexts_2026_07_19_run6/wealth_pattern.json",
"core_status": "ready",
"id": "wealth_pattern",
"missing_route_layers": [],
"route": "finance"
},
{
"available_layers": [
"A10",
"A7",
"D1",
"D10",
"D2",
"D4",
"D9",
"UL",
"dasha_boundaries",
"functional_benefic_malefic",
"house_degrees",
"narayana_dasha",
"planet_degrees",
"shadbala"
],
"context_file": "artifacts/commercial_astrology_e2e_contexts_2026_07_19_run6/health_risk_window.json",
"core_status": "ready",
"id": "health_risk_window",
"missing_route_layers": [],
"route": "general"
},
{
"available_layers": [
"A10",
"A7",
"D1",
"D10",
"D2",
"D4",
"D9",
"UL",
"dasha_boundaries",
"functional_benefic_malefic",
"house_degrees",
"narayana_dasha",
"planet_degrees",
"shadbala"
],
"context_file": "artifacts/commercial_astrology_e2e_contexts_2026_07_19_run6/foreign_migration.json",
"core_status": "ready",
"id": "foreign_migration",
"missing_route_layers": [],
"route": "career"
},
{
"available_layers": [
"A10",
"A7",
"D1",
"D10",
"D2",
"D4",
"D9",
"UL",
"dasha_boundaries",
"functional_benefic_malefic",
"house_degrees",
"narayana_dasha",
"planet_degrees",
"shadbala"
],
"context_file": "artifacts/commercial_astrology_e2e_contexts_2026_07_19_run6/family_home_children.json",
"core_status": "ready",
"id": "family_home_children",
"missing_route_layers": [],
"route": "finance"
},
{
"available_layers": [
"A10",
"A7",
"D1",
"D10",
"D2",
"D4",
"D9",
"UL",
"dasha_boundaries",
"functional_benefic_malefic",
"house_degrees",
"narayana_dasha",
"planet_degrees",
"shadbala"
],
"context_file": "artifacts/commercial_astrology_e2e_contexts_2026_07_19_run6/education_learning_path.json",
"core_status": "ready",
"id": "education_learning_path",
"missing_route_layers": [],
"route": "career"
},
{
"available_layers": [
"A10",
"A7",
"D1",
"D10",
"D2",
"D4",
"D9",
"UL",
"dasha_boundaries",
"functional_benefic_malefic",
"house_degrees",
"narayana_dasha",
"planet_degrees",
"shadbala"
],
"context_file": "artifacts/commercial_astrology_e2e_contexts_2026_07_19_run6/precise_timing_boundary.json",
"core_status": "ready",
"id": "precise_timing_boundary",
"missing_route_layers": [],
"route": "career"
},
{
"available_layers": [
"A10",
"A7",
"D1",
"D10",
"D2",
"D4",
"D9",
"UL",
"dasha_boundaries",
"functional_benefic_malefic",
"house_degrees",
"narayana_dasha",
"planet_degrees",
"shadbala"
],
"context_file": "artifacts/commercial_astrology_e2e_contexts_2026_07_19_run6/birth_time_uncertain.json",
"core_status": "ready",
"id": "birth_time_uncertain",
"missing_route_layers": [],
"route": "career"
},
{
"available_layers": [
"A10",
"A7",
"D1",
"D10",
"D2",
"D4",
"D9",
"UL",
"dasha_boundaries",
"functional_benefic_malefic",
"house_degrees",
"narayana_dasha",
"planet_degrees",
"shadbala"
],
"context_file": "artifacts/commercial_astrology_e2e_contexts_2026_07_19_run6/annual_forecast.json",
"core_status": "ready",
"id": "annual_forecast",
"missing_route_layers": [],
"route": "career"
}
],
"scope": "commercial_astrology_e2e_context_capture"
}
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,238 @@
{
"contract": "references/cross_project_contract/commercial_astrology_e2e_acceptance_questions_2026_07_19.json",
"output_dir": "artifacts/commercial_astrology_e2e_contexts_2026_07_19_run6",
"question_count": 10,
"rows": [
{
"available_layers": [
"A10",
"A7",
"D1",
"D10",
"D2",
"D4",
"D9",
"UL",
"dasha_boundaries",
"functional_benefic_malefic",
"house_degrees",
"narayana_dasha",
"planet_degrees",
"shadbala"
],
"context_file": "artifacts/commercial_astrology_e2e_contexts_2026_07_19_run6/marriage_timing.json",
"core_status": "ready",
"id": "marriage_timing",
"missing_route_layers": [],
"route": "relationship"
},
{
"available_layers": [
"A10",
"A7",
"D1",
"D10",
"D2",
"D4",
"D9",
"UL",
"dasha_boundaries",
"functional_benefic_malefic",
"house_degrees",
"narayana_dasha",
"planet_degrees",
"shadbala"
],
"context_file": "artifacts/commercial_astrology_e2e_contexts_2026_07_19_run6/career_direction.json",
"core_status": "ready",
"id": "career_direction",
"missing_route_layers": [],
"route": "career"
},
{
"available_layers": [
"A10",
"A7",
"D1",
"D10",
"D2",
"D4",
"D9",
"UL",
"dasha_boundaries",
"functional_benefic_malefic",
"house_degrees",
"narayana_dasha",
"planet_degrees",
"shadbala"
],
"context_file": "artifacts/commercial_astrology_e2e_contexts_2026_07_19_run6/wealth_pattern.json",
"core_status": "ready",
"id": "wealth_pattern",
"missing_route_layers": [],
"route": "finance"
},
{
"available_layers": [
"A10",
"A7",
"D1",
"D10",
"D2",
"D4",
"D9",
"UL",
"dasha_boundaries",
"functional_benefic_malefic",
"house_degrees",
"narayana_dasha",
"planet_degrees",
"shadbala"
],
"context_file": "artifacts/commercial_astrology_e2e_contexts_2026_07_19_run6/health_risk_window.json",
"core_status": "ready",
"id": "health_risk_window",
"missing_route_layers": [],
"route": "general"
},
{
"available_layers": [
"A10",
"A7",
"D1",
"D10",
"D2",
"D4",
"D9",
"UL",
"dasha_boundaries",
"functional_benefic_malefic",
"house_degrees",
"narayana_dasha",
"planet_degrees",
"shadbala"
],
"context_file": "artifacts/commercial_astrology_e2e_contexts_2026_07_19_run6/foreign_migration.json",
"core_status": "ready",
"id": "foreign_migration",
"missing_route_layers": [],
"route": "career"
},
{
"available_layers": [
"A10",
"A7",
"D1",
"D10",
"D2",
"D4",
"D9",
"UL",
"dasha_boundaries",
"functional_benefic_malefic",
"house_degrees",
"narayana_dasha",
"planet_degrees",
"shadbala"
],
"context_file": "artifacts/commercial_astrology_e2e_contexts_2026_07_19_run6/family_home_children.json",
"core_status": "ready",
"id": "family_home_children",
"missing_route_layers": [],
"route": "finance"
},
{
"available_layers": [
"A10",
"A7",
"D1",
"D10",
"D2",
"D4",
"D9",
"UL",
"dasha_boundaries",
"functional_benefic_malefic",
"house_degrees",
"narayana_dasha",
"planet_degrees",
"shadbala"
],
"context_file": "artifacts/commercial_astrology_e2e_contexts_2026_07_19_run6/education_learning_path.json",
"core_status": "ready",
"id": "education_learning_path",
"missing_route_layers": [],
"route": "career"
},
{
"available_layers": [
"A10",
"A7",
"D1",
"D10",
"D2",
"D4",
"D9",
"UL",
"dasha_boundaries",
"functional_benefic_malefic",
"house_degrees",
"narayana_dasha",
"planet_degrees",
"shadbala"
],
"context_file": "artifacts/commercial_astrology_e2e_contexts_2026_07_19_run6/precise_timing_boundary.json",
"core_status": "ready",
"id": "precise_timing_boundary",
"missing_route_layers": [],
"route": "career"
},
{
"available_layers": [
"A10",
"A7",
"D1",
"D10",
"D2",
"D4",
"D9",
"UL",
"dasha_boundaries",
"functional_benefic_malefic",
"house_degrees",
"narayana_dasha",
"planet_degrees",
"shadbala"
],
"context_file": "artifacts/commercial_astrology_e2e_contexts_2026_07_19_run6/birth_time_uncertain.json",
"core_status": "ready",
"id": "birth_time_uncertain",
"missing_route_layers": [],
"route": "career"
},
{
"available_layers": [
"A10",
"A7",
"D1",
"D10",
"D2",
"D4",
"D9",
"UL",
"dasha_boundaries",
"functional_benefic_malefic",
"house_degrees",
"narayana_dasha",
"planet_degrees",
"shadbala"
],
"context_file": "artifacts/commercial_astrology_e2e_contexts_2026_07_19_run6/annual_forecast.json",
"core_status": "ready",
"id": "annual_forecast",
"missing_route_layers": [],
"route": "career"
}
],
"scope": "commercial_astrology_e2e_context_capture"
}
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -1,5 +1,5 @@
{
"context_dir": "artifacts/commercial_astrology_e2e_contexts_2026_07_19_run5",
"context_dir": "artifacts/commercial_astrology_e2e_contexts_2026_07_19_run6",
"created_at": "2026-07-19",
"question_count": 10,
"root_cause_fixed": "commercial workflow now passes frontend-style question plus question_text and exposes domain_context_layers/domain_boundaries for gender, health, migration, family, education, rectification and annual forecast contexts",
@@ -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": 27,
"blocked_or_partial_count": 21,
"packet_count": 34,
"blocked_or_partial_count": 28,
"human_review_required_count": 1
},
"packets": [
@@ -225,6 +225,62 @@
"claim_status": "partial",
"consumer_policy": "research_only",
"claim_boundary": "Records local/OSS reusable candidates for KP, Muhurta, AV and compatibility; discovery only, no runtime truth upgrade."
},
{
"packet_id": "kp_cusp_precision_contract",
"path": "references/oracle/kp_cusp_precision_contract_2026_07_19.json",
"domain": "kp_precision_timing",
"claim_status": "blocked",
"consumer_policy": "research_to_commercial_contract_only",
"claim_boundary": "Exact KP cusp contract is defined, but numeric cusp oracle and negative timing holdout are missing; current runtime remains supporting probe only."
},
{
"packet_id": "high_rigor_closure_gate",
"path": "scripts/high_rigor_closure_gate.py",
"domain": "closure_governance",
"claim_status": "blocked",
"consumer_policy": "research_to_commercial_contract_only",
"claim_boundary": "Aggregates external numeric oracle, independent negative holdout, exact KP cusp and full scoring gates; blocks production tuning, verified timing and birth-time truth while any gate remains partial/blocked."
},
{
"packet_id": "kp_external_table_hash_manifest",
"path": "scripts/kp_external_table_hash_manifest.py",
"domain": "kp_precision_timing",
"claim_status": "partial",
"consumer_policy": "research_to_commercial_contract_only",
"claim_boundary": "KP external sub-lord table hash runner fixes fixture hash when present and reports fixture_missing when absent; no timing truth upgrade."
},
{
"packet_id": "kp_cusp_worked_example_oracle_queue",
"path": "references/oracle/kp_cusp_worked_example_oracle_queue_2026_07_19.json",
"domain": "kp_precision_timing",
"claim_status": "blocked",
"consumer_policy": "research_to_commercial_contract_only",
"claim_boundary": "Exact KP cusp worked-example queue defines required oracle fields; remains awaiting public numeric examples."
},
{
"packet_id": "muhurta_factor_probe",
"path": "scripts/muhurta_factor_probe.py",
"domain": "muhurta",
"claim_status": "partial",
"consumer_policy": "research_to_commercial_contract_only",
"claim_boundary": "Muhurta factor probe exposes Tarabala/Chandrabala/Rahu Kalam/Abhijit observations only; no verified Muhurta verdict."
},
{
"packet_id": "day_level_holdout_intake",
"path": "scripts/day_level_holdout_intake.py",
"domain": "timing_holdout",
"claim_status": "partial",
"consumer_policy": "research_only",
"claim_boundary": "Human annotation intake appends frozen independent labels; production tuning remains blocked until frozen gate passes."
},
{
"packet_id": "permissive_oss_worked_example_registry",
"path": "references/oracle/permissive_oss_worked_example_registry_2026_07_19.json",
"domain": "oss_reuse_and_worked_examples",
"claim_status": "observation_only",
"consumer_policy": "research_observation_only",
"claim_boundary": "Permissive OSS candidates and worked-example queues are registered for probes only; no truth-matrix or production-tuning upgrade."
}
]
}
@@ -0,0 +1,69 @@
{
"scope": "kp_cusp_precision_contract",
"created_at": "2026-07-19",
"status": "contract_v1",
"production_tuning_allowed": false,
"exact_cusp_status": "blocked_missing_oracle",
"current_runtime_cusp_mode": "whole_sign_house_center_probe",
"kp_significator_runtime_policy": "supporting_probe_only",
"boundary": "This contract separates current KP field probes from exact KP cusp timing. Current local significator tables use whole-sign/house-center probe houses and must not be treated as precise KP cusps.",
"claim_boundary": "KP star/sub-lord, ruling planets and significator probes can support research inspection, but cannot drive precise event timing until exact cusp calculation, external numeric oracle and independent negative holdout validation pass.",
"required_exact_cusp_inputs": [
{
"field": "birth_or_question_datetime",
"reason": "KP cusps are time-sensitive and must use the exact event/question timestamp."
},
{
"field": "latitude",
"reason": "House cusps depend on local latitude."
},
{
"field": "longitude",
"reason": "House cusps depend on local longitude and local sidereal time."
},
{
"field": "timezone",
"reason": "Timezone and DST must be explicit before sidereal time/cusp calculation."
},
{
"field": "ayanamsa",
"reason": "KP cusps and star/sub-lord fields require a fixed sidereal setting."
},
{
"field": "house_system",
"reason": "KP typically uses a Placidus-style cusp workflow; the runtime must not silently substitute whole-sign houses."
}
],
"required_oracles": [
{
"oracle_id": "kp_cusp_numeric_worked_example",
"status": "missing",
"required_fields": ["house_number", "cusp_longitude", "sign", "rasi_lord", "star_lord", "sub_lord", "sub_sub_lord"],
"claim_boundary": "Needed before exact cusp fields can be marked verified."
},
{
"oracle_id": "kp_significator_field_example",
"status": "missing",
"required_fields": ["planet_significator_A", "planet_significator_B", "planet_significator_C", "planet_significator_D", "house_significator_A", "house_significator_B", "house_significator_C", "house_significator_D"],
"claim_boundary": "Needed before ABCD significator tables can be used beyond probe status."
},
{
"oracle_id": "negative_holdout_timing_set",
"status": "missing",
"required_fields": ["positive_event_window", "negative_non_event_windows", "blind_ranking_protocol"],
"claim_boundary": "Needed before KP timing can upgrade from exploratory candidate to verified timing claim."
}
],
"safe_runtime_policy": {
"allowed": [
"Expose probe fields with raw hash",
"Use KP fields as downgrade-only or supporting context",
"Show exact-cusp blocker in Technique Audit Table"
],
"blocked": [
"Verified day/month timing claim",
"Birth-time truth claim",
"Commercial precise KP event promise"
]
}
}
@@ -0,0 +1,23 @@
{
"scope": "kp_cusp_worked_example_oracle_queue",
"created_at": "2026-07-19",
"status": "awaiting_public_oracle",
"production_tuning_allowed": false,
"claim_status": "blocked",
"source_policy": "Public worked examples only; no private birth data or unverifiable screenshots.",
"required_fields": [
{"field": "case_id", "reason": "Stable public example id."},
{"field": "source_url", "reason": "Public URL or citable source."},
{"field": "datetime", "reason": "Birth/question datetime with timezone."},
{"field": "latitude", "reason": "Exact cusp calculation requires location."},
{"field": "longitude", "reason": "Exact cusp calculation requires location."},
{"field": "house_system", "reason": "KP cusp workflow must not silently use whole-sign houses."},
{"field": "ayanamsa", "reason": "Sidereal setting must be explicit."},
{"field": "cusp_longitude", "reason": "Numeric house cusp longitude oracle."},
{"field": "star_lord", "reason": "Cusp star lord oracle field."},
{"field": "sub_lord", "reason": "Cusp sub lord oracle field."},
{"field": "sub_sub_lord", "reason": "Cusp sub-sub lord oracle field."}
],
"queue": [],
"claim_boundary": "Exact KP cusp remains blocked until at least one public numeric worked example with these fields is archived and replayed."
}
@@ -19,19 +19,19 @@
"items": [
{
"technique_id": "kp_cusps",
"local_code_status": "partial",
"skill_invocation_status": "reference_only",
"local_code_status": "precision_contract_present_probe_approximate",
"skill_invocation_status": "reference_only_contract_available",
"api_ui_entry_status": "partial_api_no_truth_gate",
"external_oracle_status": "missing",
"external_oracle_status": "oracle_queue_present_awaiting_public_example",
"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."
"claim_boundary": "Reference/probe only; exact KP cusp contract exists at references/oracle/kp_cusp_precision_contract_2026_07_19.json, but current runtime remains whole-sign/house-center probe until numeric cusp oracle passes."
},
{
"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",
"external_oracle_status": "hash_manifest_present_fixture_missing_or_fixed",
"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."
},
@@ -30,25 +30,25 @@
"technique_id": "full_muhurta_scoring",
"local_code_status": "missing_runtime",
"skill_invocation_status": "reference_only",
"api_ui_entry_status": "missing",
"api_ui_entry_status": "factor_probe_only_no_verdict",
"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",
"local_code_status": "factor_probe_present",
"skill_invocation_status": "not_invoked",
"api_ui_entry_status": "missing",
"api_ui_entry_status": "probe_script_available",
"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",
"local_code_status": "factor_probe_present",
"skill_invocation_status": "not_invoked",
"api_ui_entry_status": "missing",
"api_ui_entry_status": "probe_script_available",
"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."
@@ -0,0 +1,128 @@
{
"scope": "prashna_tajika_saham_gulika_sphuta_oracle_packet",
"created_at": "2026-07-19",
"status": "oracle_packet_registry_v1",
"truth_policy": "oracle_packet_registry_not_numeric_closure",
"production_tuning_allowed": false,
"boundary": "This packet records local artifacts, source candidates, and required worked examples. It does not claim external numeric closure.",
"techniques": [
{
"technique_id": "prashna_guarded_chart",
"domain": "horary",
"local_status": "guarded_runtime_present",
"external_numeric_oracle_status": "partial",
"local_artifacts": [
"scripts/prashna.py",
"tests/test_prashna_guarded_registry.py",
"tests/test_prashna_entry_contract.py"
],
"source_candidates": [
{
"name": "PyJHora Prashna / horary-related functions",
"license_boundary": "AGPL oracle-only; do not copy implementation."
},
{
"name": "VedAstro horary/API method catalog",
"license_boundary": "MIT source, but hosted identity blocked."
}
],
"required_worked_example": "Public horary chart with question timestamp/location, ayanamsa, node mode, ascendant, planets, houses, and final judged rule trace.",
"next_packet_action": "Build one public Prashna fixture and compare local guarded chart against an external raw packet.",
"claim_boundary": "Can expose guarded Prashna entry; cannot claim externally calibrated horary judgment accuracy."
},
{
"technique_id": "tajika_varshaphala",
"domain": "annual_chart",
"local_status": "partial_runtime_present",
"external_numeric_oracle_status": "partial",
"local_artifacts": [
"scripts/tajika.py",
"references/sahams-execution-guide.md",
"references/oracle/artifacts/pyjhora_steve_jobs_varshaphala_1984_lahiri_stdout_20260627.txt"
],
"source_candidates": [
{
"name": "PyJHora Tajika / Varshaphala output",
"license_boundary": "AGPL oracle-only; numeric stdout can be used as black-box evidence."
},
{
"name": "VedAstro annual chart / Tajika-adjacent methods",
"license_boundary": "hosted identity blocked; use local/NuGet only if method contract is pinned."
}
],
"required_worked_example": "Public annual-chart worked example with solar return time, Tajika aspects/yogas, Muntha, year lord, and Saham values.",
"next_packet_action": "Normalize existing PyJHora Varshaphala stdout into field-level packet, then add at least one public worked example.",
"claim_boundary": "Annual chart can be exploratory; Tajika numerical closure remains partial."
},
{
"technique_id": "saham_points",
"domain": "sensitive_points",
"local_status": "rules_present",
"external_numeric_oracle_status": "blocked",
"local_artifacts": [
"scripts/sahams.py",
"references/saham_rules.json",
"references/sahams-execution-guide.md"
],
"source_candidates": [
{
"name": "Saham formula lists in Tajika/Varshaphala references",
"license_boundary": "source formulas must be cited; calculator output alone is not formula authority."
},
{
"name": "PyJHora Saham-related output",
"license_boundary": "AGPL oracle-only."
}
],
"required_worked_example": "At least one public chart with named Sahams, formula direction, day/night reversal rule, input longitudes, and final degrees.",
"next_packet_action": "Create Saham worked-example packet from public source or mark each Saham formula as source-only.",
"claim_boundary": "Saham calculations remain blocked for external numeric truth until day/night and formula-direction examples close."
},
{
"technique_id": "gulika_longitude",
"domain": "upagraha",
"local_status": "partial_runtime_present",
"external_numeric_oracle_status": "blocked",
"local_artifacts": [
"scripts/gulika.py",
"scripts/adhana.py"
],
"source_candidates": [
{
"name": "Gulika / Mandi worked examples in classical and calculator references",
"license_boundary": "must separate formula source from calculator output."
},
{
"name": "PyJHora Gulika output",
"license_boundary": "AGPL oracle-only."
}
],
"required_worked_example": "Public Gulika/Mandi example with weekday, sunrise/sunset, day/night segment, latitude/longitude/timezone, and final longitude.",
"next_packet_action": "Compare local sunrise/day-night segment result against one public worked example and one independent engine.",
"claim_boundary": "Gulika can be computed locally but external numeric closure is blocked."
},
{
"technique_id": "sphuta_sensitive_points",
"domain": "sensitive_points",
"local_status": "partial_or_scattered",
"external_numeric_oracle_status": "blocked",
"local_artifacts": [
"scripts",
"references"
],
"source_candidates": [
{
"name": "Sphuta formulas in Tajika/Prashna references",
"license_boundary": "formula source required before implementation claims."
},
{
"name": "VedAstro/PyJHora sensitive-point outputs if method contracts are identified",
"license_boundary": "VedAstro hosted identity blocked; PyJHora AGPL oracle-only."
}
],
"required_worked_example": "Public Sphuta example naming point type, formula, input longitudes, normalization rule, and final longitude.",
"next_packet_action": "Inventory local Sphuta formulas, then build one public worked-example packet per point family.",
"claim_boundary": "Do not expose Sphuta as calibrated; keep as research-only until packet closes."
}
]
}
+54
View File
@@ -0,0 +1,54 @@
#!/usr/bin/env python3
"""Append one independent day-level holdout annotation."""
from __future__ import annotations
import argparse
import json
from pathlib import Path
def main() -> int:
parser = argparse.ArgumentParser(description=__doc__)
parser.add_argument("--manifest", type=Path, required=True)
parser.add_argument("--case-id", required=True)
parser.add_argument("--domain", required=True)
parser.add_argument("--label", choices=["target_event", "no_target_event"], required=True)
parser.add_argument("--start", required=True)
parser.add_argument("--end", required=True)
parser.add_argument("--source-url", required=True)
parser.add_argument("--adjudicator", required=True)
parser.add_argument("--event-description", default="")
parser.add_argument("--event-absent-assertion", default="")
parser.add_argument("--source-quote-or-summary", default="")
parser.add_argument("--time-uncertainty-days", type=int, default=0)
args = parser.parse_args()
data = json.loads(args.manifest.read_text(encoding="utf-8"))
row = {
"case_id": args.case_id,
"domain": args.domain,
"label": args.label,
"start": args.start,
"end": args.end,
"event_description": args.event_description,
"event_absent_assertion": args.event_absent_assertion,
"source_url": args.source_url,
"source_quote_or_summary": args.source_quote_or_summary,
"adjudicator": args.adjudicator,
"time_uncertainty_days": args.time_uncertainty_days,
"independent_human_reviewed": True,
"frozen_before_scoring": True,
"source_path": "",
"notes": "",
}
data.setdefault("annotations", []).append(row)
data["status"] = "awaiting_independent_labels"
data["production_tuning_allowed"] = False
args.manifest.write_text(json.dumps(data, ensure_ascii=False, indent=2) + "\n", encoding="utf-8")
print(json.dumps({"status": "appended", "annotation_count": len(data["annotations"]), "production_tuning_allowed": False}, ensure_ascii=False))
return 0
if __name__ == "__main__":
raise SystemExit(main())
+130
View File
@@ -0,0 +1,130 @@
#!/usr/bin/env python3
"""Aggregate high-rigor closure gates.
This script is intentionally conservative: it reports what is blocked or
partial from existing governance artifacts. It does not compute predictions.
"""
from __future__ import annotations
import json
from pathlib import Path
from typing import Any
ROOT = Path(__file__).resolve().parents[1]
ORACLE = ROOT / "references/oracle"
def _load(path: Path) -> dict[str, Any]:
return json.loads(path.read_text(encoding="utf-8"))
def _gap_items(path: str, domain: str) -> list[dict[str, Any]]:
data = _load(ORACLE / path)
return [
{
"domain": domain,
"technique_id": item["technique_id"],
"local_code_status": item["local_code_status"],
"external_oracle_status": item["external_oracle_status"],
"commercial_sync_status": item["commercial_sync_status"],
"claim_boundary": item["claim_boundary"],
}
for item in data["items"]
]
def build_report() -> dict[str, Any]:
kp_contract = _load(ORACLE / "kp_cusp_precision_contract_2026_07_19.json")
prashna_packet = _load(ORACLE / "prashna_tajika_saham_gulika_sphuta_oracle_packet_2026_07_19.json")
formula_kb = _load(ORACLE / "formula_source_knowledge_base_2026_07_19.json")
holdout = _load(ROOT / "references/real_case_calibration/day_level_holdout_v3_human_annotation_packet_2026_07_19.json")
full_scoring = []
full_scoring.extend(_gap_items("kp_precision_timing_gap_registry_2026_07_19.json", "kp_precision_timing"))
full_scoring.extend(_gap_items("muhurta_full_system_gap_registry_2026_07_19.json", "muhurta"))
full_scoring.extend(_gap_items("ashtakavarga_advanced_usage_gap_registry_2026_07_19.json", "ashtakavarga_advanced_usage"))
full_scoring.extend(_gap_items("compatibility_full_system_gap_registry_2026_07_19.json", "compatibility"))
external_oracle_blockers = [
{
"artifact": "prashna_tajika_saham_gulika_sphuta_oracle_packet",
"status": prashna_packet.get("status"),
"claim_boundary": prashna_packet.get("boundary"),
},
{
"artifact": "formula_source_knowledge_base",
"status": formula_kb.get("status"),
"claim_boundary": formula_kb.get("boundary"),
},
]
gates = [
{
"gate_id": "external_numeric_oracle",
"status": "blocked",
"evidence": external_oracle_blockers,
"claim_boundary": "External numeric worked examples are incomplete for Prashna/Tajika/Saham/Gulika/Sphuta and formula/unit disputed components.",
},
{
"gate_id": "independent_negative_holdout",
"status": "blocked",
"evidence": holdout,
"claim_boundary": "Independent human-labeled negative windows are required before verified day/month timing claims.",
},
{
"gate_id": "kp_exact_cusp",
"status": "blocked",
"evidence": kp_contract,
"claim_boundary": kp_contract["claim_boundary"],
},
{
"gate_id": "full_scoring_contracts",
"status": "partial",
"evidence": full_scoring,
"claim_boundary": "KP, Muhurta, advanced Ashtakavarga and advanced compatibility have registries/probes, but full scoring remains blocked or partial.",
},
]
return {
"scope": "high_rigor_closure_gate",
"created_at": "2026-07-19",
"overall_status": "blocked",
"production_tuning_allowed": False,
"verified_day_month_timing_allowed": False,
"birth_time_truth_allowed": False,
"commercial_sync_allowed": False,
"gates": gates,
"next_actions": [
{
"action": "collect_public_numeric_oracle_packets",
"blocked_by": ["external_numeric_oracle"],
"target": "Prashna/Tajika/Saham/Gulika/Sphuta and Shadbala/AV disputed components",
},
{
"action": "pre_register_independent_negative_holdout",
"blocked_by": ["independent_negative_holdout"],
"target": "day/month timing blind ranking",
},
{
"action": "pin_exact_kp_cusp_oracle",
"blocked_by": ["kp_exact_cusp"],
"target": "KP cusp longitude + star/sub/sub-sub worked example",
},
{
"action": "promote_full_scoring_only_after_oracle",
"blocked_by": ["full_scoring_contracts", "external_numeric_oracle", "independent_negative_holdout"],
"target": "KP/Muhurta/AV/compatibility scoring",
},
],
}
def main() -> int:
print(json.dumps(build_report(), ensure_ascii=False, indent=2, sort_keys=True))
return 0
if __name__ == "__main__":
raise SystemExit(main())
@@ -0,0 +1,51 @@
#!/usr/bin/env python3
"""Report hash status for the external KP sub-lord division table."""
from __future__ import annotations
import hashlib
import json
from pathlib import Path
ROOT = Path(__file__).resolve().parents[1]
TABLE = ROOT / "references/open_source_sources/VedicAstro/vedicastro/data/KP_SL_Divisions.csv"
def build_report() -> dict:
base = {
"scope": "kp_external_table_hash_manifest",
"created_at": "2026-07-19",
"production_tuning_allowed": False,
"table_id": "VedicAstro_KP_SL_Divisions",
"expected_path": str(TABLE.relative_to(ROOT)),
"source_candidate": "https://github.com/diliprk/VedicAstro",
"claim_boundary": "This manifest fixes or blocks the external KP sub/sub-lord table hash; it does not prove exact KP cusp or timing truth.",
}
if not TABLE.exists():
return {
**base,
"status": "fixture_missing",
"claim_status": "blocked_fixture_missing",
"sha256": None,
"row_count": 0,
}
raw = TABLE.read_bytes()
text = raw.decode("utf-8-sig")
rows = [line for line in text.splitlines() if line.strip()]
return {
**base,
"status": "fixed_hash",
"claim_status": "oracle_fixture_hash_fixed_not_truth",
"sha256": hashlib.sha256(raw).hexdigest(),
"row_count": max(0, len(rows) - 1),
}
def main() -> int:
print(json.dumps(build_report(), ensure_ascii=False, indent=2, sort_keys=True))
return 0
if __name__ == "__main__":
raise SystemExit(main())
+18
View File
@@ -18,6 +18,7 @@ from kp_system import calc_kp_analysis, get_kp_lords
ROOT = Path(__file__).resolve().parents[1]
KP_CUSP_CONTRACT = ROOT / "references/oracle/kp_cusp_precision_contract_2026_07_19.json"
CANONICAL_PLANETS = {
@@ -57,6 +58,22 @@ def _kp_ruling_planets(moment: datetime, asc_longitude: float, moon_longitude: f
}
def _kp_cusp_contract_summary() -> dict[str, Any]:
if not KP_CUSP_CONTRACT.exists():
return {
"exact_cusp_status": "blocked_missing_contract",
"current_runtime_cusp_mode": "whole_sign_house_center_probe",
"significator_policy": "supporting_probe_only",
}
data = json.loads(KP_CUSP_CONTRACT.read_text(encoding="utf-8"))
return {
"exact_cusp_status": data.get("exact_cusp_status"),
"current_runtime_cusp_mode": data.get("current_runtime_cusp_mode"),
"significator_policy": data.get("kp_significator_runtime_policy"),
"contract_path": str(KP_CUSP_CONTRACT.relative_to(ROOT)),
}
def build_probe() -> dict[str, Any]:
raw = calc_kp_analysis(CANONICAL_PLANETS, asc_sign="Aries")
ruling_planets = _kp_ruling_planets(CANONICAL_MOMENT, CANONICAL_ASC_LONGITUDE, CANONICAL_MOON_LONGITUDE)
@@ -94,6 +111,7 @@ def build_probe() -> dict[str, Any]:
},
"kp_lords_by_planet": kp_lords_by_planet,
"ruling_planets": ruling_planets,
"kp_cusp_contract": _kp_cusp_contract_summary(),
"planet_significators": planet_significators,
"house_significators": house_significators,
"raw_sha256": _stable_hash(raw),
+90
View File
@@ -0,0 +1,90 @@
#!/usr/bin/env python3
"""Muhurta factor probe: observation only, no electional verdict."""
from __future__ import annotations
import argparse
import json
from datetime import datetime
from cmd_muhurta import _get_sun_moon_lons, _weekday_to_vara
from muhurta import calc_panchanga, calc_abhijit_muhurta
def _tarabala(birth_moon_nakshatra_index: int | None, current_nakshatra_index: int) -> dict:
if birth_moon_nakshatra_index is None:
return {"status": "missing_birth_moon_nakshatra", "claim": "not_computed"}
tara_pos = ((current_nakshatra_index - birth_moon_nakshatra_index) % 27) + 1
tara_class = ((tara_pos - 1) % 9) + 1
favorable = tara_class in {2, 4, 6, 8, 9}
return {"status": "computed_rule_probe", "tara_position": tara_pos, "tara_class": tara_class, "favorable": favorable}
def _chandrabala(birth_moon_sign_index: int | None, current_moon_lon: float) -> dict:
if birth_moon_sign_index is None:
return {"status": "missing_birth_moon_sign", "claim": "not_computed"}
current_sign = int((current_moon_lon % 360) // 30)
relative_house = ((current_sign - birth_moon_sign_index) % 12) + 1
favorable = relative_house not in {6, 8, 12}
return {"status": "computed_rule_probe", "relative_house": relative_house, "favorable": favorable}
def build_probe(date_text: str, birth_moon_nakshatra_index: int | None, birth_moon_sign_index: int | None) -> dict:
dt = datetime.strptime(date_text, "%Y-%m-%d")
sun_lon, moon_lon, has_swiss = _get_sun_moon_lons(dt.year, dt.month, dt.day, 12)
weekday = _weekday_to_vara(dt.weekday())
panchanga = calc_panchanga(sun_lon=sun_lon, moon_lon=moon_lon, weekday=weekday, hour_from_sunrise=6.0)
factors = {
"panchanga": panchanga,
"tarabala": _tarabala(birth_moon_nakshatra_index, panchanga["nakshatra"]["nakshatra_idx"]),
"chandrabala": _chandrabala(birth_moon_sign_index, moon_lon),
"rahu_kalam": panchanga.get("rahu_kala"),
"abhijit_muhurta": calc_abhijit_muhurta(),
}
signals = []
blockers = []
if factors["tarabala"].get("favorable") is True:
signals.append("Tarabala")
elif factors["tarabala"].get("favorable") is False:
blockers.append("Tarabala")
if factors["chandrabala"].get("favorable") is True:
signals.append("Chandrabala")
elif factors["chandrabala"].get("favorable") is False:
blockers.append("Chandrabala")
if factors["abhijit_muhurta"]:
signals.append("Abhijit")
return {
"scope": "muhurta_factor_probe",
"created_at": "2026-07-19",
"date": date_text,
"production_tuning_allowed": False,
"claim_status": "exploratory_muhurta_candidate",
"verified_muhurta_verdict": False,
"full_scoring_status": "blocked_until_oracle",
"ephemeris_source": "swisseph" if has_swiss else "approximate_fallback",
"factors": factors,
"candidate_windows": [
{
"label": "abhijit_reference_window",
"signals": signals,
"blockers": blockers,
"confidence_cap": "low",
"claim_status": "exploratory_muhurta_candidate"
}
],
"boundary": "Muhurta factors are observations only;未通过完整 worked examples 与负样本验证,不能作为确定择日承诺。"
}
def main() -> int:
parser = argparse.ArgumentParser(description=__doc__)
parser.add_argument("--date", required=True)
parser.add_argument("--birth-moon-nakshatra-index", type=int)
parser.add_argument("--birth-moon-sign-index", type=int)
args = parser.parse_args()
print(json.dumps(build_probe(args.date, args.birth_moon_nakshatra_index, args.birth_moon_sign_index), ensure_ascii=False, indent=2, sort_keys=True))
return 0
if __name__ == "__main__":
raise SystemExit(main())
+71
View File
@@ -0,0 +1,71 @@
from __future__ import annotations
import json
import subprocess
import sys
from pathlib import Path
ROOT = Path(__file__).resolve().parents[1]
INTAKE = ROOT / "scripts/day_level_holdout_intake.py"
INDEX = ROOT / "references/oracle/evidence_packet_index_2026_07_19.json"
def test_day_level_holdout_intake_appends_annotation_and_preserves_blocked_gate(tmp_path: Path) -> None:
manifest = tmp_path / "holdout.json"
manifest.write_text(
json.dumps(
{
"benchmark_id": "day_level_timing_holdout_v3",
"status": "awaiting_independent_labels",
"prohibited_tuning_data": [],
"frozen_gate": {
"minimum_independent_cases": 20,
"minimum_independent_negative_intervals": 80,
},
"annotations": [],
},
ensure_ascii=False,
),
encoding="utf-8",
)
subprocess.run(
[
sys.executable,
str(INTAKE),
"--manifest",
str(manifest),
"--case-id",
"pilot_case_001",
"--domain",
"career",
"--label",
"no_target_event",
"--start",
"2020-01-01",
"--end",
"2020-01-31",
"--source-url",
"https://example.com/source",
"--adjudicator",
"human_reviewer",
"--event-absent-assertion",
"No target career event found in public timeline for this interval.",
],
check=True,
cwd=ROOT,
)
data = json.loads(manifest.read_text(encoding="utf-8"))
assert len(data["annotations"]) == 1
row = data["annotations"][0]
assert row["independent_human_reviewed"] is True
assert row["frozen_before_scoring"] is True
assert data["status"] == "awaiting_independent_labels"
def test_day_level_holdout_intake_is_indexed() -> None:
data = json.loads(INDEX.read_text(encoding="utf-8"))
packets = {packet["packet_id"]: packet for packet in data["packets"]}
assert packets["day_level_holdout_intake"]["path"] == "scripts/day_level_holdout_intake.py"
assert packets["day_level_holdout_intake"]["claim_status"] == "partial"
+57
View File
@@ -0,0 +1,57 @@
from __future__ import annotations
import json
import subprocess
import sys
from pathlib import Path
ROOT = Path(__file__).resolve().parents[1]
GATE = ROOT / "scripts/high_rigor_closure_gate.py"
INDEX = ROOT / "references/oracle/evidence_packet_index_2026_07_19.json"
def _run_gate() -> dict:
completed = subprocess.run(
[sys.executable, str(GATE)],
cwd=ROOT,
check=True,
capture_output=True,
text=True,
)
return json.loads(completed.stdout)
def test_high_rigor_closure_gate_blocks_production_tuning_until_oracle_holdout_cusp_and_scoring_close() -> None:
report = _run_gate()
assert report["scope"] == "high_rigor_closure_gate"
assert report["production_tuning_allowed"] is False
assert report["verified_day_month_timing_allowed"] is False
assert report["birth_time_truth_allowed"] is False
assert report["commercial_sync_allowed"] is False
assert report["overall_status"] == "blocked"
gates = {gate["gate_id"]: gate for gate in report["gates"]}
assert gates["external_numeric_oracle"]["status"] == "blocked"
assert gates["independent_negative_holdout"]["status"] == "blocked"
assert gates["kp_exact_cusp"]["status"] == "blocked"
assert gates["full_scoring_contracts"]["status"] == "partial"
def test_high_rigor_closure_gate_lists_full_scoring_domains_and_next_actions() -> None:
report = _run_gate()
gates = {gate["gate_id"]: gate for gate in report["gates"]}
domains = {item["domain"] for item in gates["full_scoring_contracts"]["evidence"]}
assert {"kp_precision_timing", "muhurta", "ashtakavarga_advanced_usage", "compatibility"}.issubset(domains)
assert report["next_actions"]
assert all(action["blocked_by"] for action in report["next_actions"])
def test_high_rigor_closure_gate_is_indexed_as_governance_packet() -> None:
data = json.loads(INDEX.read_text(encoding="utf-8"))
packets = {packet["packet_id"]: packet for packet in data["packets"]}
assert packets["high_rigor_closure_gate"]["path"] == "scripts/high_rigor_closure_gate.py"
assert packets["high_rigor_closure_gate"]["claim_status"] == "blocked"
+5 -1
View File
@@ -49,8 +49,10 @@ 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["kp_cusps"]["local_code_status"] == "precision_contract_present_probe_approximate"
assert ids["kp_cusps"]["external_oracle_status"] == "oracle_queue_present_awaiting_public_example"
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["star_sub_lord"]["external_oracle_status"] == "hash_manifest_present_fixture_missing_or_fixed"
assert ids["ruling_planets"]["local_code_status"] == "minimal_probe_present"
assert ids["kp_significators"]["local_code_status"] == "minimal_probe_present"
assert ids["kp_significators"]["claim_boundary"].startswith("Reference/probe only")
@@ -61,7 +63,9 @@ def test_muhurta_registry_distinguishes_panchanga_from_full_muhurta() -> None:
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"]["api_ui_entry_status"] == "factor_probe_only_no_verdict"
assert ids["full_muhurta_scoring"]["claim_boundary"].startswith("Do not present")
assert ids["tarabala_chandrabala"]["local_code_status"] == "factor_probe_present"
def test_ashtakavarga_advanced_registry_keeps_advanced_usage_observation_only() -> None:
+48
View File
@@ -0,0 +1,48 @@
from __future__ import annotations
import json
import subprocess
import sys
from pathlib import Path
ROOT = Path(__file__).resolve().parents[1]
CONTRACT = ROOT / "references/oracle/kp_cusp_precision_contract_2026_07_19.json"
PROBE = ROOT / "scripts/kp_precision_timing_probe.py"
def test_kp_cusp_precision_contract_blocks_exact_timing_truth() -> None:
data = json.loads(CONTRACT.read_text(encoding="utf-8"))
assert data["scope"] == "kp_cusp_precision_contract"
assert data["status"] == "contract_v1"
assert data["production_tuning_allowed"] is False
assert data["exact_cusp_status"] == "blocked_missing_oracle"
assert data["current_runtime_cusp_mode"] == "whole_sign_house_center_probe"
assert data["kp_significator_runtime_policy"] == "supporting_probe_only"
assert "cannot drive precise event timing" in data["claim_boundary"]
def test_kp_cusp_precision_contract_declares_required_inputs_and_oracles() -> None:
data = json.loads(CONTRACT.read_text(encoding="utf-8"))
required_inputs = {item["field"] for item in data["required_exact_cusp_inputs"]}
assert {"birth_or_question_datetime", "latitude", "longitude", "timezone", "ayanamsa", "house_system"}.issubset(required_inputs)
required_oracles = {item["oracle_id"] for item in data["required_oracles"]}
assert {"kp_cusp_numeric_worked_example", "kp_significator_field_example", "negative_holdout_timing_set"}.issubset(required_oracles)
def test_kp_precision_probe_surfaces_cusp_contract_boundary() -> None:
completed = subprocess.run(
[sys.executable, str(PROBE)],
cwd=ROOT,
check=True,
capture_output=True,
text=True,
)
report = json.loads(completed.stdout)
contract = report["kp_cusp_contract"]
assert contract["exact_cusp_status"] == "blocked_missing_oracle"
assert contract["current_runtime_cusp_mode"] == "whole_sign_house_center_probe"
assert contract["significator_policy"] == "supporting_probe_only"
+48
View File
@@ -0,0 +1,48 @@
from __future__ import annotations
import json
import subprocess
import sys
from pathlib import Path
ROOT = Path(__file__).resolve().parents[1]
HASH_SCRIPT = ROOT / "scripts/kp_external_table_hash_manifest.py"
QUEUE = ROOT / "references/oracle/kp_cusp_worked_example_oracle_queue_2026_07_19.json"
INDEX = ROOT / "references/oracle/evidence_packet_index_2026_07_19.json"
def test_kp_external_table_hash_manifest_reports_fixture_status() -> None:
completed = subprocess.run(
[sys.executable, str(HASH_SCRIPT)],
cwd=ROOT,
check=True,
capture_output=True,
text=True,
)
report = json.loads(completed.stdout)
assert report["scope"] == "kp_external_table_hash_manifest"
assert report["production_tuning_allowed"] is False
assert report["table_id"] == "VedicAstro_KP_SL_Divisions"
assert report["status"] in {"fixed_hash", "fixture_missing"}
if report["status"] == "fixed_hash":
assert len(report["sha256"]) == 64
else:
assert report["claim_status"] == "blocked_fixture_missing"
def test_kp_cusp_worked_example_oracle_queue_is_blocked_but_actionable() -> None:
data = json.loads(QUEUE.read_text(encoding="utf-8"))
assert data["scope"] == "kp_cusp_worked_example_oracle_queue"
assert data["status"] == "awaiting_public_oracle"
assert data["production_tuning_allowed"] is False
assert data["claim_status"] == "blocked"
required = {field["field"] for field in data["required_fields"]}
assert {"cusp_longitude", "star_lord", "sub_lord", "sub_sub_lord", "source_url"}.issubset(required)
def test_kp_hash_and_oracle_queue_are_indexed() -> None:
data = json.loads(INDEX.read_text(encoding="utf-8"))
packets = {packet["packet_id"]: packet for packet in data["packets"]}
assert packets["kp_external_table_hash_manifest"]["path"] == "scripts/kp_external_table_hash_manifest.py"
assert packets["kp_cusp_worked_example_oracle_queue"]["claim_status"] == "blocked"
+50
View File
@@ -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/muhurta_factor_probe.py"
INDEX = ROOT / "references/oracle/evidence_packet_index_2026_07_19.json"
def test_muhurta_factor_probe_outputs_observation_not_verdict() -> None:
completed = subprocess.run(
[sys.executable, str(PROBE), "--date", "2026-07-19", "--birth-moon-nakshatra-index", "4"],
cwd=ROOT,
check=True,
capture_output=True,
text=True,
)
report = json.loads(completed.stdout)
assert report["scope"] == "muhurta_factor_probe"
assert report["claim_status"] == "exploratory_muhurta_candidate"
assert report["verified_muhurta_verdict"] is False
assert report["production_tuning_allowed"] is False
factors = report["factors"]
assert {"tarabala", "chandrabala", "rahu_kalam", "abhijit_muhurta"} <= set(factors)
assert report["candidate_windows"]
assert report["candidate_windows"][0]["confidence_cap"] == "low"
def test_muhurta_factor_probe_keeps_full_scoring_blocked() -> None:
completed = subprocess.run(
[sys.executable, str(PROBE), "--date", "2026-07-19"],
cwd=ROOT,
check=True,
capture_output=True,
text=True,
)
report = json.loads(completed.stdout)
assert report["full_scoring_status"] == "blocked_until_oracle"
assert "不能作为确定择日承诺" in report["boundary"]
def test_muhurta_factor_probe_is_indexed() -> None:
data = json.loads(INDEX.read_text(encoding="utf-8"))
packets = {packet["packet_id"]: packet for packet in data["packets"]}
assert packets["muhurta_factor_probe"]["path"] == "scripts/muhurta_factor_probe.py"
assert packets["muhurta_factor_probe"]["claim_status"] == "partial"