feat: sync oracle closure probes
This commit is contained in:
@@ -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
+16149
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
+16152
File diff suppressed because it is too large
Load Diff
+16155
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
+16046
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
+16150
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
+1
-1
@@ -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."
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -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())
|
||||
@@ -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,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),
|
||||
|
||||
@@ -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())
|
||||
@@ -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"
|
||||
@@ -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"
|
||||
@@ -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:
|
||||
|
||||
@@ -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"
|
||||
@@ -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"
|
||||
@@ -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"
|
||||
Reference in New Issue
Block a user