sync: import prashna sphuta validation packets
This commit is contained in:
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,15 @@
|
||||
{
|
||||
"scope": "kp_external_table_hash_manifest",
|
||||
"created_at": "2026-07-20",
|
||||
"table_id": "VedicAstro_KP_SL_Divisions",
|
||||
"expected_path": "references/open_source_sources/VedicAstro/vedicastro/data/KP_SL_Divisions.csv",
|
||||
"source_candidate": "https://github.com/diliprk/VedicAstro",
|
||||
"status": "fixture_missing",
|
||||
"claim_status": "blocked_fixture_missing",
|
||||
"sha256": null,
|
||||
"row_count": 0,
|
||||
"production_tuning_allowed": false,
|
||||
"truth_matrix_allowed": false,
|
||||
"claim_boundary": "Current repository does not contain the external KP sub/sub-lord table fixture. KP exact cusp and event timing cannot be upgraded until a legal source table is pinned with hash and replay evidence.",
|
||||
"next_action": "pin legal source table file or keep KP exact cusp oracle blocked"
|
||||
}
|
||||
@@ -0,0 +1,108 @@
|
||||
{
|
||||
"scope": "oss_worked_example_source_matrix",
|
||||
"created_at": "2026-07-20",
|
||||
"claim_status": "source_intake_only",
|
||||
"production_tuning_allowed": false,
|
||||
"truth_matrix_allowed": false,
|
||||
"boundary": "Source matrix for reusable open-source/public worked-example candidates. A row can feed numeric oracle packets only after license, version/commit, raw capture hash, input contract, and replay comparison are archived.",
|
||||
"sources": [
|
||||
{
|
||||
"source_id": "pyjhora_pvr_tests",
|
||||
"name": "naturalstupid/PyJHora JHora pvr_tests",
|
||||
"url": "https://github.com/naturalstupid/PyJHora",
|
||||
"license_status": "AGPL_or_strong_copyleft_observation_only",
|
||||
"candidate_domains": [
|
||||
"prashna_sphuta",
|
||||
"shadbala",
|
||||
"varga",
|
||||
"dasha"
|
||||
],
|
||||
"case_usefulness": "Installed package includes executable tests such as sphuta_tests with concrete birth data and expected textual values.",
|
||||
"local_status": "installed_runtime_observation_available",
|
||||
"numeric_packet_status": "one_sphuta_case_probe_created",
|
||||
"reuse_policy": "black_box_observation_only",
|
||||
"promotion_boundary": "May provide external observation/raw/hash only; do not vendor code or copy formulas into runtime."
|
||||
},
|
||||
{
|
||||
"source_id": "jyotishganit_github",
|
||||
"name": "northtara/jyotishganit",
|
||||
"url": "https://github.com/northtara/jyotishganit",
|
||||
"license_status": "MIT_candidate_verify_commit_license",
|
||||
"candidate_domains": [
|
||||
"panchanga",
|
||||
"varga",
|
||||
"ashtakavarga",
|
||||
"shadbala_surface"
|
||||
],
|
||||
"case_usefulness": "Already used as field-level raw probe for D2/D4/D9/D10, Panchanga, BAV/SAV; Shadbala API surface still incomplete.",
|
||||
"local_status": "installed_or_local_mirror_available",
|
||||
"numeric_packet_status": "field_probe_ready_not_truth",
|
||||
"reuse_policy": "permissive_candidate_adapter_preferred",
|
||||
"promotion_boundary": "Can be adapter/observation source after commit/hash/license and same-input raw are pinned; does not resolve formula variants alone."
|
||||
},
|
||||
{
|
||||
"source_id": "vedicastro_kp_runtime",
|
||||
"name": "diliprk/VedicAstro",
|
||||
"url": "https://github.com/diliprk/VedicAstro",
|
||||
"license_status": "repo_license_and_file_license_must_be_verified_before_copy",
|
||||
"candidate_domains": [
|
||||
"kp_precision_timing"
|
||||
],
|
||||
"case_usefulness": "Runtime/API surface can emit KP house cusp/star/sub/sub-sub raw for batch probes.",
|
||||
"local_status": "temporary_flatlib_polars_probe_available",
|
||||
"numeric_packet_status": "runtime_raw_available_but_public_worked_example_needed",
|
||||
"reuse_policy": "isolated_subprocess_observation_until_license_clear",
|
||||
"promotion_boundary": "KP exact cusp may advance only after public numeric worked example replay matches pinned raw."
|
||||
},
|
||||
{
|
||||
"source_id": "fusionstrings_panchangam",
|
||||
"name": "fusionstrings/panchangam",
|
||||
"url": "https://github.com/fusionstrings/panchangam",
|
||||
"license_status": "permissive_candidate_verify_repo_license",
|
||||
"candidate_domains": [
|
||||
"muhurta_factor_scoring",
|
||||
"panchanga"
|
||||
],
|
||||
"case_usefulness": "Open-source Panchangam candidate for Tarabala/Chandrabala/Rahu Kalam/Abhijit style factor comparison.",
|
||||
"local_status": "not_imported",
|
||||
"numeric_packet_status": "candidate_requires_pin_install_and_raw_hash",
|
||||
"reuse_policy": "adapter_candidate_no_truth_upgrade",
|
||||
"promotion_boundary": "Observation-only until exact date/place/timezone, sunrise source, and factor scoring weights are pinned."
|
||||
},
|
||||
{
|
||||
"source_id": "bidyashish_panchang",
|
||||
"name": "bidyashish/panchang",
|
||||
"url": "https://github.com/bidyashish/panchang",
|
||||
"license_status": "public_repo_license_verify_before_use",
|
||||
"candidate_domains": [
|
||||
"panchanga",
|
||||
"muhurta_factor_scoring"
|
||||
],
|
||||
"case_usefulness": "Candidate secondary Panchanga implementation for cross-checking weekday/tithi/nakshatra/yoga/karana and Rahu-type intervals.",
|
||||
"local_status": "not_imported",
|
||||
"numeric_packet_status": "candidate_requires_pin_install_and_raw_hash",
|
||||
"reuse_policy": "adapter_candidate_no_truth_upgrade",
|
||||
"promotion_boundary": "Do not produce Muhurta verdicts until factor weights and negative examples are validated."
|
||||
},
|
||||
{
|
||||
"source_id": "kp_sub_lord_boundary_tables",
|
||||
"name": "KP star/sub lord boundary tables from open-source CSV/API surfaces",
|
||||
"url": "https://github.com/diliprk/VedicAstro",
|
||||
"license_status": "table_file_license_and_hash_required",
|
||||
"candidate_domains": [
|
||||
"kp_precision_timing"
|
||||
],
|
||||
"case_usefulness": "Boundary tables can validate star/sub/sub-sub segmentation independently of event interpretation.",
|
||||
"local_status": "partial_table_probe_exists",
|
||||
"numeric_packet_status": "candidate_requires_raw_capture_hash",
|
||||
"reuse_policy": "hash_tables_then_adapter_only",
|
||||
"promotion_boundary": "Segmentation correctness is not event-timing correctness; worked examples and holdout are still required."
|
||||
}
|
||||
],
|
||||
"next_actions": [
|
||||
"Pin source commit/package hash before each runtime probe.",
|
||||
"Use local mirrors or temporary isolated installs; do not add runtime dependencies to research app unless explicitly promoted.",
|
||||
"Upgrade only rows with concrete numeric inputs/outputs into numeric oracle packets.",
|
||||
"Keep AGPL/GPL sources observation-only and outside commercial runtime."
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,54 @@
|
||||
{
|
||||
"blocked_files": [],
|
||||
"boundary": "Short context and hashes only; no long copyrighted text is reproduced and no truth upgrade is allowed.",
|
||||
"claim_status": "source_intake_only",
|
||||
"created_at": "2026-07-20",
|
||||
"located_windows": [
|
||||
{
|
||||
"download_url": "https://archive.org/download/PrasnaMargaBVR/Prasna%20Marga%201_djvu.txt",
|
||||
"file_name": "Prasna Marga 1_djvu.txt",
|
||||
"line_end": 143,
|
||||
"line_start": 139,
|
||||
"matched_line": 141,
|
||||
"matched_terms": [
|
||||
"Gulika"
|
||||
],
|
||||
"short_context": "53. The Moon’s Longitude ... 154 54. Position of Gulika 159 55. Thrisphuta... 162",
|
||||
"source_id": "PrasnaMargaBVR",
|
||||
"window_hash": "9b512ea3157ce3f8b24f30a9f7d6ded1a9eb97dc77462dc27cac269ace2f5a52"
|
||||
},
|
||||
{
|
||||
"download_url": "https://archive.org/download/prasna-marga-part-2-by-bv-raman/Prasna%20Marga%20Part%202%20by%20BV%20Raman_djvu.txt",
|
||||
"file_name": "Prasna Marga Part 2 by BV Raman_djvu.txt",
|
||||
"line_end": 1161,
|
||||
"line_start": 1157,
|
||||
"matched_line": 1159,
|
||||
"matched_terms": [
|
||||
"Gulika"
|
||||
],
|
||||
"short_context": "Stanza 19. If Yama Sukra (...) or the lord of the 10th house from him occupies the 6th, the 8th or the 12th from Arudha or if Venus occupies the 6th, the 8th or the 12th from Yama Sukra, marriage will not take place at the time fixed. If Ra",
|
||||
"source_id": "prasna-marga-part-2-by-bv-raman",
|
||||
"window_hash": "84f1b543641d873e4737333ab9243632f4d7f191b67bf716d3e8616bcc2a10dd"
|
||||
}
|
||||
],
|
||||
"missing_for_oracle": [
|
||||
"complete_prashna_input",
|
||||
"raw excerpt capture",
|
||||
"line-level transcription review",
|
||||
"legal external replay"
|
||||
],
|
||||
"next_steps": [
|
||||
"raw excerpt capture with page/line coordinates and independent transcription review",
|
||||
"compare VedAstro vs B.V. Raman wording before formula tuning"
|
||||
],
|
||||
"production_tuning_allowed": false,
|
||||
"scope": "prashna_marga_excerpt_locator",
|
||||
"status": "excerpt_locator_ready",
|
||||
"summary": {
|
||||
"blocked_file_count": 0,
|
||||
"located_window_count": 2,
|
||||
"oracle_ready_count": 0
|
||||
},
|
||||
"truth_matrix_allowed": false,
|
||||
"upgrade_status": "candidate_not_oracle"
|
||||
}
|
||||
@@ -0,0 +1,66 @@
|
||||
{
|
||||
"boundary": "Capture metadata only; long copyrighted text is not reproduced.",
|
||||
"claim_status": "source_intake_only",
|
||||
"created_at": "2026-07-20",
|
||||
"field_locator_terms": [
|
||||
"Trisphuta",
|
||||
"Chatusphuta",
|
||||
"Catusphuta",
|
||||
"Panchasphuta",
|
||||
"Gulika"
|
||||
],
|
||||
"internet_archive_items": [
|
||||
{
|
||||
"claim_boundary": "Metadata/file hash pin only; no book text is vendored and no numeric truth is upgraded.",
|
||||
"files": [
|
||||
{
|
||||
"download_url": "https://archive.org/download/PrasnaMargaBVR/Prasna%20Marga%201_djvu.txt",
|
||||
"format": "DjVuTXT",
|
||||
"name": "Prasna Marga 1_djvu.txt",
|
||||
"sha1": "bed3491a79ca5039409dac7fd62e386f7de55a47"
|
||||
},
|
||||
{
|
||||
"download_url": "https://archive.org/download/PrasnaMargaBVR/Prasna%20Marga%201.pdf",
|
||||
"format": "Text PDF",
|
||||
"name": "Prasna Marga 1.pdf",
|
||||
"sha1": "86839fc2d13509309ec3a14a160c861bb223d844"
|
||||
}
|
||||
],
|
||||
"identifier": "PrasnaMargaBVR",
|
||||
"metadata_url": "https://archive.org/metadata/PrasnaMargaBVR",
|
||||
"source_metadata_hash": "a36100f19e1f6440c2bae22d9cb45f7535e94f6956fac1c5d13b90dd3e6989fb",
|
||||
"title": "Prasna Marga - Dr. BV Raman",
|
||||
"upgrade_status": "candidate_not_oracle"
|
||||
},
|
||||
{
|
||||
"claim_boundary": "Metadata/file hash pin only; no book text is vendored and no numeric truth is upgraded.",
|
||||
"files": [
|
||||
{
|
||||
"download_url": "https://archive.org/download/prasna-marga-part-2-by-bv-raman/Prasna%20Marga%20Part%202%20by%20BV%20Raman_djvu.txt",
|
||||
"format": "DjVuTXT",
|
||||
"name": "Prasna Marga Part 2 by BV Raman_djvu.txt",
|
||||
"sha1": "17c432465520ef75bde7a2c4fa167ff119664666"
|
||||
}
|
||||
],
|
||||
"identifier": "prasna-marga-part-2-by-bv-raman",
|
||||
"metadata_url": "https://archive.org/metadata/prasna-marga-part-2-by-bv-raman",
|
||||
"source_metadata_hash": "faaeb9c95112f48480d8b79023c83a7ac1a101c7865b4ead1085dd3a16974dfe",
|
||||
"title": "Prasna Marga Part 2 By BV Raman",
|
||||
"upgrade_status": "candidate_not_oracle"
|
||||
}
|
||||
],
|
||||
"next_steps": [
|
||||
"raw excerpt capture around locator terms with page/line coordinates",
|
||||
"compare B.V. Raman scan vs VedAstro transcription",
|
||||
"only then classify formula_variant vs source_transcription"
|
||||
],
|
||||
"production_tuning_allowed": false,
|
||||
"scope": "prashna_marga_raw_capture_packet",
|
||||
"status": "raw_capture_metadata_ready",
|
||||
"summary": {
|
||||
"ia_item_count": 2,
|
||||
"oracle_ready_count": 0,
|
||||
"pinned_file_count": 3
|
||||
},
|
||||
"truth_matrix_allowed": false
|
||||
}
|
||||
@@ -0,0 +1,48 @@
|
||||
{
|
||||
"boundary": "Expected-value arithmetic only; complete Prashna inputs are still required for oracle replay.",
|
||||
"claim_status": "tooling_observation_only",
|
||||
"created_at": "2026-07-20",
|
||||
"production_tuning_allowed": false,
|
||||
"rows": [
|
||||
{
|
||||
"claim_boundary": "Checks arithmetic consistency of published expected values only; not a true local ephemeris replay.",
|
||||
"computed_from_expected_degrees": {
|
||||
"chatusphuta": 94.28305555555556,
|
||||
"panchasphuta": 192.54972222222221,
|
||||
"trisphuta": 331.1427777777778
|
||||
},
|
||||
"expected_degrees": {
|
||||
"chatusphuta": 75.30944444444444,
|
||||
"gulika": 104.16666666666667,
|
||||
"lagna": 117.36666666666666,
|
||||
"moon": 109.60944444444443,
|
||||
"panchasphuta": 173.57611111111112,
|
||||
"rahu": 98.26666666666667,
|
||||
"sun": 123.14027777777778,
|
||||
"trisphuta": 331.1427777777778
|
||||
},
|
||||
"local_formula_consistency": "mismatch",
|
||||
"missing_for_true_replay": [
|
||||
"question_datetime_local",
|
||||
"location",
|
||||
"timezone",
|
||||
"ayanamsa",
|
||||
"node_mode",
|
||||
"raw_capture_hash",
|
||||
"legal_external_replay"
|
||||
],
|
||||
"replay_status": "blocked_missing_complete_input",
|
||||
"source_id": "vedastro_prasna_marga_ch5_sphuta_example",
|
||||
"upgrade_status": "not_oracle_ready",
|
||||
"url": "https://vedastro.org/book/PrasnaMarga/Chapter5"
|
||||
}
|
||||
],
|
||||
"scope": "prashna_sphuta_candidate_replay_readiness",
|
||||
"status": "replay_readiness_ready",
|
||||
"summary": {
|
||||
"candidate_count": 1,
|
||||
"local_formula_check_pass_count": 0,
|
||||
"oracle_ready_count": 0
|
||||
},
|
||||
"truth_matrix_allowed": false
|
||||
}
|
||||
@@ -0,0 +1,109 @@
|
||||
{
|
||||
"boundary": "Dashboard only; summarizes blocked gates and does not upgrade any Prashna/Sphuta claim.",
|
||||
"claim_status": "blocked_until_human_labels",
|
||||
"commercial_sync_status": "research_observation_only",
|
||||
"created_at": "2026-07-20",
|
||||
"forbidden_uses": [
|
||||
"do_not_use_for_deterministic_prashna_verdict",
|
||||
"do_not_tune_formula_from_candidate_mismatch",
|
||||
"do_not_claim_external_oracle_ready"
|
||||
],
|
||||
"gates": [
|
||||
{
|
||||
"evidence": "review_result_validation valid_completed_review_count == 0",
|
||||
"gate_id": "human_line_review",
|
||||
"status": "blocked"
|
||||
},
|
||||
{
|
||||
"evidence": "candidate lacks question datetime/location/timezone/ayanamsa/node",
|
||||
"gate_id": "complete_prashna_input",
|
||||
"status": "blocked"
|
||||
},
|
||||
{
|
||||
"evidence": "no PyJHora/other legal replay packet yet",
|
||||
"gate_id": "legal_external_replay",
|
||||
"status": "blocked"
|
||||
},
|
||||
{
|
||||
"evidence": "Trisphuta matches; Chatusphuta/Panchasphuta mismatch",
|
||||
"gate_id": "formula_or_transcription_arbitration",
|
||||
"status": "open_queue"
|
||||
}
|
||||
],
|
||||
"next_actions": [
|
||||
"fill review_result_template via human/second-source review",
|
||||
"capture complete Prashna input if a worked example is found",
|
||||
"run legal external replay only after inputs close"
|
||||
],
|
||||
"packet_chain": [
|
||||
{
|
||||
"claim_status": "ready_contract",
|
||||
"path": "references/oracle/prashna_input_contract_2026_07_20.json",
|
||||
"scope": "prashna_input_contract",
|
||||
"status": "contract_ready"
|
||||
},
|
||||
{
|
||||
"claim_status": "open_queue",
|
||||
"path": "references/oracle/prashna_numeric_oracle_packet_queue_2026_07_20.json",
|
||||
"scope": "prashna_numeric_oracle_packet_queue",
|
||||
"status": "queue_ready"
|
||||
},
|
||||
{
|
||||
"claim_status": "tooling_observation_only",
|
||||
"path": "references/oracle/prashna_sphuta_candidate_replay_readiness_2026_07_20.json",
|
||||
"scope": "prashna_sphuta_candidate_replay_readiness",
|
||||
"status": "replay_readiness_ready"
|
||||
},
|
||||
{
|
||||
"claim_status": "open_queue",
|
||||
"path": "references/oracle/prashna_sphuta_mismatch_arbitration_2026_07_20.json",
|
||||
"scope": "prashna_sphuta_mismatch_arbitration",
|
||||
"status": "arbitration_queue_ready"
|
||||
},
|
||||
{
|
||||
"claim_status": "source_intake_only",
|
||||
"path": "references/oracle/prashna_marga_raw_capture_packet_2026_07_20.json",
|
||||
"scope": "prashna_marga_raw_capture_packet",
|
||||
"status": "raw_capture_metadata_ready"
|
||||
},
|
||||
{
|
||||
"claim_status": "source_intake_only",
|
||||
"path": "references/oracle/prashna_marga_excerpt_locator_2026_07_20.json",
|
||||
"scope": "prashna_marga_excerpt_locator",
|
||||
"status": "excerpt_locator_ready"
|
||||
},
|
||||
{
|
||||
"claim_status": "open_queue",
|
||||
"path": "references/oracle/prashna_sphuta_source_comparison_matrix_2026_07_20.json",
|
||||
"scope": "prashna_sphuta_source_comparison_matrix",
|
||||
"status": "comparison_matrix_ready"
|
||||
},
|
||||
{
|
||||
"claim_status": "open_queue",
|
||||
"path": "references/oracle/prashna_sphuta_line_review_queue_2026_07_20.json",
|
||||
"scope": "prashna_sphuta_line_review_queue",
|
||||
"status": "review_queue_ready"
|
||||
},
|
||||
{
|
||||
"claim_status": "blocked_until_human_labels",
|
||||
"path": "references/oracle/prashna_sphuta_review_result_template_2026_07_20.json",
|
||||
"scope": "prashna_sphuta_review_result_template",
|
||||
"status": "blank_review_template_ready"
|
||||
},
|
||||
{
|
||||
"claim_status": "blocked_until_human_labels",
|
||||
"path": "references/oracle/prashna_sphuta_review_result_validation_2026_07_20.json",
|
||||
"scope": "prashna_sphuta_review_result_validation",
|
||||
"status": "validation_ready"
|
||||
}
|
||||
],
|
||||
"production_tuning_allowed": false,
|
||||
"scope": "prashna_sphuta_closure_dashboard",
|
||||
"status": "closure_dashboard_ready",
|
||||
"summary": {
|
||||
"blocked_gate_count": 3,
|
||||
"packet_chain_count": 10,
|
||||
"truth_upgrade_count": 0
|
||||
},
|
||||
"truth_matrix_allowed": false
|
||||
}
|
||||
@@ -0,0 +1,70 @@
|
||||
{
|
||||
"acceptance_criteria": [
|
||||
"do_not_copy_long_text",
|
||||
"record_line_coordinates",
|
||||
"classify_formula_variant_or_transcription",
|
||||
"preserve_window_hash",
|
||||
"require_second_source_or_scan_review"
|
||||
],
|
||||
"boundary": "Human/second-source transcription queue only.",
|
||||
"claim_status": "open_queue",
|
||||
"created_at": "2026-07-20",
|
||||
"production_tuning_allowed": false,
|
||||
"review_tasks": [
|
||||
{
|
||||
"candidate_causes": [
|
||||
"formula_variant",
|
||||
"source_transcription",
|
||||
"naming_variant"
|
||||
],
|
||||
"claim_boundary": "Review task only; no formula change or truth upgrade.",
|
||||
"download_url": "https://archive.org/download/PrasnaMargaBVR/Prasna%20Marga%201_djvu.txt",
|
||||
"fields_to_check": [
|
||||
"trisphuta",
|
||||
"chatusphuta",
|
||||
"catusphuta",
|
||||
"panchasphuta",
|
||||
"gulika"
|
||||
],
|
||||
"file_name": "Prasna Marga 1_djvu.txt",
|
||||
"line_end": 143,
|
||||
"line_start": 139,
|
||||
"review_status": "needs_human_or_second_source_review",
|
||||
"short_context": "53. The Moon’s Longitude ... 154 54. Position of Gulika 159 55. Thrisphuta... 162",
|
||||
"source_id": "PrasnaMargaBVR",
|
||||
"task_id": "PSLRQ-001",
|
||||
"window_hash": "9b512ea3157ce3f8b24f30a9f7d6ded1a9eb97dc77462dc27cac269ace2f5a52"
|
||||
},
|
||||
{
|
||||
"candidate_causes": [
|
||||
"formula_variant",
|
||||
"source_transcription",
|
||||
"naming_variant"
|
||||
],
|
||||
"claim_boundary": "Review task only; no formula change or truth upgrade.",
|
||||
"download_url": "https://archive.org/download/prasna-marga-part-2-by-bv-raman/Prasna%20Marga%20Part%202%20by%20BV%20Raman_djvu.txt",
|
||||
"fields_to_check": [
|
||||
"trisphuta",
|
||||
"chatusphuta",
|
||||
"catusphuta",
|
||||
"panchasphuta",
|
||||
"gulika"
|
||||
],
|
||||
"file_name": "Prasna Marga Part 2 by BV Raman_djvu.txt",
|
||||
"line_end": 1161,
|
||||
"line_start": 1157,
|
||||
"review_status": "needs_human_or_second_source_review",
|
||||
"short_context": "Stanza 19. If Yama Sukra (...) or the lord of the 10th house from him occupies the 6th, the 8th or the 12th from Arudha or if Venus occupies the 6th, the 8th or the 12th from Yama Sukra, marriage will not take place at the time fixed. If Ra",
|
||||
"source_id": "prasna-marga-part-2-by-bv-raman",
|
||||
"task_id": "PSLRQ-002",
|
||||
"window_hash": "84f1b543641d873e4737333ab9243632f4d7f191b67bf716d3e8616bcc2a10dd"
|
||||
}
|
||||
],
|
||||
"scope": "prashna_sphuta_line_review_queue",
|
||||
"status": "review_queue_ready",
|
||||
"summary": {
|
||||
"review_task_count": 2,
|
||||
"truth_upgrade_count": 0
|
||||
},
|
||||
"truth_matrix_allowed": false
|
||||
}
|
||||
@@ -0,0 +1,52 @@
|
||||
{
|
||||
"boundary": "Queue records candidate causes; closure requires raw source and replay evidence.",
|
||||
"claim_status": "open_queue",
|
||||
"created_at": "2026-07-20",
|
||||
"production_tuning_allowed": false,
|
||||
"rows": [
|
||||
{
|
||||
"candidate_causes": [
|
||||
"formula_variant",
|
||||
"source_transcription",
|
||||
"chatusphuta_catusphuta_naming",
|
||||
"incomplete_input_settings"
|
||||
],
|
||||
"chatusphuta_status": "mismatch",
|
||||
"claim_boundary": "Mismatch queue only; do not tune formulas or upgrade Prashna truth from this packet.",
|
||||
"next_evidence": [
|
||||
"raw scan/page capture",
|
||||
"complete example input",
|
||||
"independent translation/transcription check",
|
||||
"legal external replay"
|
||||
],
|
||||
"next_evidence_owner": "worked_example_collection",
|
||||
"panchasphuta_status": "mismatch",
|
||||
"source_id": "vedastro_prasna_marga_ch5_sphuta_example",
|
||||
"trisphuta_status": "matches",
|
||||
"upgrade_status": "not_oracle_ready",
|
||||
"url": "https://vedastro.org/book/PrasnaMarga/Chapter5"
|
||||
}
|
||||
],
|
||||
"scope": "prashna_sphuta_mismatch_arbitration",
|
||||
"source_candidates": [
|
||||
{
|
||||
"source_id": "vedastro_prasna_marga_ch5_sphuta_example",
|
||||
"source_role": "numeric_candidate",
|
||||
"upgrade_status": "candidate_not_oracle",
|
||||
"url": "https://vedastro.org/book/PrasnaMarga/Chapter5"
|
||||
},
|
||||
{
|
||||
"source_id": "internet_archive_prasna_marga_bv_raman_sphuta_fragment",
|
||||
"source_role": "public_formula_numeric_fragment_candidate",
|
||||
"upgrade_status": "candidate_not_oracle",
|
||||
"url": "https://archive.org/details/PrasnaMarga/"
|
||||
}
|
||||
],
|
||||
"status": "arbitration_queue_ready",
|
||||
"summary": {
|
||||
"mismatch_count": 1,
|
||||
"oracle_ready_count": 0,
|
||||
"source_candidate_count": 2
|
||||
},
|
||||
"truth_matrix_allowed": false
|
||||
}
|
||||
File diff suppressed because one or more lines are too long
@@ -0,0 +1,97 @@
|
||||
{
|
||||
"boundary": "Blank template only; human review fields must be filled before any classification or formula change.",
|
||||
"claim_status": "blocked_until_human_labels",
|
||||
"created_at": "2026-07-20",
|
||||
"production_tuning_allowed": false,
|
||||
"scope": "prashna_sphuta_review_result_template",
|
||||
"status": "blank_review_template_ready",
|
||||
"summary": {
|
||||
"completed_review_count": 0,
|
||||
"template_count": 2,
|
||||
"truth_upgrade_count": 0
|
||||
},
|
||||
"templates": [
|
||||
{
|
||||
"allowed_results": [
|
||||
"formula_variant",
|
||||
"source_transcription",
|
||||
"naming_variant",
|
||||
"insufficient_evidence"
|
||||
],
|
||||
"candidate_causes": [
|
||||
"formula_variant",
|
||||
"source_transcription",
|
||||
"naming_variant"
|
||||
],
|
||||
"claim_boundary": "Review task only; no formula change or truth upgrade.",
|
||||
"completed": false,
|
||||
"download_url": "https://archive.org/download/PrasnaMargaBVR/Prasna%20Marga%201_djvu.txt",
|
||||
"fields_to_check": [
|
||||
"trisphuta",
|
||||
"chatusphuta",
|
||||
"catusphuta",
|
||||
"panchasphuta",
|
||||
"gulika"
|
||||
],
|
||||
"file_name": "Prasna Marga 1_djvu.txt",
|
||||
"line_end": 143,
|
||||
"line_start": 139,
|
||||
"required_human_fields": [
|
||||
"reviewer_id",
|
||||
"reviewed_at",
|
||||
"source_line_coordinates",
|
||||
"second_source_or_scan_evidence",
|
||||
"review_notes"
|
||||
],
|
||||
"review_result": null,
|
||||
"review_status": "needs_human_or_second_source_review",
|
||||
"short_context": "53. The Moon’s Longitude ... 154 54. Position of Gulika 159 55. Thrisphuta... 162",
|
||||
"source_id": "PrasnaMargaBVR",
|
||||
"task_id": "PSLRQ-001",
|
||||
"upgrade_after_completion": "requires_replay_packet_and_gate_review",
|
||||
"window_hash": "9b512ea3157ce3f8b24f30a9f7d6ded1a9eb97dc77462dc27cac269ace2f5a52"
|
||||
},
|
||||
{
|
||||
"allowed_results": [
|
||||
"formula_variant",
|
||||
"source_transcription",
|
||||
"naming_variant",
|
||||
"insufficient_evidence"
|
||||
],
|
||||
"candidate_causes": [
|
||||
"formula_variant",
|
||||
"source_transcription",
|
||||
"naming_variant"
|
||||
],
|
||||
"claim_boundary": "Review task only; no formula change or truth upgrade.",
|
||||
"completed": false,
|
||||
"download_url": "https://archive.org/download/prasna-marga-part-2-by-bv-raman/Prasna%20Marga%20Part%202%20by%20BV%20Raman_djvu.txt",
|
||||
"fields_to_check": [
|
||||
"trisphuta",
|
||||
"chatusphuta",
|
||||
"catusphuta",
|
||||
"panchasphuta",
|
||||
"gulika"
|
||||
],
|
||||
"file_name": "Prasna Marga Part 2 by BV Raman_djvu.txt",
|
||||
"line_end": 1161,
|
||||
"line_start": 1157,
|
||||
"required_human_fields": [
|
||||
"reviewer_id",
|
||||
"reviewed_at",
|
||||
"source_line_coordinates",
|
||||
"second_source_or_scan_evidence",
|
||||
"review_notes"
|
||||
],
|
||||
"review_result": null,
|
||||
"review_status": "needs_human_or_second_source_review",
|
||||
"short_context": "Stanza 19. If Yama Sukra (...) or the lord of the 10th house from him occupies the 6th, the 8th or the 12th from Arudha or if Venus occupies the 6th, the 8th or the 12th from Yama Sukra, marriage will not take place at the time fixed. If Ra",
|
||||
"source_id": "prasna-marga-part-2-by-bv-raman",
|
||||
"task_id": "PSLRQ-002",
|
||||
"upgrade_after_completion": "requires_replay_packet_and_gate_review",
|
||||
"window_hash": "84f1b543641d873e4737333ab9243632f4d7f191b67bf716d3e8616bcc2a10dd"
|
||||
}
|
||||
],
|
||||
"truth_matrix_allowed": false,
|
||||
"upgrade_policy": "no_upgrade_until_completed_review_and_replay"
|
||||
}
|
||||
@@ -0,0 +1,53 @@
|
||||
{
|
||||
"allowed_results": [
|
||||
"formula_variant",
|
||||
"source_transcription",
|
||||
"naming_variant",
|
||||
"insufficient_evidence"
|
||||
],
|
||||
"boundary": "Blank templates remain blocked; completed review alone still cannot upgrade truth without replay.",
|
||||
"claim_status": "blocked_until_human_labels",
|
||||
"created_at": "2026-07-20",
|
||||
"production_tuning_allowed": false,
|
||||
"replay_gate_policy": "requires_valid_completed_review_and_complete_prashna_input",
|
||||
"scope": "prashna_sphuta_review_result_validation",
|
||||
"status": "validation_ready",
|
||||
"summary": {
|
||||
"replay_gate_ready_count": 0,
|
||||
"template_count": 2,
|
||||
"valid_completed_review_count": 0
|
||||
},
|
||||
"truth_matrix_allowed": false,
|
||||
"validation_rows": [
|
||||
{
|
||||
"claim_boundary": "Validation only; replay gate also requires complete Prashna input.",
|
||||
"missing_fields": [
|
||||
"review_result",
|
||||
"reviewer_id",
|
||||
"reviewed_at",
|
||||
"source_line_coordinates",
|
||||
"second_source_or_scan_evidence",
|
||||
"review_notes"
|
||||
],
|
||||
"replay_gate_ready": false,
|
||||
"review_result": null,
|
||||
"task_id": "PSLRQ-001",
|
||||
"validation_status": "blocked_missing_human_review"
|
||||
},
|
||||
{
|
||||
"claim_boundary": "Validation only; replay gate also requires complete Prashna input.",
|
||||
"missing_fields": [
|
||||
"review_result",
|
||||
"reviewer_id",
|
||||
"reviewed_at",
|
||||
"source_line_coordinates",
|
||||
"second_source_or_scan_evidence",
|
||||
"review_notes"
|
||||
],
|
||||
"replay_gate_ready": false,
|
||||
"review_result": null,
|
||||
"task_id": "PSLRQ-002",
|
||||
"validation_status": "blocked_missing_human_review"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,87 @@
|
||||
{
|
||||
"boundary": "Matrix connects VedAstro expected values, local arithmetic replay, and IA locator hashes; still open queue.",
|
||||
"claim_status": "open_queue",
|
||||
"created_at": "2026-07-20",
|
||||
"field_rows": [
|
||||
{
|
||||
"claim_boundary": "Field comparison only; no Prashna truth upgrade without complete input/raw/replay.",
|
||||
"field": "sun",
|
||||
"ia_excerpt_status": "not_field_specific",
|
||||
"local_formula_degree": null,
|
||||
"local_vs_vedastro_status": "input_value_only",
|
||||
"vedastro_expected_degree": 123.14027777777778
|
||||
},
|
||||
{
|
||||
"claim_boundary": "Field comparison only; no Prashna truth upgrade without complete input/raw/replay.",
|
||||
"field": "moon",
|
||||
"ia_excerpt_status": "not_field_specific",
|
||||
"local_formula_degree": null,
|
||||
"local_vs_vedastro_status": "input_value_only",
|
||||
"vedastro_expected_degree": 109.60944444444443
|
||||
},
|
||||
{
|
||||
"claim_boundary": "Field comparison only; no Prashna truth upgrade without complete input/raw/replay.",
|
||||
"field": "lagna",
|
||||
"ia_excerpt_status": "not_field_specific",
|
||||
"local_formula_degree": null,
|
||||
"local_vs_vedastro_status": "input_value_only",
|
||||
"vedastro_expected_degree": 117.36666666666666
|
||||
},
|
||||
{
|
||||
"claim_boundary": "Field comparison only; no Prashna truth upgrade without complete input/raw/replay.",
|
||||
"field": "gulika",
|
||||
"ia_excerpt_status": "located_context",
|
||||
"local_formula_degree": null,
|
||||
"local_vs_vedastro_status": "input_value_only",
|
||||
"vedastro_expected_degree": 104.16666666666667
|
||||
},
|
||||
{
|
||||
"claim_boundary": "Field comparison only; no Prashna truth upgrade without complete input/raw/replay.",
|
||||
"field": "rahu",
|
||||
"ia_excerpt_status": "not_field_specific",
|
||||
"local_formula_degree": null,
|
||||
"local_vs_vedastro_status": "input_value_only",
|
||||
"vedastro_expected_degree": 98.26666666666667
|
||||
},
|
||||
{
|
||||
"claim_boundary": "Field comparison only; no Prashna truth upgrade without complete input/raw/replay.",
|
||||
"field": "trisphuta",
|
||||
"ia_excerpt_status": "located_context",
|
||||
"local_formula_degree": 331.1427777777778,
|
||||
"local_vs_vedastro_status": "match",
|
||||
"vedastro_expected_degree": 331.1427777777778
|
||||
},
|
||||
{
|
||||
"claim_boundary": "Field comparison only; no Prashna truth upgrade without complete input/raw/replay.",
|
||||
"field": "chatusphuta",
|
||||
"ia_excerpt_status": "located_context",
|
||||
"local_formula_degree": 94.28305555555556,
|
||||
"local_vs_vedastro_status": "mismatch",
|
||||
"vedastro_expected_degree": 75.30944444444444
|
||||
},
|
||||
{
|
||||
"claim_boundary": "Field comparison only; no Prashna truth upgrade without complete input/raw/replay.",
|
||||
"field": "panchasphuta",
|
||||
"ia_excerpt_status": "located_context",
|
||||
"local_formula_degree": 192.54972222222221,
|
||||
"local_vs_vedastro_status": "mismatch",
|
||||
"vedastro_expected_degree": 173.57611111111112
|
||||
}
|
||||
],
|
||||
"ia_excerpt_window_count": 2,
|
||||
"next_evidence": [
|
||||
"line-level transcription review",
|
||||
"complete Prashna input",
|
||||
"legal external replay"
|
||||
],
|
||||
"production_tuning_allowed": false,
|
||||
"scope": "prashna_sphuta_source_comparison_matrix",
|
||||
"status": "comparison_matrix_ready",
|
||||
"summary": {
|
||||
"field_count": 8,
|
||||
"match_count": 1,
|
||||
"mismatch_count": 2,
|
||||
"truth_upgrade_count": 0
|
||||
},
|
||||
"truth_matrix_allowed": false
|
||||
}
|
||||
@@ -0,0 +1,112 @@
|
||||
{
|
||||
"scope": "research_web_skill_commercial_gap_registry",
|
||||
"created_at": "2026-07-20",
|
||||
"claim_status": "open_queue",
|
||||
"production_tuning_allowed": false,
|
||||
"truth_matrix_allowed": false,
|
||||
"boundary": "Research repo optimization plan only. Commercial UI patterns can be learned as product flow references, but research runtime must not import Supabase, credits, payment, or dirty commercial worktree code.",
|
||||
"current_state": {
|
||||
"research_repo": {
|
||||
"strength": [
|
||||
"core Jyotish calculation and interpretation skill coverage",
|
||||
"strict workflow and Technique Audit Table requirements",
|
||||
"evidence packet index and claim-status governance",
|
||||
"open-source observation probes for PyJHora/JHora, jyotishganit, VedicAstro, Xalen/Jyotishyamitra candidates"
|
||||
],
|
||||
"web_maturity": "research_tooling_partial",
|
||||
"web_current_entries": [
|
||||
"chart calculation and rendering",
|
||||
"AI/chat bridge",
|
||||
"rectification UI and engine",
|
||||
"MEVG audit helpers",
|
||||
"Tajika/transit/advanced analysis modules"
|
||||
],
|
||||
"web_gap": [
|
||||
"profile onboarding is lighter than commercial chart-profile flow",
|
||||
"local chart library and current-profile linkage need clearer UX",
|
||||
"conversation/session management is less mature than commercial sidebar",
|
||||
"rectification journey lacks commercial-grade resume/mobile-scroll/error-contract polish",
|
||||
"skill truth overlay is stronger than web claim display; web should surface blocked/partial boundaries more explicitly"
|
||||
]
|
||||
},
|
||||
"skill_layer": {
|
||||
"strength": [
|
||||
"35 Dasha systems named with maturity caveats",
|
||||
"405+ Yoga rule registry",
|
||||
"D1-D144/generic divisional engine claims guarded by truth overlay",
|
||||
"Prashna/KP/Muhurta/Tajika/Sphuta marked partial or blocked where needed"
|
||||
],
|
||||
"gap": [
|
||||
"effective_skill_capability_view must be the only advertised capability source",
|
||||
"web/API should consume skill_truth_overlay before showing technique confidence",
|
||||
"high-rigor closure gates need visible UI/API claim boundaries",
|
||||
"worked-example numeric packets should drive skill upgrades, not registry labels alone"
|
||||
]
|
||||
},
|
||||
"commercial_repo_patterns_to_learn": {
|
||||
"source_path": "/private/tmp/jyotisha-commercial-readonly.adiUr0",
|
||||
"source_status": "read_only_dirty_worktree_do_not_copy_directly",
|
||||
"valuable_patterns": [
|
||||
"chart profile persistence flow",
|
||||
"birth-time journey resume and turn persistence",
|
||||
"dynamic rectification question planner and stop policy",
|
||||
"mobile scroll contract for rectification cards",
|
||||
"sidebar session row actions and conversation organization",
|
||||
"user-facing error contracts around invalid patterns/input"
|
||||
],
|
||||
"must_not_import": [
|
||||
"Supabase runtime",
|
||||
"credits/payment/subscription logic",
|
||||
"commercial auth/session business rules",
|
||||
"dirty uncommitted API/test changes",
|
||||
"commercial user data"
|
||||
]
|
||||
}
|
||||
},
|
||||
"delivery_queue": [
|
||||
{
|
||||
"track": "worked_examples_to_numeric_packets",
|
||||
"status": "in_progress",
|
||||
"next_delivery": "Convert eligible public/OSS candidates into raw-captured numeric packets only when exact input, expected numeric fields, license/version, and replay hash are available.",
|
||||
"gate_for_upgrade": "oracle_ready_count > 0 in worked_example_numeric_packet_eligibility"
|
||||
},
|
||||
{
|
||||
"track": "component_closure",
|
||||
"status": "in_progress",
|
||||
"next_delivery": "Use Shadbala same-unit rows to close each of 42 components as within_tolerance, formula_mismatch, unit_mismatch, or method_variant.",
|
||||
"gate_for_upgrade": "absolute_parity_ready_count increases without majority-vote truth"
|
||||
},
|
||||
{
|
||||
"track": "claim_gate_upgrade",
|
||||
"status": "in_progress",
|
||||
"next_delivery": "Wire high-rigor closure snapshot into user-facing/API claim boundary so blocked/partial cannot be displayed as verified.",
|
||||
"gate_for_upgrade": "runtime output carries claim_status and production_tuning_allowed=false for partial techniques"
|
||||
},
|
||||
{
|
||||
"track": "research_web_profile_flow",
|
||||
"status": "planned",
|
||||
"next_delivery": "Adopt commercial-style chart profile onboarding with localStorage only: name, birth date/time, place, timezone, optional gender-role field, active profile selector.",
|
||||
"gate_for_upgrade": "local profile save/load/clear and active-profile chart hash tests pass"
|
||||
},
|
||||
{
|
||||
"track": "research_web_rectification_journey",
|
||||
"status": "planned",
|
||||
"next_delivery": "Learn commercial journey patterns: resume state, candidate range card, mobile scroll contract, clearer invalid-input messages.",
|
||||
"gate_for_upgrade": "rectification UI tests prove candidate claim remains exploratory, not birth-time truth"
|
||||
},
|
||||
{
|
||||
"track": "skill_to_web_sync",
|
||||
"status": "planned",
|
||||
"next_delivery": "Expose effective_skill_capability_view and skill_truth_overlay inside research web technique audit display.",
|
||||
"gate_for_upgrade": "web audit table labels KP/Muhurta/Shadbala/Prashna according to overlay, not optimistic registry labels"
|
||||
}
|
||||
],
|
||||
"recommended_order": [
|
||||
"worked_examples_to_numeric_packets",
|
||||
"component_closure",
|
||||
"claim_gate_upgrade",
|
||||
"research_web_profile_flow",
|
||||
"research_web_rectification_journey",
|
||||
"skill_to_web_sync"
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,182 @@
|
||||
{
|
||||
"scope": "shadbala_naisargika_closure_packet",
|
||||
"created_at": "2026-07-20",
|
||||
"component": "naisargika",
|
||||
"canonical_component": "Naisargikabala",
|
||||
"status": "same_unit_observation_frozen",
|
||||
"claim_status": "partial",
|
||||
"closure_classification": "within_tolerance_observation",
|
||||
"absolute_parity_ready": false,
|
||||
"production_tuning_allowed": false,
|
||||
"truth_matrix_allowed": false,
|
||||
"source_queue": "references/oracle/shadbala_component_closure_queue_v2_2026_07_19.json",
|
||||
"summary": {
|
||||
"component_row_count": 7,
|
||||
"within_tolerance_count": 7,
|
||||
"max_delta_virupa": 0.0,
|
||||
"source_count_per_row": 5
|
||||
},
|
||||
"rows": [
|
||||
{
|
||||
"ticket_id": "shadbala.sun.naisargika",
|
||||
"planet": "Sun",
|
||||
"canonical_component": "Naisargikabala",
|
||||
"normalized_values_virupa": {
|
||||
"jyotishganit": 60.0,
|
||||
"local": 60.0,
|
||||
"vp_jain_local": 60.0,
|
||||
"vp_jain_published": 60.0,
|
||||
"xalen": 60.0
|
||||
},
|
||||
"max_delta_virupa": 0.0,
|
||||
"closure_status": "same_unit_observation_frozen",
|
||||
"closure_classification": "within_tolerance_observation",
|
||||
"unit_contract": "Virupa fixed natural-strength table; 60 Virupa = 1 Rupa.",
|
||||
"source_evidence": [
|
||||
"classical natural strength ordering",
|
||||
"VP Jain fixture",
|
||||
"Xalen delta report"
|
||||
],
|
||||
"claim_boundary": "Natural-strength table agrees across current five sources for this one VP Jain chart, but absolute Shadbala parity still requires second public case and full six-force totals."
|
||||
},
|
||||
{
|
||||
"ticket_id": "shadbala.moon.naisargika",
|
||||
"planet": "Moon",
|
||||
"canonical_component": "Naisargikabala",
|
||||
"normalized_values_virupa": {
|
||||
"jyotishganit": 51.43,
|
||||
"local": 51.43,
|
||||
"vp_jain_local": 51.43,
|
||||
"vp_jain_published": 51.43,
|
||||
"xalen": 51.43
|
||||
},
|
||||
"max_delta_virupa": 0.0,
|
||||
"closure_status": "same_unit_observation_frozen",
|
||||
"closure_classification": "within_tolerance_observation",
|
||||
"unit_contract": "Virupa fixed natural-strength table; 60 Virupa = 1 Rupa.",
|
||||
"source_evidence": [
|
||||
"classical natural strength ordering",
|
||||
"VP Jain fixture",
|
||||
"Xalen delta report"
|
||||
],
|
||||
"claim_boundary": "Natural-strength table agrees across current five sources for this one VP Jain chart, but absolute Shadbala parity still requires second public case and full six-force totals."
|
||||
},
|
||||
{
|
||||
"ticket_id": "shadbala.mars.naisargika",
|
||||
"planet": "Mars",
|
||||
"canonical_component": "Naisargikabala",
|
||||
"normalized_values_virupa": {
|
||||
"jyotishganit": 17.14,
|
||||
"local": 17.14,
|
||||
"vp_jain_local": 17.14,
|
||||
"vp_jain_published": 17.14,
|
||||
"xalen": 17.14
|
||||
},
|
||||
"max_delta_virupa": 0.0,
|
||||
"closure_status": "same_unit_observation_frozen",
|
||||
"closure_classification": "within_tolerance_observation",
|
||||
"unit_contract": "Virupa fixed natural-strength table; 60 Virupa = 1 Rupa.",
|
||||
"source_evidence": [
|
||||
"classical natural strength ordering",
|
||||
"VP Jain fixture",
|
||||
"Xalen delta report"
|
||||
],
|
||||
"claim_boundary": "Natural-strength table agrees across current five sources for this one VP Jain chart, but absolute Shadbala parity still requires second public case and full six-force totals."
|
||||
},
|
||||
{
|
||||
"ticket_id": "shadbala.mercury.naisargika",
|
||||
"planet": "Mercury",
|
||||
"canonical_component": "Naisargikabala",
|
||||
"normalized_values_virupa": {
|
||||
"jyotishganit": 25.71,
|
||||
"local": 25.71,
|
||||
"vp_jain_local": 25.71,
|
||||
"vp_jain_published": 25.71,
|
||||
"xalen": 25.71
|
||||
},
|
||||
"max_delta_virupa": 0.0,
|
||||
"closure_status": "same_unit_observation_frozen",
|
||||
"closure_classification": "within_tolerance_observation",
|
||||
"unit_contract": "Virupa fixed natural-strength table; 60 Virupa = 1 Rupa.",
|
||||
"source_evidence": [
|
||||
"classical natural strength ordering",
|
||||
"VP Jain fixture",
|
||||
"Xalen delta report"
|
||||
],
|
||||
"claim_boundary": "Natural-strength table agrees across current five sources for this one VP Jain chart, but absolute Shadbala parity still requires second public case and full six-force totals."
|
||||
},
|
||||
{
|
||||
"ticket_id": "shadbala.jupiter.naisargika",
|
||||
"planet": "Jupiter",
|
||||
"canonical_component": "Naisargikabala",
|
||||
"normalized_values_virupa": {
|
||||
"jyotishganit": 34.29,
|
||||
"local": 34.29,
|
||||
"vp_jain_local": 34.29,
|
||||
"vp_jain_published": 34.29,
|
||||
"xalen": 34.29
|
||||
},
|
||||
"max_delta_virupa": 0.0,
|
||||
"closure_status": "same_unit_observation_frozen",
|
||||
"closure_classification": "within_tolerance_observation",
|
||||
"unit_contract": "Virupa fixed natural-strength table; 60 Virupa = 1 Rupa.",
|
||||
"source_evidence": [
|
||||
"classical natural strength ordering",
|
||||
"VP Jain fixture",
|
||||
"Xalen delta report"
|
||||
],
|
||||
"claim_boundary": "Natural-strength table agrees across current five sources for this one VP Jain chart, but absolute Shadbala parity still requires second public case and full six-force totals."
|
||||
},
|
||||
{
|
||||
"ticket_id": "shadbala.venus.naisargika",
|
||||
"planet": "Venus",
|
||||
"canonical_component": "Naisargikabala",
|
||||
"normalized_values_virupa": {
|
||||
"jyotishganit": 42.86,
|
||||
"local": 42.86,
|
||||
"vp_jain_local": 42.86,
|
||||
"vp_jain_published": 42.86,
|
||||
"xalen": 42.86
|
||||
},
|
||||
"max_delta_virupa": 0.0,
|
||||
"closure_status": "same_unit_observation_frozen",
|
||||
"closure_classification": "within_tolerance_observation",
|
||||
"unit_contract": "Virupa fixed natural-strength table; 60 Virupa = 1 Rupa.",
|
||||
"source_evidence": [
|
||||
"classical natural strength ordering",
|
||||
"VP Jain fixture",
|
||||
"Xalen delta report"
|
||||
],
|
||||
"claim_boundary": "Natural-strength table agrees across current five sources for this one VP Jain chart, but absolute Shadbala parity still requires second public case and full six-force totals."
|
||||
},
|
||||
{
|
||||
"ticket_id": "shadbala.saturn.naisargika",
|
||||
"planet": "Saturn",
|
||||
"canonical_component": "Naisargikabala",
|
||||
"normalized_values_virupa": {
|
||||
"jyotishganit": 8.57,
|
||||
"local": 8.57,
|
||||
"vp_jain_local": 8.57,
|
||||
"vp_jain_published": 8.57,
|
||||
"xalen": 8.57
|
||||
},
|
||||
"max_delta_virupa": 0.0,
|
||||
"closure_status": "same_unit_observation_frozen",
|
||||
"closure_classification": "within_tolerance_observation",
|
||||
"unit_contract": "Virupa fixed natural-strength table; 60 Virupa = 1 Rupa.",
|
||||
"source_evidence": [
|
||||
"classical natural strength ordering",
|
||||
"VP Jain fixture",
|
||||
"Xalen delta report"
|
||||
],
|
||||
"claim_boundary": "Natural-strength table agrees across current five sources for this one VP Jain chart, but absolute Shadbala parity still requires second public case and full six-force totals."
|
||||
}
|
||||
],
|
||||
"boundary": "This packet freezes same-unit observation for Naisargikabala only. It does not close Sthana/Dig/Kala/Chesta/Drik, does not prove Shadbala total parity, and cannot tune production predictions.",
|
||||
"next_actions": [
|
||||
"add a second public numeric Shadbala worked example",
|
||||
"keep fixed-table source citation attached to formula_source_knowledge_base",
|
||||
"continue component closure for formula_or_unit_mismatch rows"
|
||||
],
|
||||
"raw_hash": "01d789215d47c293de2a0c23c0373ea9add2b1f4f41bd6e089d94d7bc254a3b7"
|
||||
}
|
||||
@@ -0,0 +1,43 @@
|
||||
#!/usr/bin/env python3
|
||||
"""Locate short Prasna Marga Sphuta source windows by IA text URLs."""
|
||||
from __future__ import annotations
|
||||
import argparse, hashlib, json
|
||||
from pathlib import Path
|
||||
from urllib.request import Request, urlopen
|
||||
|
||||
ROOT = Path(__file__).resolve().parents[1]
|
||||
SRC = ROOT / "references/oracle/prashna_marga_raw_capture_packet_2026_07_20.json"
|
||||
OUT = ROOT / "references/oracle/prashna_marga_excerpt_locator_2026_07_20.json"
|
||||
TERMS = ["Trisphuta", "Chatusphuta", "Catusphuta", "Panchasphuta", "Gulika"]
|
||||
|
||||
def sha(s: str) -> str: return hashlib.sha256(s.encode('utf-8','ignore')).hexdigest()
|
||||
def fetch(url: str) -> str:
|
||||
req=Request(url,headers={'User-Agent':'Mozilla/5.0'})
|
||||
with urlopen(req,timeout=25) as r: return r.read().decode('utf-8','ignore')
|
||||
|
||||
def locate(text: str, source_id: str, file_name: str, url: str):
|
||||
lines=text.splitlines()
|
||||
for i,line in enumerate(lines):
|
||||
if any(t.lower() in line.lower() for t in TERMS):
|
||||
start=max(0,i-2); end=min(len(lines),i+3)
|
||||
window='\n'.join(lines[start:end])
|
||||
compact=' '.join(window.split())[:240]
|
||||
return {'source_id':source_id,'file_name':file_name,'download_url':url,'matched_line':i+1,'line_start':start+1,'line_end':end,'matched_terms':[t for t in TERMS if t.lower() in window.lower()],'window_hash':sha(window),'short_context':compact}
|
||||
return None
|
||||
|
||||
def build(date: str):
|
||||
src=json.load(open(SRC)); wins=[]; blocked=[]
|
||||
for item in src['internet_archive_items']:
|
||||
for f in item['files']:
|
||||
if f['format']!='DjVuTXT': continue
|
||||
try:
|
||||
hit=locate(fetch(f['download_url']), item['identifier'], f['name'], f['download_url'])
|
||||
if hit: wins.append(hit)
|
||||
else: blocked.append({'source_id':item['identifier'],'file_name':f['name'],'status':'locator_terms_not_found'})
|
||||
except Exception as e:
|
||||
blocked.append({'source_id':item['identifier'],'file_name':f['name'],'status':'fetch_failed','error':type(e).__name__})
|
||||
return {'scope':'prashna_marga_excerpt_locator','created_at':date,'status':'excerpt_locator_ready','claim_status':'source_intake_only','production_tuning_allowed':False,'truth_matrix_allowed':False,'summary':{'located_window_count':len(wins),'blocked_file_count':len(blocked),'oracle_ready_count':0},'located_windows':wins,'blocked_files':blocked,'missing_for_oracle':['complete_prashna_input','raw excerpt capture','line-level transcription review','legal external replay'],'upgrade_status':'candidate_not_oracle','next_steps':['raw excerpt capture with page/line coordinates and independent transcription review','compare VedAstro vs B.V. Raman wording before formula tuning'],'boundary':'Short context and hashes only; no long copyrighted text is reproduced and no truth upgrade is allowed.'}
|
||||
|
||||
def main():
|
||||
ap=argparse.ArgumentParser(); ap.add_argument('--date',default='2026-07-20'); args=ap.parse_args(); data=build(args.date); OUT.write_text(json.dumps(data,ensure_ascii=False,indent=2,sort_keys=True)+'\n'); print(json.dumps(data,ensure_ascii=False,indent=2,sort_keys=True))
|
||||
if __name__=='__main__': main()
|
||||
@@ -0,0 +1,33 @@
|
||||
#!/usr/bin/env python3
|
||||
"""Pin Internet Archive Prasna Marga source metadata for later raw excerpt capture."""
|
||||
from __future__ import annotations
|
||||
import argparse, hashlib, json
|
||||
from pathlib import Path
|
||||
|
||||
ROOT = Path(__file__).resolve().parents[1]
|
||||
OUT = ROOT / "references/oracle/prashna_marga_raw_capture_packet_2026_07_20.json"
|
||||
|
||||
ITEMS = [
|
||||
{
|
||||
'identifier':'PrasnaMargaBVR','title':'Prasna Marga - Dr. BV Raman','metadata_url':'https://archive.org/metadata/PrasnaMargaBVR',
|
||||
'files':[{'name':'Prasna Marga 1_djvu.txt','format':'DjVuTXT','sha1':'bed3491a79ca5039409dac7fd62e386f7de55a47','download_url':'https://archive.org/download/PrasnaMargaBVR/Prasna%20Marga%201_djvu.txt'}, {'name':'Prasna Marga 1.pdf','format':'Text PDF','sha1':'86839fc2d13509309ec3a14a160c861bb223d844','download_url':'https://archive.org/download/PrasnaMargaBVR/Prasna%20Marga%201.pdf'}]
|
||||
},
|
||||
{
|
||||
'identifier':'prasna-marga-part-2-by-bv-raman','title':'Prasna Marga Part 2 By BV Raman','metadata_url':'https://archive.org/metadata/prasna-marga-part-2-by-bv-raman',
|
||||
'files':[{'name':'Prasna Marga Part 2 by BV Raman_djvu.txt','format':'DjVuTXT','sha1':'17c432465520ef75bde7a2c4fa167ff119664666','download_url':'https://archive.org/download/prasna-marga-part-2-by-bv-raman/Prasna%20Marga%20Part%202%20by%20BV%20Raman_djvu.txt'}]
|
||||
},
|
||||
]
|
||||
|
||||
def digest(obj): return hashlib.sha256(json.dumps(obj,ensure_ascii=False,sort_keys=True).encode()).hexdigest()
|
||||
|
||||
def build(date):
|
||||
items=[]
|
||||
for it in ITEMS:
|
||||
row={**it,'source_metadata_hash':'','upgrade_status':'candidate_not_oracle','claim_boundary':'Metadata/file hash pin only; no book text is vendored and no numeric truth is upgraded.'}
|
||||
row['source_metadata_hash']=digest(row)
|
||||
items.append(row)
|
||||
return {'scope':'prashna_marga_raw_capture_packet','created_at':date,'status':'raw_capture_metadata_ready','claim_status':'source_intake_only','production_tuning_allowed':False,'truth_matrix_allowed':False,'summary':{'ia_item_count':len(items),'pinned_file_count':sum(len(i['files']) for i in items),'oracle_ready_count':0},'field_locator_terms':['Trisphuta','Chatusphuta','Catusphuta','Panchasphuta','Gulika'],'internet_archive_items':items,'next_steps':['raw excerpt capture around locator terms with page/line coordinates','compare B.V. Raman scan vs VedAstro transcription','only then classify formula_variant vs source_transcription'],'boundary':'Capture metadata only; long copyrighted text is not reproduced.'}
|
||||
|
||||
def main():
|
||||
ap=argparse.ArgumentParser(); ap.add_argument('--date',default='2026-07-20'); args=ap.parse_args(); data=build(args.date); OUT.write_text(json.dumps(data,ensure_ascii=False,indent=2,sort_keys=True)+'\n'); print(json.dumps(data,ensure_ascii=False,indent=2,sort_keys=True))
|
||||
if __name__=='__main__': main()
|
||||
@@ -0,0 +1,27 @@
|
||||
#!/usr/bin/env python3
|
||||
"""Summarize Prashna/Sphuta closure chain and remaining gates."""
|
||||
from __future__ import annotations
|
||||
import argparse, json
|
||||
from pathlib import Path
|
||||
|
||||
ROOT = Path(__file__).resolve().parents[1]
|
||||
OUT = ROOT / "references/oracle/prashna_sphuta_closure_dashboard_2026_07_20.json"
|
||||
CHAIN = [
|
||||
'prashna_input_contract_2026_07_20.json','prashna_numeric_oracle_packet_queue_2026_07_20.json','prashna_sphuta_candidate_replay_readiness_2026_07_20.json','prashna_sphuta_mismatch_arbitration_2026_07_20.json','prashna_marga_raw_capture_packet_2026_07_20.json','prashna_marga_excerpt_locator_2026_07_20.json','prashna_sphuta_source_comparison_matrix_2026_07_20.json','prashna_sphuta_line_review_queue_2026_07_20.json','prashna_sphuta_review_result_template_2026_07_20.json','prashna_sphuta_review_result_validation_2026_07_20.json']
|
||||
|
||||
def build(date):
|
||||
packets=[]
|
||||
for f in CHAIN:
|
||||
p=ROOT/'references/oracle'/f
|
||||
d=json.load(open(p)); packets.append({'path':str(p.relative_to(ROOT)),'scope':d.get('scope'),'claim_status':d.get('claim_status'),'status':d.get('status')})
|
||||
gates=[
|
||||
{'gate_id':'human_line_review','status':'blocked','evidence':'review_result_validation valid_completed_review_count == 0'},
|
||||
{'gate_id':'complete_prashna_input','status':'blocked','evidence':'candidate lacks question datetime/location/timezone/ayanamsa/node'},
|
||||
{'gate_id':'legal_external_replay','status':'blocked','evidence':'no PyJHora/other legal replay packet yet'},
|
||||
{'gate_id':'formula_or_transcription_arbitration','status':'open_queue','evidence':'Trisphuta matches; Chatusphuta/Panchasphuta mismatch'},
|
||||
]
|
||||
return {'scope':'prashna_sphuta_closure_dashboard','created_at':date,'status':'closure_dashboard_ready','claim_status':'blocked_until_human_labels','production_tuning_allowed':False,'truth_matrix_allowed':False,'commercial_sync_status':'research_observation_only','summary':{'packet_chain_count':len(packets),'blocked_gate_count':sum(g['status']=='blocked' for g in gates),'truth_upgrade_count':0},'packet_chain':packets,'gates':gates,'forbidden_uses':['do_not_use_for_deterministic_prashna_verdict','do_not_tune_formula_from_candidate_mismatch','do_not_claim_external_oracle_ready'],'next_actions':['fill review_result_template via human/second-source review','capture complete Prashna input if a worked example is found','run legal external replay only after inputs close'],'boundary':'Dashboard only; summarizes blocked gates and does not upgrade any Prashna/Sphuta claim.'}
|
||||
|
||||
def main():
|
||||
ap=argparse.ArgumentParser(); ap.add_argument('--date',default='2026-07-20'); args=ap.parse_args(); data=build(args.date); OUT.write_text(json.dumps(data,ensure_ascii=False,indent=2,sort_keys=True)+'\n'); print(json.dumps(data,ensure_ascii=False,indent=2,sort_keys=True))
|
||||
if __name__=='__main__': main()
|
||||
@@ -0,0 +1,19 @@
|
||||
#!/usr/bin/env python3
|
||||
"""Create line-level review tasks from Prasna Marga excerpt locator windows."""
|
||||
from __future__ import annotations
|
||||
import argparse, json
|
||||
from pathlib import Path
|
||||
|
||||
ROOT = Path(__file__).resolve().parents[1]
|
||||
LOC = ROOT / "references/oracle/prashna_marga_excerpt_locator_2026_07_20.json"
|
||||
OUT = ROOT / "references/oracle/prashna_sphuta_line_review_queue_2026_07_20.json"
|
||||
|
||||
def build(date):
|
||||
loc=json.load(open(LOC)); tasks=[]
|
||||
for i,w in enumerate(loc['located_windows'],1):
|
||||
tasks.append({'task_id':f'PSLRQ-{i:03d}','source_id':w['source_id'],'file_name':w['file_name'],'download_url':w['download_url'],'line_start':w['line_start'],'line_end':w['line_end'],'window_hash':w['window_hash'],'short_context':w['short_context'],'fields_to_check':['trisphuta','chatusphuta','catusphuta','panchasphuta','gulika'],'review_status':'needs_human_or_second_source_review','candidate_causes':['formula_variant','source_transcription','naming_variant'],'claim_boundary':'Review task only; no formula change or truth upgrade.'})
|
||||
return {'scope':'prashna_sphuta_line_review_queue','created_at':date,'status':'review_queue_ready','claim_status':'open_queue','production_tuning_allowed':False,'truth_matrix_allowed':False,'summary':{'review_task_count':len(tasks),'truth_upgrade_count':0},'acceptance_criteria':['do_not_copy_long_text','record_line_coordinates','classify_formula_variant_or_transcription','preserve_window_hash','require_second_source_or_scan_review'],'review_tasks':tasks,'boundary':'Human/second-source transcription queue only.'}
|
||||
|
||||
def main():
|
||||
ap=argparse.ArgumentParser(); ap.add_argument('--date',default='2026-07-20'); args=ap.parse_args(); data=build(args.date); OUT.write_text(json.dumps(data,ensure_ascii=False,indent=2,sort_keys=True)+'\n'); print(json.dumps(data,ensure_ascii=False,indent=2,sort_keys=True))
|
||||
if __name__=='__main__': main()
|
||||
@@ -0,0 +1,41 @@
|
||||
#!/usr/bin/env python3
|
||||
"""Run installed PyJHora Sphuta OSS case as isolated observation."""
|
||||
from __future__ import annotations
|
||||
import argparse, contextlib, hashlib, importlib.metadata as md, io, json
|
||||
from pathlib import Path
|
||||
|
||||
ROOT=Path(__file__).resolve().parents[1]
|
||||
OUT=ROOT/'references/oracle/prashna_sphuta_oss_case_probe_2026_07_20.json'
|
||||
|
||||
def h(o): return hashlib.sha256(json.dumps(o,ensure_ascii=False,sort_keys=True,default=str).encode()).hexdigest()
|
||||
|
||||
def build(date):
|
||||
rows=[]; meta={}
|
||||
try:
|
||||
captured_stdout = io.StringIO()
|
||||
captured_stderr = io.StringIO()
|
||||
with contextlib.redirect_stdout(captured_stdout), contextlib.redirect_stderr(captured_stderr):
|
||||
import jhora
|
||||
from jhora.panchanga import drik
|
||||
from jhora.horoscope.chart import sphuta
|
||||
try: dist=md.metadata('jhora')
|
||||
except md.PackageNotFoundError: dist=md.metadata('PyJHora')
|
||||
meta={'package':dist.get('Name'),'version':dist.get('Version'),'license':dist.get('License') or 'AGPL detected from package metadata text','module_file':jhora.__file__,'captured_import_stdout_hash':h(captured_stdout.getvalue()),'captured_import_stderr_hash':h(captured_stderr.getvalue())}
|
||||
dob=drik.Date(1996,12,7); tob=(10,34,0); place=drik.Place('Chennai',13.0878,80.2785,5.5)
|
||||
for field,fn,expected in [('tri_sphuta',sphuta.tri_sphuta,'Pisces 20° 47’ 20"'),('chatur_sphuta',sphuta.chatur_sphuta,'Scorpio 12° 21’ 15"'),('pancha_sphuta',sphuta.pancha_sphuta,'Aries 22° 54’ 29"')]:
|
||||
try:
|
||||
with contextlib.redirect_stdout(io.StringIO()), contextlib.redirect_stderr(io.StringIO()):
|
||||
got=fn(dob,tob,place,divisional_chart_factor=1)
|
||||
rows.append({'field':field,'status':'observed','raw_result':got,'expected_from_oss_case':expected})
|
||||
except Exception as e:
|
||||
rows.append({'field':field,'status':'runtime_error','error':type(e).__name__,'expected_from_oss_case':expected})
|
||||
except Exception as e:
|
||||
meta={'package':'jhora','import_error':type(e).__name__}
|
||||
for field in ['tri_sphuta','chatur_sphuta','pancha_sphuta']: rows.append({'field':field,'status':'runtime_error','error':'jhora_import_failed'})
|
||||
data={'scope':'prashna_sphuta_oss_case_probe','created_at':date,'status':'oss_probe_ready','claim_status':'tooling_observation_only','production_tuning_allowed':False,'truth_matrix_allowed':False,'oracle_ready':False,'license_boundary':'agpl_observation_only_do_not_vendor','case':{'source':'jhora.tests.pvr_tests.sphuta_tests','dob':'1996-12-07','tob':'10:34:00','place':'Chennai 13.0878,80.2785 +05:30'},'package_metadata':meta,'rows':rows,'boundary':'Runs installed OSS package only; no AGPL implementation is copied and no oracle truth is upgraded.'}
|
||||
data['raw_hash']=h({'meta':meta,'rows':rows})
|
||||
return data
|
||||
|
||||
def main():
|
||||
ap=argparse.ArgumentParser(); ap.add_argument('--date',default='2026-07-20'); args=ap.parse_args(); data=build(args.date); OUT.write_text(json.dumps(data,ensure_ascii=False,indent=2,sort_keys=True)+'\n'); print(json.dumps(data,ensure_ascii=False,indent=2,sort_keys=True))
|
||||
if __name__=='__main__': main()
|
||||
@@ -0,0 +1,21 @@
|
||||
#!/usr/bin/env python3
|
||||
"""Create blank human review result templates for Prashna Sphuta line tasks."""
|
||||
from __future__ import annotations
|
||||
import argparse, json
|
||||
from pathlib import Path
|
||||
|
||||
ROOT = Path(__file__).resolve().parents[1]
|
||||
QUEUE = ROOT / "references/oracle/prashna_sphuta_line_review_queue_2026_07_20.json"
|
||||
OUT = ROOT / "references/oracle/prashna_sphuta_review_result_template_2026_07_20.json"
|
||||
ALLOWED = ["formula_variant", "source_transcription", "naming_variant", "insufficient_evidence"]
|
||||
REQ = ["reviewer_id", "reviewed_at", "source_line_coordinates", "second_source_or_scan_evidence", "review_notes"]
|
||||
|
||||
def build(date):
|
||||
q=json.load(open(QUEUE)); templates=[]
|
||||
for t in q['review_tasks']:
|
||||
templates.append({**t,'review_result':None,'allowed_results':ALLOWED,'required_human_fields':REQ,'completed':False,'upgrade_after_completion':'requires_replay_packet_and_gate_review'})
|
||||
return {'scope':'prashna_sphuta_review_result_template','created_at':date,'status':'blank_review_template_ready','claim_status':'blocked_until_human_labels','production_tuning_allowed':False,'truth_matrix_allowed':False,'summary':{'template_count':len(templates),'completed_review_count':0,'truth_upgrade_count':0},'upgrade_policy':'no_upgrade_until_completed_review_and_replay','templates':templates,'boundary':'Blank template only; human review fields must be filled before any classification or formula change.'}
|
||||
|
||||
def main():
|
||||
ap=argparse.ArgumentParser(); ap.add_argument('--date',default='2026-07-20'); args=ap.parse_args(); data=build(args.date); OUT.write_text(json.dumps(data,ensure_ascii=False,indent=2,sort_keys=True)+'\n'); print(json.dumps(data,ensure_ascii=False,indent=2,sort_keys=True))
|
||||
if __name__=='__main__': main()
|
||||
@@ -0,0 +1,24 @@
|
||||
#!/usr/bin/env python3
|
||||
"""Validate Prashna Sphuta human review result templates."""
|
||||
from __future__ import annotations
|
||||
import argparse, json
|
||||
from pathlib import Path
|
||||
|
||||
ROOT = Path(__file__).resolve().parents[1]
|
||||
TEMPLATE = ROOT / "references/oracle/prashna_sphuta_review_result_template_2026_07_20.json"
|
||||
OUT = ROOT / "references/oracle/prashna_sphuta_review_result_validation_2026_07_20.json"
|
||||
|
||||
def build(date):
|
||||
src=json.load(open(TEMPLATE)); rows=[]
|
||||
for t in src['templates']:
|
||||
missing=[]
|
||||
if t.get('review_result') is None: missing.append('review_result')
|
||||
for f in t['required_human_fields']:
|
||||
if not t.get(f): missing.append(f)
|
||||
valid=not missing and t.get('review_result') in t['allowed_results']
|
||||
rows.append({'task_id':t['task_id'],'validation_status':'valid_completed_review' if valid else 'blocked_missing_human_review','missing_fields':missing,'review_result':t.get('review_result'),'replay_gate_ready':False,'claim_boundary':'Validation only; replay gate also requires complete Prashna input.'})
|
||||
return {'scope':'prashna_sphuta_review_result_validation','created_at':date,'status':'validation_ready','claim_status':'blocked_until_human_labels','production_tuning_allowed':False,'truth_matrix_allowed':False,'allowed_results':src['templates'][0]['allowed_results'],'replay_gate_policy':'requires_valid_completed_review_and_complete_prashna_input','summary':{'template_count':len(rows),'valid_completed_review_count':sum(r['validation_status']=='valid_completed_review' for r in rows),'replay_gate_ready_count':0},'validation_rows':rows,'boundary':'Blank templates remain blocked; completed review alone still cannot upgrade truth without replay.'}
|
||||
|
||||
def main():
|
||||
ap=argparse.ArgumentParser(); ap.add_argument('--date',default='2026-07-20'); args=ap.parse_args(); data=build(args.date); OUT.write_text(json.dumps(data,ensure_ascii=False,indent=2,sort_keys=True)+'\n'); print(json.dumps(data,ensure_ascii=False,indent=2,sort_keys=True))
|
||||
if __name__=='__main__': main()
|
||||
@@ -0,0 +1,29 @@
|
||||
#!/usr/bin/env python3
|
||||
"""Build field-level comparison matrix for Prashna Sphuta sources."""
|
||||
from __future__ import annotations
|
||||
import argparse, json
|
||||
from pathlib import Path
|
||||
|
||||
ROOT = Path(__file__).resolve().parents[1]
|
||||
REPLAY = ROOT / "references/oracle/prashna_sphuta_candidate_replay_readiness_2026_07_20.json"
|
||||
LOCATOR = ROOT / "references/oracle/prashna_marga_excerpt_locator_2026_07_20.json"
|
||||
OUT = ROOT / "references/oracle/prashna_sphuta_source_comparison_matrix_2026_07_20.json"
|
||||
|
||||
FIELDS=['sun','moon','lagna','gulika','rahu','trisphuta','chatusphuta','panchasphuta']
|
||||
|
||||
def status(row, field):
|
||||
if field in ['sun','moon','lagna','gulika','rahu']: return 'input_value_only'
|
||||
got=row['computed_from_expected_degrees'][field]; exp=row['expected_degrees'][field]
|
||||
return 'match' if abs(((got-exp+180)%360)-180) <= .02 else 'mismatch'
|
||||
|
||||
def build(date):
|
||||
replay=json.load(open(REPLAY)); locator=json.load(open(LOCATOR)); base=replay['rows'][0]
|
||||
has_ia=locator['summary']['located_window_count']>0
|
||||
rows=[]
|
||||
for f in FIELDS:
|
||||
rows.append({'field':f,'vedastro_expected_degree':base['expected_degrees'][f],'local_formula_degree':base['computed_from_expected_degrees'].get(f),'local_vs_vedastro_status':status(base,f),'ia_excerpt_status':'located_context' if has_ia and f in ['gulika','trisphuta','chatusphuta','panchasphuta'] else 'not_field_specific','claim_boundary':'Field comparison only; no Prashna truth upgrade without complete input/raw/replay.'})
|
||||
return {'scope':'prashna_sphuta_source_comparison_matrix','created_at':date,'status':'comparison_matrix_ready','claim_status':'open_queue','production_tuning_allowed':False,'truth_matrix_allowed':False,'summary':{'field_count':len(rows),'match_count':sum(r['local_vs_vedastro_status']=='match' for r in rows),'mismatch_count':sum(r['local_vs_vedastro_status']=='mismatch' for r in rows),'truth_upgrade_count':0},'ia_excerpt_window_count':locator['summary']['located_window_count'],'field_rows':rows,'next_evidence':['line-level transcription review','complete Prashna input','legal external replay'],'boundary':'Matrix connects VedAstro expected values, local arithmetic replay, and IA locator hashes; still open queue.'}
|
||||
|
||||
def main():
|
||||
ap=argparse.ArgumentParser(); ap.add_argument('--date',default='2026-07-20'); args=ap.parse_args(); data=build(args.date); OUT.write_text(json.dumps(data,ensure_ascii=False,indent=2,sort_keys=True)+'\n'); print(json.dumps(data,ensure_ascii=False,indent=2,sort_keys=True))
|
||||
if __name__=='__main__': main()
|
||||
@@ -8,6 +8,7 @@ from pathlib import Path
|
||||
|
||||
ROOT = Path(__file__).resolve().parents[1]
|
||||
HASH_SCRIPT = ROOT / "scripts/kp_external_table_hash_manifest.py"
|
||||
HASH_ARTIFACT = ROOT / "references/oracle/kp_external_table_hash_manifest_2026_07_20.json"
|
||||
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"
|
||||
|
||||
@@ -49,4 +50,19 @@ 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_external_table_hash_manifest_2026_07_20"]["path"] == "references/oracle/kp_external_table_hash_manifest_2026_07_20.json"
|
||||
assert packets["kp_cusp_worked_example_oracle_queue"]["claim_status"] == "blocked"
|
||||
|
||||
|
||||
def test_kp_external_table_hash_artifact_records_current_fixture_blocker() -> None:
|
||||
data = json.loads(HASH_ARTIFACT.read_text(encoding="utf-8"))
|
||||
assert data["scope"] == "kp_external_table_hash_manifest"
|
||||
assert data["table_id"] == "VedicAstro_KP_SL_Divisions"
|
||||
assert data["status"] in {"fixed_hash", "fixture_missing"}
|
||||
assert data["production_tuning_allowed"] is False
|
||||
assert data["truth_matrix_allowed"] is False
|
||||
if data["status"] == "fixture_missing":
|
||||
assert data["claim_status"] == "blocked_fixture_missing"
|
||||
assert data["next_action"] == "pin legal source table file or keep KP exact cusp oracle blocked"
|
||||
else:
|
||||
assert len(data["sha256"]) == 64
|
||||
|
||||
@@ -0,0 +1,42 @@
|
||||
import json
|
||||
from pathlib import Path
|
||||
|
||||
ROOT = Path(__file__).resolve().parents[1]
|
||||
MATRIX = ROOT / "references/oracle/oss_worked_example_source_matrix_2026_07_20.json"
|
||||
INDEX = ROOT / "references/oracle/evidence_packet_index_2026_07_19.json"
|
||||
|
||||
|
||||
def test_oss_worked_example_source_matrix_tracks_reusable_sources_and_boundaries():
|
||||
data = json.loads(MATRIX.read_text(encoding="utf-8"))
|
||||
assert data["scope"] == "oss_worked_example_source_matrix"
|
||||
assert data["claim_status"] == "source_intake_only"
|
||||
assert data["production_tuning_allowed"] is False
|
||||
assert data["truth_matrix_allowed"] is False
|
||||
|
||||
rows = {row["source_id"]: row for row in data["sources"]}
|
||||
for source_id in [
|
||||
"pyjhora_pvr_tests",
|
||||
"jyotishganit_github",
|
||||
"vedicastro_kp_runtime",
|
||||
"fusionstrings_panchangam",
|
||||
"bidyashish_panchang",
|
||||
"kp_sub_lord_boundary_tables",
|
||||
]:
|
||||
assert source_id in rows
|
||||
assert rows[source_id]["license_status"]
|
||||
assert rows[source_id]["case_usefulness"]
|
||||
assert rows[source_id]["promotion_boundary"]
|
||||
|
||||
assert rows["pyjhora_pvr_tests"]["reuse_policy"] == "black_box_observation_only"
|
||||
assert rows["vedicastro_kp_runtime"]["candidate_domains"] == ["kp_precision_timing"]
|
||||
assert rows["fusionstrings_panchangam"]["license_status"] == "permissive_candidate_verify_repo_license"
|
||||
assert rows["kp_sub_lord_boundary_tables"]["numeric_packet_status"] == "candidate_requires_raw_capture_hash"
|
||||
|
||||
|
||||
def test_oss_worked_example_source_matrix_is_indexed_without_truth_upgrade():
|
||||
index = json.loads(INDEX.read_text(encoding="utf-8"))
|
||||
packet = {
|
||||
row["packet_id"]: row for row in index["packets"]
|
||||
}["oss_worked_example_source_matrix_2026_07_20"]
|
||||
assert packet["claim_status"] == "source_intake_only"
|
||||
assert packet["consumer_policy"] == "research_observation_only"
|
||||
@@ -0,0 +1,32 @@
|
||||
import json
|
||||
import subprocess
|
||||
from pathlib import Path
|
||||
|
||||
ROOT = Path(__file__).resolve().parents[1]
|
||||
ARTIFACT = ROOT / "references/oracle/prashna_marga_excerpt_locator_2026_07_20.json"
|
||||
INDEX = ROOT / "references/oracle/evidence_packet_index_2026_07_19.json"
|
||||
|
||||
|
||||
def test_prashna_marga_excerpt_locator_finds_keyword_windows_without_vendoring_text():
|
||||
data = json.loads(subprocess.check_output(["python3", "scripts/prashna_marga_excerpt_locator.py", "--date", "2026-07-20"], cwd=ROOT, text=True))
|
||||
assert data["scope"] == "prashna_marga_excerpt_locator"
|
||||
assert data["claim_status"] == "source_intake_only"
|
||||
assert data["summary"]["located_window_count"] >= 1
|
||||
assert data["summary"]["oracle_ready_count"] == 0
|
||||
row = data["located_windows"][0]
|
||||
assert row["window_hash"]
|
||||
assert row["line_start"] > 0
|
||||
assert row["line_end"] >= row["line_start"]
|
||||
assert len(row["short_context"]) < 260
|
||||
|
||||
|
||||
def test_prashna_marga_excerpt_locator_keeps_mismatch_queue_open():
|
||||
data = json.loads(ARTIFACT.read_text(encoding="utf-8"))
|
||||
assert data["upgrade_status"] == "candidate_not_oracle"
|
||||
assert "raw excerpt capture" in data["next_steps"][0]
|
||||
assert "complete_prashna_input" in data["missing_for_oracle"]
|
||||
|
||||
|
||||
def test_prashna_marga_excerpt_locator_is_indexed():
|
||||
packets = {row["packet_id"]: row for row in json.loads(INDEX.read_text(encoding="utf-8"))["packets"]}
|
||||
assert packets["prashna_marga_excerpt_locator_2026_07_20"]["claim_status"] == "source_intake_only"
|
||||
@@ -0,0 +1,31 @@
|
||||
import json
|
||||
import subprocess
|
||||
from pathlib import Path
|
||||
|
||||
ROOT = Path(__file__).resolve().parents[1]
|
||||
ARTIFACT = ROOT / "references/oracle/prashna_marga_raw_capture_packet_2026_07_20.json"
|
||||
INDEX = ROOT / "references/oracle/evidence_packet_index_2026_07_19.json"
|
||||
|
||||
|
||||
def test_prashna_marga_raw_capture_packet_pins_internet_archive_files():
|
||||
data = json.loads(subprocess.check_output(["python3", "scripts/prashna_marga_raw_capture_packet.py", "--date", "2026-07-20"], cwd=ROOT, text=True))
|
||||
assert data["scope"] == "prashna_marga_raw_capture_packet"
|
||||
assert data["claim_status"] == "source_intake_only"
|
||||
assert data["summary"]["ia_item_count"] >= 2
|
||||
assert data["summary"]["oracle_ready_count"] == 0
|
||||
ids = {row["identifier"] for row in data["internet_archive_items"]}
|
||||
assert "PrasnaMargaBVR" in ids
|
||||
bvr = next(row for row in data["internet_archive_items"] if row["identifier"] == "PrasnaMargaBVR")
|
||||
assert any(file["format"] == "DjVuTXT" and file["sha1"] for file in bvr["files"])
|
||||
|
||||
|
||||
def test_prashna_marga_raw_capture_packet_preserves_no_truth_upgrade_boundary():
|
||||
data = json.loads(ARTIFACT.read_text(encoding="utf-8"))
|
||||
assert all(row["upgrade_status"] == "candidate_not_oracle" for row in data["internet_archive_items"])
|
||||
assert "Trisphuta" in data["field_locator_terms"]
|
||||
assert "raw excerpt capture" in data["next_steps"][0]
|
||||
|
||||
|
||||
def test_prashna_marga_raw_capture_packet_is_indexed():
|
||||
packets = {row["packet_id"]: row for row in json.loads(INDEX.read_text(encoding="utf-8"))["packets"]}
|
||||
assert packets["prashna_marga_raw_capture_packet_2026_07_20"]["claim_status"] == "source_intake_only"
|
||||
@@ -0,0 +1,32 @@
|
||||
import json
|
||||
import subprocess
|
||||
from pathlib import Path
|
||||
|
||||
ROOT = Path(__file__).resolve().parents[1]
|
||||
ARTIFACT = ROOT / "references/oracle/prashna_sphuta_closure_dashboard_2026_07_20.json"
|
||||
INDEX = ROOT / "references/oracle/evidence_packet_index_2026_07_19.json"
|
||||
|
||||
|
||||
def test_prashna_sphuta_closure_dashboard_summarizes_chain_and_blockers():
|
||||
data = json.loads(subprocess.check_output(["python3", "scripts/prashna_sphuta_closure_dashboard.py", "--date", "2026-07-20"], cwd=ROOT, text=True))
|
||||
assert data["scope"] == "prashna_sphuta_closure_dashboard"
|
||||
assert data["claim_status"] == "blocked_until_human_labels"
|
||||
assert data["summary"]["packet_chain_count"] >= 9
|
||||
assert data["summary"]["truth_upgrade_count"] == 0
|
||||
assert data["summary"]["blocked_gate_count"] >= 2
|
||||
gates = {gate["gate_id"]: gate for gate in data["gates"]}
|
||||
assert gates["human_line_review"]["status"] == "blocked"
|
||||
assert gates["complete_prashna_input"]["status"] == "blocked"
|
||||
|
||||
|
||||
def test_prashna_sphuta_closure_dashboard_preserves_commercial_boundary():
|
||||
data = json.loads(ARTIFACT.read_text(encoding="utf-8"))
|
||||
assert data["commercial_sync_status"] == "research_observation_only"
|
||||
assert data["production_tuning_allowed"] is False
|
||||
assert data["truth_matrix_allowed"] is False
|
||||
assert "do_not_use_for_deterministic_prashna_verdict" in data["forbidden_uses"]
|
||||
|
||||
|
||||
def test_prashna_sphuta_closure_dashboard_is_indexed():
|
||||
packets = {row["packet_id"]: row for row in json.loads(INDEX.read_text(encoding="utf-8"))["packets"]}
|
||||
assert packets["prashna_sphuta_closure_dashboard_2026_07_20"]["claim_status"] == "blocked_until_human_labels"
|
||||
@@ -0,0 +1,33 @@
|
||||
import json
|
||||
import subprocess
|
||||
from pathlib import Path
|
||||
|
||||
ROOT = Path(__file__).resolve().parents[1]
|
||||
ARTIFACT = ROOT / "references/oracle/prashna_sphuta_line_review_queue_2026_07_20.json"
|
||||
INDEX = ROOT / "references/oracle/evidence_packet_index_2026_07_19.json"
|
||||
|
||||
|
||||
def test_prashna_sphuta_line_review_queue_creates_human_review_tasks():
|
||||
data = json.loads(subprocess.check_output(["python3", "scripts/prashna_sphuta_line_review_queue.py", "--date", "2026-07-20"], cwd=ROOT, text=True))
|
||||
assert data["scope"] == "prashna_sphuta_line_review_queue"
|
||||
assert data["claim_status"] == "open_queue"
|
||||
assert data["summary"]["review_task_count"] >= 2
|
||||
assert data["summary"]["truth_upgrade_count"] == 0
|
||||
task = data["review_tasks"][0]
|
||||
assert task["review_status"] == "needs_human_or_second_source_review"
|
||||
assert "chatusphuta" in task["fields_to_check"]
|
||||
assert task["window_hash"]
|
||||
|
||||
|
||||
def test_prashna_sphuta_line_review_queue_has_explicit_acceptance_criteria():
|
||||
data = json.loads(ARTIFACT.read_text(encoding="utf-8"))
|
||||
criteria = data["acceptance_criteria"]
|
||||
assert "do_not_copy_long_text" in criteria
|
||||
assert "record_line_coordinates" in criteria
|
||||
assert "classify_formula_variant_or_transcription" in criteria
|
||||
assert all(len(task["short_context"]) < 260 for task in data["review_tasks"])
|
||||
|
||||
|
||||
def test_prashna_sphuta_line_review_queue_is_indexed():
|
||||
packets = {row["packet_id"]: row for row in json.loads(INDEX.read_text(encoding="utf-8"))["packets"]}
|
||||
assert packets["prashna_sphuta_line_review_queue_2026_07_20"]["claim_status"] == "open_queue"
|
||||
@@ -0,0 +1,30 @@
|
||||
import json
|
||||
import subprocess
|
||||
from pathlib import Path
|
||||
|
||||
ROOT = Path(__file__).resolve().parents[1]
|
||||
ARTIFACT = ROOT / "references/oracle/prashna_sphuta_oss_case_probe_2026_07_20.json"
|
||||
INDEX = ROOT / "references/oracle/evidence_packet_index_2026_07_19.json"
|
||||
|
||||
|
||||
def test_prashna_sphuta_oss_case_probe_runs_pyjhora_case_in_isolation():
|
||||
data = json.loads(subprocess.check_output(["python3", "scripts/prashna_sphuta_oss_case_probe.py", "--date", "2026-07-20"], cwd=ROOT, text=True))
|
||||
assert data["scope"] == "prashna_sphuta_oss_case_probe"
|
||||
assert data["claim_status"] == "tooling_observation_only"
|
||||
assert data["license_boundary"] == "agpl_observation_only_do_not_vendor"
|
||||
assert data["case"]["source"] == "jhora.tests.pvr_tests.sphuta_tests"
|
||||
assert {r["field"] for r in data["rows"]} >= {"tri_sphuta", "chatur_sphuta", "pancha_sphuta"}
|
||||
assert data["raw_hash"]
|
||||
|
||||
|
||||
def test_prashna_sphuta_oss_case_probe_does_not_upgrade_oracle_truth():
|
||||
data = json.loads(ARTIFACT.read_text(encoding="utf-8"))
|
||||
assert data["oracle_ready"] is False
|
||||
assert data["production_tuning_allowed"] is False
|
||||
assert data["truth_matrix_allowed"] is False
|
||||
assert all(row["status"] in {"observed", "runtime_error"} for row in data["rows"])
|
||||
|
||||
|
||||
def test_prashna_sphuta_oss_case_probe_is_indexed():
|
||||
packets = {row["packet_id"]: row for row in json.loads(INDEX.read_text(encoding="utf-8"))["packets"]}
|
||||
assert packets["prashna_sphuta_oss_case_probe_2026_07_20"]["claim_status"] == "tooling_observation_only"
|
||||
@@ -0,0 +1,31 @@
|
||||
import json
|
||||
import subprocess
|
||||
from pathlib import Path
|
||||
|
||||
ROOT = Path(__file__).resolve().parents[1]
|
||||
ARTIFACT = ROOT / "references/oracle/prashna_sphuta_review_result_template_2026_07_20.json"
|
||||
INDEX = ROOT / "references/oracle/evidence_packet_index_2026_07_19.json"
|
||||
|
||||
|
||||
def test_prashna_sphuta_review_result_template_is_blank_and_schema_complete():
|
||||
data = json.loads(subprocess.check_output(["python3", "scripts/prashna_sphuta_review_result_template.py", "--date", "2026-07-20"], cwd=ROOT, text=True))
|
||||
assert data["scope"] == "prashna_sphuta_review_result_template"
|
||||
assert data["claim_status"] == "blocked_until_human_labels"
|
||||
assert data["summary"]["template_count"] >= 2
|
||||
assert data["summary"]["completed_review_count"] == 0
|
||||
row = data["templates"][0]
|
||||
assert row["review_result"] is None
|
||||
assert row["allowed_results"] == ["formula_variant", "source_transcription", "naming_variant", "insufficient_evidence"]
|
||||
assert "reviewer_id" in row["required_human_fields"]
|
||||
|
||||
|
||||
def test_prashna_sphuta_review_result_template_has_no_truth_upgrade():
|
||||
data = json.loads(ARTIFACT.read_text(encoding="utf-8"))
|
||||
assert data["production_tuning_allowed"] is False
|
||||
assert data["truth_matrix_allowed"] is False
|
||||
assert data["upgrade_policy"] == "no_upgrade_until_completed_review_and_replay"
|
||||
|
||||
|
||||
def test_prashna_sphuta_review_result_template_is_indexed():
|
||||
packets = {row["packet_id"]: row for row in json.loads(INDEX.read_text(encoding="utf-8"))["packets"]}
|
||||
assert packets["prashna_sphuta_review_result_template_2026_07_20"]["claim_status"] == "blocked_until_human_labels"
|
||||
@@ -0,0 +1,31 @@
|
||||
import json
|
||||
import subprocess
|
||||
from pathlib import Path
|
||||
|
||||
ROOT = Path(__file__).resolve().parents[1]
|
||||
ARTIFACT = ROOT / "references/oracle/prashna_sphuta_review_result_validation_2026_07_20.json"
|
||||
INDEX = ROOT / "references/oracle/evidence_packet_index_2026_07_19.json"
|
||||
|
||||
|
||||
def test_prashna_sphuta_review_result_validator_blocks_blank_templates():
|
||||
data = json.loads(subprocess.check_output(["python3", "scripts/prashna_sphuta_review_result_validator.py", "--date", "2026-07-20"], cwd=ROOT, text=True))
|
||||
assert data["scope"] == "prashna_sphuta_review_result_validation"
|
||||
assert data["claim_status"] == "blocked_until_human_labels"
|
||||
assert data["summary"]["template_count"] >= 2
|
||||
assert data["summary"]["valid_completed_review_count"] == 0
|
||||
assert data["summary"]["replay_gate_ready_count"] == 0
|
||||
row = data["validation_rows"][0]
|
||||
assert row["validation_status"] == "blocked_missing_human_review"
|
||||
assert "review_result" in row["missing_fields"]
|
||||
|
||||
|
||||
def test_prashna_sphuta_review_result_validator_preserves_allowed_result_contract():
|
||||
data = json.loads(ARTIFACT.read_text(encoding="utf-8"))
|
||||
assert data["allowed_results"] == ["formula_variant", "source_transcription", "naming_variant", "insufficient_evidence"]
|
||||
assert data["replay_gate_policy"] == "requires_valid_completed_review_and_complete_prashna_input"
|
||||
assert data["truth_matrix_allowed"] is False
|
||||
|
||||
|
||||
def test_prashna_sphuta_review_result_validator_is_indexed():
|
||||
packets = {row["packet_id"]: row for row in json.loads(INDEX.read_text(encoding="utf-8"))["packets"]}
|
||||
assert packets["prashna_sphuta_review_result_validation_2026_07_20"]["claim_status"] == "blocked_until_human_labels"
|
||||
@@ -0,0 +1,31 @@
|
||||
import json
|
||||
import subprocess
|
||||
from pathlib import Path
|
||||
|
||||
ROOT = Path(__file__).resolve().parents[1]
|
||||
ARTIFACT = ROOT / "references/oracle/prashna_sphuta_source_comparison_matrix_2026_07_20.json"
|
||||
INDEX = ROOT / "references/oracle/evidence_packet_index_2026_07_19.json"
|
||||
|
||||
|
||||
def test_prashna_sphuta_source_comparison_matrix_classifies_each_field():
|
||||
data = json.loads(subprocess.check_output(["python3", "scripts/prashna_sphuta_source_comparison_matrix.py", "--date", "2026-07-20"], cwd=ROOT, text=True))
|
||||
assert data["scope"] == "prashna_sphuta_source_comparison_matrix"
|
||||
assert data["claim_status"] == "open_queue"
|
||||
fields = {row["field"]: row for row in data["field_rows"]}
|
||||
assert fields["trisphuta"]["local_vs_vedastro_status"] == "match"
|
||||
assert fields["chatusphuta"]["local_vs_vedastro_status"] == "mismatch"
|
||||
assert fields["panchasphuta"]["local_vs_vedastro_status"] == "mismatch"
|
||||
assert fields["gulika"]["local_vs_vedastro_status"] == "input_value_only"
|
||||
assert data["summary"]["truth_upgrade_count"] == 0
|
||||
|
||||
|
||||
def test_prashna_sphuta_source_comparison_matrix_links_ia_windows():
|
||||
data = json.loads(ARTIFACT.read_text(encoding="utf-8"))
|
||||
assert data["ia_excerpt_window_count"] >= 1
|
||||
assert all(row["ia_excerpt_status"] in {"located_context", "not_field_specific"} for row in data["field_rows"])
|
||||
assert data["next_evidence"] == ["line-level transcription review", "complete Prashna input", "legal external replay"]
|
||||
|
||||
|
||||
def test_prashna_sphuta_source_comparison_matrix_is_indexed():
|
||||
packets = {row["packet_id"]: row for row in json.loads(INDEX.read_text(encoding="utf-8"))["packets"]}
|
||||
assert packets["prashna_sphuta_source_comparison_matrix_2026_07_20"]["claim_status"] == "open_queue"
|
||||
@@ -0,0 +1,36 @@
|
||||
import json
|
||||
from pathlib import Path
|
||||
|
||||
ROOT = Path(__file__).resolve().parents[1]
|
||||
REGISTRY = ROOT / "references/oracle/research_web_skill_commercial_gap_registry_2026_07_20.json"
|
||||
|
||||
|
||||
def test_research_web_skill_commercial_gap_registry_separates_research_and_commercial_runtime():
|
||||
data = json.loads(REGISTRY.read_text(encoding="utf-8"))
|
||||
assert data["scope"] == "research_web_skill_commercial_gap_registry"
|
||||
assert data["claim_status"] == "open_queue"
|
||||
assert data["production_tuning_allowed"] is False
|
||||
assert data["truth_matrix_allowed"] is False
|
||||
|
||||
commercial = data["current_state"]["commercial_repo_patterns_to_learn"]
|
||||
assert commercial["source_status"] == "read_only_dirty_worktree_do_not_copy_directly"
|
||||
blocked = set(commercial["must_not_import"])
|
||||
assert "Supabase runtime" in blocked
|
||||
assert "credits/payment/subscription logic" in blocked
|
||||
assert "commercial user data" in blocked
|
||||
|
||||
|
||||
def test_research_web_skill_gap_registry_orders_numeric_packets_before_ui_truth_upgrade():
|
||||
data = json.loads(REGISTRY.read_text(encoding="utf-8"))
|
||||
order = data["recommended_order"]
|
||||
assert order[:3] == [
|
||||
"worked_examples_to_numeric_packets",
|
||||
"component_closure",
|
||||
"claim_gate_upgrade",
|
||||
]
|
||||
|
||||
tracks = {row["track"]: row for row in data["delivery_queue"]}
|
||||
assert tracks["research_web_profile_flow"]["status"] == "planned"
|
||||
assert "localStorage only" in tracks["research_web_profile_flow"]["next_delivery"]
|
||||
assert "exploratory" in tracks["research_web_rectification_journey"]["gate_for_upgrade"]
|
||||
assert "skill_truth_overlay" in tracks["skill_to_web_sync"]["next_delivery"]
|
||||
@@ -0,0 +1,43 @@
|
||||
import json
|
||||
from pathlib import Path
|
||||
|
||||
ROOT = Path(__file__).resolve().parents[1]
|
||||
PACKET = ROOT / "references/oracle/shadbala_naisargika_closure_packet_2026_07_20.json"
|
||||
INDEX = ROOT / "references/oracle/evidence_packet_index_2026_07_19.json"
|
||||
|
||||
|
||||
def test_naisargika_packet_closes_same_unit_observation_without_truth_upgrade():
|
||||
data = json.loads(PACKET.read_text(encoding="utf-8"))
|
||||
assert data["scope"] == "shadbala_naisargika_closure_packet"
|
||||
assert data["component"] == "naisargika"
|
||||
assert data["claim_status"] == "partial"
|
||||
assert data["closure_classification"] == "within_tolerance_observation"
|
||||
assert data["absolute_parity_ready"] is False
|
||||
assert data["production_tuning_allowed"] is False
|
||||
assert data["truth_matrix_allowed"] is False
|
||||
assert data["summary"] == {
|
||||
"component_row_count": 7,
|
||||
"max_delta_virupa": 0.0,
|
||||
"source_count_per_row": 5,
|
||||
"within_tolerance_count": 7,
|
||||
}
|
||||
|
||||
|
||||
def test_naisargika_packet_has_all_visible_planets_and_unit_contract():
|
||||
data = json.loads(PACKET.read_text(encoding="utf-8"))
|
||||
rows = {row["planet"]: row for row in data["rows"]}
|
||||
assert set(rows) == {"Sun", "Moon", "Mars", "Mercury", "Jupiter", "Venus", "Saturn"}
|
||||
for row in rows.values():
|
||||
values = row["normalized_values_virupa"]
|
||||
assert set(values) == {"local", "jyotishganit", "xalen", "vp_jain_local", "vp_jain_published"}
|
||||
assert max(values.values()) - min(values.values()) == 0
|
||||
assert row["unit_contract"] == "Virupa fixed natural-strength table; 60 Virupa = 1 Rupa."
|
||||
assert row["closure_status"] == "same_unit_observation_frozen"
|
||||
|
||||
|
||||
def test_naisargika_packet_is_indexed_as_partial_component_closure():
|
||||
index = json.loads(INDEX.read_text(encoding="utf-8"))
|
||||
packets = {row["packet_id"]: row for row in index["packets"]}
|
||||
packet = packets["shadbala_naisargika_closure_packet_2026_07_20"]
|
||||
assert packet["claim_status"] == "partial"
|
||||
assert packet["domain"] == "shadbala_component_closure"
|
||||
Reference in New Issue
Block a user