From 14f1f7e8b03f2e38926903eefcafec63611a4e24 Mon Sep 17 00:00:00 2001 From: 732642856 <732642856@qq.com> Date: Tue, 21 Jul 2026 02:22:00 +0800 Subject: [PATCH] sync: import fragment migration registries --- ...gment_rule_family_registry_2026_07_21.json | 53 ++++++++++++++ .../evidence_packet_index_2026_07_19.json | 26 ++++++- ...cond_pass_candidate_ledger_2026_07_21.json | 72 +++++++++++++++++++ ...h_time_journey_ui_contract_2026_07_21.json | 44 ++++++++++++ tests/test_fragment_migration_registries.py | 46 ++++++++++++ ...t_fragment_second_pass_candidate_ledger.py | 46 ++++++++++++ 6 files changed, 286 insertions(+), 1 deletion(-) create mode 100644 references/oracle/event_judgment_fragment_rule_family_registry_2026_07_21.json create mode 100644 references/oracle/fragment_second_pass_candidate_ledger_2026_07_21.json create mode 100644 references/oracle/research_birth_time_journey_ui_contract_2026_07_21.json create mode 100644 tests/test_fragment_migration_registries.py create mode 100644 tests/test_fragment_second_pass_candidate_ledger.py diff --git a/references/oracle/event_judgment_fragment_rule_family_registry_2026_07_21.json b/references/oracle/event_judgment_fragment_rule_family_registry_2026_07_21.json new file mode 100644 index 00000000..5a3bfbd8 --- /dev/null +++ b/references/oracle/event_judgment_fragment_rule_family_registry_2026_07_21.json @@ -0,0 +1,53 @@ +{ + "scope": "event_judgment_fragment_rule_family_registry", + "created_at": "2026-07-21", + "claim_status": "ready_contract", + "source_fragment": "/Users/wuyongnaren/.workbuddy/backups/jyotish-vedic-astrology-20260711-154109/scripts/event_judgment_engine.py", + "source_policy": "rule_family_inventory_only_no_runtime_copy", + "production_tuning_allowed": false, + "truth_matrix_allowed": false, + "boundary": "Migrates WorkBuddy event_judgment_engine as a rule-family registry only. No old engine implementation is copied; current event_judgment_skeleton remains the runtime authority.", + "route_families": [ + { + "route": "relationship", + "required_families": [ + {"key": "d9_navamsa", "phase": "promise", "module": "varga_full", "claim": "Marriage/relationship questions must include D9."}, + {"key": "upapada_lagna", "phase": "promise", "module": "special_lagnas", "claim": "UL must be present or explicitly blocked."}, + {"key": "darakaraka", "phase": "manifestation", "module": "jaimini", "claim": "DK layer supports manifestation reading."}, + {"key": "marriage_convergence", "phase": "activation", "module": "dasa_convergence", "claim": "Activation must not rely on static promise alone."}, + {"key": "vimshottari_current", "phase": "timing", "module": "dasha", "claim": "Timing requires Vimshottari."}, + {"key": "narayana_current", "phase": "timing", "module": "narayana_dasha", "claim": "Timing requires Narayana cross-check; conflict downgrades certainty."} + ] + }, + { + "route": "career", + "required_families": [ + {"key": "d10_dasamsa", "phase": "promise", "module": "varga_full", "claim": "Career questions must include D10."}, + {"key": "a10_karma_pada", "phase": "promise", "module": "special_lagnas", "claim": "A10/Karma Pada must be present or explicitly blocked."}, + {"key": "amatyakaraka", "phase": "manifestation", "module": "jaimini", "claim": "AmK supports vocation manifestation layer."}, + {"key": "shadbala", "phase": "manifestation", "module": "shadbala", "claim": "Strength layer must be included with current partial/oracle boundary."}, + {"key": "career_convergence", "phase": "activation", "module": "dasa_convergence", "claim": "Activation must include career dasha convergence."}, + {"key": "vimshottari_current", "phase": "timing", "module": "dasha", "claim": "Timing requires Vimshottari."}, + {"key": "narayana_current", "phase": "timing", "module": "narayana_dasha", "claim": "Timing requires Narayana cross-check."} + ] + }, + { + "route": "wealth", + "required_families": [ + {"key": "d2_hora", "phase": "promise", "module": "varga_full", "claim": "Wealth questions must include D2."}, + {"key": "d10_dasamsa", "phase": "promise", "module": "varga_full", "claim": "Career/status channel must be checked for wealth manifestation."}, + {"key": "ashtakavarga_house_scores", "phase": "manifestation", "module": "ashtakavarga", "claim": "House-score support must be included with current AV boundary."}, + {"key": "wealth_convergence", "phase": "activation", "module": "dasa_convergence", "claim": "Activation must include wealth/family convergence."}, + {"key": "gains_convergence", "phase": "activation", "module": "dasa_convergence", "claim": "Gains/wishes convergence is a separate activation layer."}, + {"key": "vimshottari_current", "phase": "timing", "module": "dasha", "claim": "Timing requires Vimshottari."}, + {"key": "narayana_current", "phase": "timing", "module": "narayana_dasha", "claim": "Timing requires Narayana cross-check."} + ] + } + ], + "global_requirements": [ + "Every route must map evidence into promise, activation, manifestation and timing phases.", + "Missing promise/activation/manifestation/timing evidence blocks or downgrades the verdict.", + "Timing/event claims must use Vimshottari + Narayana, not Vimshottari alone.", + "Functional Benefic/Malefic remains mandatory from AGENTS.md even though the WorkBuddy fragment did not contain it." + ] +} diff --git a/references/oracle/evidence_packet_index_2026_07_19.json b/references/oracle/evidence_packet_index_2026_07_19.json index a3121b34..5b990aab 100644 --- a/references/oracle/evidence_packet_index_2026_07_19.json +++ b/references/oracle/evidence_packet_index_2026_07_19.json @@ -5,7 +5,7 @@ "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": 100, + "packet_count": 103, "blocked_or_partial_count": 51, "human_review_required_count": 3 }, @@ -809,6 +809,30 @@ "claim_status": "partial", "consumer_policy": "research_observation_only", "claim_boundary": "Classifies Digbala rows as formula/unit mismatch and routes them to angular-reference formula arbitration; no absolute parity upgrade." + }, + { + "packet_id": "fragment_second_pass_candidate_ledger_2026_07_21", + "path": "references/oracle/fragment_second_pass_candidate_ledger_2026_07_21.json", + "domain": "fragment_governance", + "claim_status": "open_queue", + "consumer_policy": "research_only_no_direct_fragment_copy", + "claim_boundary": "Second-pass ledger for five high-value fragments; each candidate is migrate-to-test/registry, reference-only, or forbidden/private/obsolete. No wholesale copy or truth upgrade." + }, + { + "packet_id": "event_judgment_fragment_rule_family_registry_2026_07_21", + "path": "references/oracle/event_judgment_fragment_rule_family_registry_2026_07_21.json", + "domain": "event_judgment", + "claim_status": "ready_contract", + "consumer_policy": "research_registry_only_no_runtime_copy", + "claim_boundary": "Ports WorkBuddy event judgment as rule-family inventory only; no old engine code copied." + }, + { + "packet_id": "research_birth_time_journey_ui_contract_2026_07_21", + "path": "references/oracle/research_birth_time_journey_ui_contract_2026_07_21.json", + "domain": "research_web_birth_time_journey", + "claim_status": "ready_contract", + "consumer_policy": "research_local_ui_contract_only", + "claim_boundary": "Ports commercial birth-time journey behavior contracts only; no Supabase, credits, auth, or commercial code imported." } ] } diff --git a/references/oracle/fragment_second_pass_candidate_ledger_2026_07_21.json b/references/oracle/fragment_second_pass_candidate_ledger_2026_07_21.json new file mode 100644 index 00000000..2482819c --- /dev/null +++ b/references/oracle/fragment_second_pass_candidate_ledger_2026_07_21.json @@ -0,0 +1,72 @@ +{ + "scope": "fragment_second_pass_candidate_ledger", + "created_at": "2026-07-21", + "claim_status": "open_queue", + "production_tuning_allowed": false, + "truth_matrix_allowed": false, + "allowed_decisions": [ + "migrate_to_research_test_or_registry", + "reference_only", + "forbidden_private_or_obsolete" + ], + "boundary": "Second-pass precision audit of five high-value fragment candidates only. No file is copied wholesale; reusable value must become a research test/registry, reference-only citation, or forbidden/private/obsolete marker.", + "candidates": [ + { + "candidate_id": "workbuddy_event_judgment_engine", + "source_path": "/Users/wuyongnaren/.workbuddy/backups/jyotish-vedic-astrology-20260711-154109/scripts/event_judgment_engine.py", + "sha256_prefix": "f982bfd539fb1213", + "decision": "migrate_to_research_test_or_registry", + "value": "Contains event-route evidence ledger pattern: promise/activation/manifestation/timing, Vimshottari+Narayana timing, D9/UL for marriage, D10/A10 for career, D2/D10/AV for wealth.", + "migration_plan": "Do not copy old engine. Convert its route/evidence-field inventory into research registry/tests that assert current event_judgment_skeleton and strict workflow retain the same mandatory evidence families.", + "risk": "Old WorkBuddy fork is far behind current main; risk terms include generic key/pending strings. Treat as design/reference inventory, not runtime source.", + "next_artifact": "event_judgment_fragment_rule_family_registry" + }, + { + "candidate_id": "workbuddy_shadbala_handan_operator_card", + "source_path": "/Users/wuyongnaren/WorkBuddy/2026-07-05-19-03-49/yinduzhanxing/docs/benchmark/shadbala_handan_raman_first_packet_operator_card.md", + "decision": "forbidden_private_or_obsolete", + "value": "Shows an oracle-packet operator workflow pattern, but the named Handan/Raman personal packet is not a reusable public numeric oracle.", + "migration_plan": "Do not migrate content. If useful, recreate a blank operator-card template from current public-oracle packet schema without personal identifiers.", + "risk": "Contains named personal-case context and source/consent uncertainty; cannot be used as research truth or commercial input.", + "next_artifact": "none" + }, + { + "candidate_id": "workbuddy_first_shadbala_packet_assistant", + "source_path": "/Users/wuyongnaren/WorkBuddy/2026-07-05-19-03-49/yinduzhanxing/docs/benchmark/first_shadbala_oracle_packet_assistant.json", + "decision": "forbidden_private_or_obsolete", + "value": "Potential packet-assistant structure is superseded by current evidence_packet_index and Shadbala component closure packets.", + "migration_plan": "Do not migrate raw JSON. Preserve only the requirement that Shadbala packets need source, input, unit, hash and replay fields, already covered by current packet gates.", + "risk": "Linked to first/Handan packet chain and may include non-public or insufficiently sourced case metadata.", + "next_artifact": "none" + }, + { + "candidate_id": "commercial_birth_time_journey_tests", + "source_path": "/private/tmp/jyotisha-commercial-readonly.adiUr0/frontend/tests/birth-time-journey*.test.ts", + "decision": "migrate_to_research_test_or_registry", + "value": "Mature UX test patterns: resume state, projected baseline action for legacy snapshot, turn persistence, mobile scroll contract, dynamic stop policy, candidate completion and user-facing error contracts.", + "migration_plan": "Recreate research-local UI tests that assert profile mode hides chat composer, journey state resumes locally, candidate claims stay exploratory, and no Supabase/credits runtime is imported.", + "risk": "Commercial repo is dirty and includes business runtime. Copy no code; port only behavior contracts into localStorage/research-mode tests.", + "next_artifact": "research_birth_time_journey_ui_contract_tests" + }, + { + "candidate_id": "vedicastro_kp_source_table_candidate", + "source_path": "/Users/wuyongnaren/Documents/印度占星/references/open_source_sources/VedicAstro/vedicastro/VedicAstro.py", + "decision": "reference_only", + "value": "Useful KP API surface reference: get_rl_nl_sl_data, houses/planets data, SubLord/SubSubLord fields.", + "migration_plan": "Keep as pinned source/API reference only. Continue requiring legal KP_SL_Divisions.csv table hash and public worked example before exact KP cusp oracle upgrade.", + "risk": "Runtime dependency mismatch and table fixture missing; source/API surface does not prove event timing truth.", + "next_artifact": "kp_external_table_hash_manifest_2026_07_20" + } + ], + "summary": { + "candidate_count": 5, + "migrate_to_research_test_or_registry_count": 2, + "reference_only_count": 1, + "forbidden_private_or_obsolete_count": 2 + }, + "next_actions": [ + "Create event_judgment_fragment_rule_family_registry from the WorkBuddy engine inventory without copying implementation.", + "Create research-local birth-time journey UI contract tests based on commercial behavior, not commercial code.", + "Keep Handan/first packet materials forbidden unless replaced by public, consent-safe numeric examples." + ] +} diff --git a/references/oracle/research_birth_time_journey_ui_contract_2026_07_21.json b/references/oracle/research_birth_time_journey_ui_contract_2026_07_21.json new file mode 100644 index 00000000..65487d43 --- /dev/null +++ b/references/oracle/research_birth_time_journey_ui_contract_2026_07_21.json @@ -0,0 +1,44 @@ +{ + "scope": "research_birth_time_journey_ui_contract", + "created_at": "2026-07-21", + "claim_status": "ready_contract", + "source_fragment": "/private/tmp/jyotisha-commercial-readonly.adiUr0/frontend/tests/birth-time-journey*.test.ts", + "source_policy": "behavior_contract_only_no_commercial_code", + "production_tuning_allowed": false, + "truth_matrix_allowed": false, + "boundary": "Ports commercial birth-time journey maturity as research-local UI contracts only. No Supabase, credits, auth, queue, or commercial implementation is imported.", + "contracts": [ + { + "contract_id": "profile_mode_hides_chat_overlay", + "source_pattern": "mobile scroll/profile journey separation", + "research_requirement": "When user opens My Chart/profile form, bottom chat composer must disappear and the form must be centered." + }, + { + "contract_id": "new_chat_restores_chat_surface", + "source_pattern": "journey resume / turn state transitions", + "research_requirement": "New chat or starter prompt must restore chat mode and composer visibility." + }, + { + "contract_id": "candidate_claim_stays_exploratory", + "source_pattern": "candidate completion / response invariants", + "research_requirement": "Birth-time rectification result may show candidate ranges and scores, but must not claim birth-time truth." + }, + { + "contract_id": "local_resume_only", + "source_pattern": "journey turn persistence", + "research_requirement": "Research repo may persist local journey/profile state with localStorage only; no Supabase or credit dependency." + }, + { + "contract_id": "user_error_contract", + "source_pattern": "dynamic question validator / user errors", + "research_requirement": "Invalid dates, missing time/place, or unparseable choices must produce actionable local UI messages, not silent fake UI." + } + ], + "forbidden_imports": [ + "Supabase runtime", + "credits/payment/subscription logic", + "commercial auth/session business rules", + "dirty commercial worktree code", + "commercial user data" + ] +} diff --git a/tests/test_fragment_migration_registries.py b/tests/test_fragment_migration_registries.py new file mode 100644 index 00000000..f0d4ff94 --- /dev/null +++ b/tests/test_fragment_migration_registries.py @@ -0,0 +1,46 @@ +import json +from pathlib import Path + +ROOT = Path(__file__).resolve().parents[1] +EVENT = ROOT / "references/oracle/event_judgment_fragment_rule_family_registry_2026_07_21.json" +JOURNEY = ROOT / "references/oracle/research_birth_time_journey_ui_contract_2026_07_21.json" +INDEX = ROOT / "references/oracle/evidence_packet_index_2026_07_19.json" + + +def test_event_judgment_fragment_registry_ports_rules_not_engine(): + data = json.loads(EVENT.read_text(encoding="utf-8")) + assert data["source_policy"] == "rule_family_inventory_only_no_runtime_copy" + assert data["claim_status"] == "ready_contract" + routes = {row["route"]: row for row in data["route_families"]} + assert {"relationship", "career", "wealth"} <= set(routes) + relationship = {row["key"] for row in routes["relationship"]["required_families"]} + assert {"d9_navamsa", "upapada_lagna", "vimshottari_current", "narayana_current"} <= relationship + career = {row["key"] for row in routes["career"]["required_families"]} + assert {"d10_dasamsa", "a10_karma_pada", "shadbala"} <= career + wealth = {row["key"] for row in routes["wealth"]["required_families"]} + assert {"d2_hora", "ashtakavarga_house_scores", "gains_convergence"} <= wealth + assert any("Functional Benefic/Malefic" in item for item in data["global_requirements"]) + + +def test_birth_time_journey_contract_ports_behavior_not_commercial_runtime(): + data = json.loads(JOURNEY.read_text(encoding="utf-8")) + assert data["source_policy"] == "behavior_contract_only_no_commercial_code" + contracts = {row["contract_id"]: row for row in data["contracts"]} + assert { + "profile_mode_hides_chat_overlay", + "new_chat_restores_chat_surface", + "candidate_claim_stays_exploratory", + "local_resume_only", + "user_error_contract", + } <= set(contracts) + assert "Supabase runtime" in data["forbidden_imports"] + assert "credits/payment/subscription logic" in data["forbidden_imports"] + + +def test_fragment_migration_registries_are_indexed(): + packets = { + row["packet_id"]: row + for row in json.loads(INDEX.read_text(encoding="utf-8"))["packets"] + } + assert packets["event_judgment_fragment_rule_family_registry_2026_07_21"]["claim_status"] == "ready_contract" + assert packets["research_birth_time_journey_ui_contract_2026_07_21"]["claim_status"] == "ready_contract" diff --git a/tests/test_fragment_second_pass_candidate_ledger.py b/tests/test_fragment_second_pass_candidate_ledger.py new file mode 100644 index 00000000..e56f6ef3 --- /dev/null +++ b/tests/test_fragment_second_pass_candidate_ledger.py @@ -0,0 +1,46 @@ +import json +from pathlib import Path + +ROOT = Path(__file__).resolve().parents[1] +LEDGER = ROOT / "references/oracle/fragment_second_pass_candidate_ledger_2026_07_21.json" + + +def test_second_pass_fragment_ledger_has_only_allowed_decisions(): + data = json.loads(LEDGER.read_text(encoding="utf-8")) + assert data["scope"] == "fragment_second_pass_candidate_ledger" + assert data["claim_status"] == "open_queue" + assert data["production_tuning_allowed"] is False + assert data["truth_matrix_allowed"] is False + allowed = set(data["allowed_decisions"]) + assert allowed == { + "migrate_to_research_test_or_registry", + "reference_only", + "forbidden_private_or_obsolete", + } + assert len(data["candidates"]) == 5 + assert all(row["decision"] in allowed for row in data["candidates"]) + + +def test_private_handan_packets_are_forbidden_not_migrated(): + rows = { + row["candidate_id"]: row + for row in json.loads(LEDGER.read_text(encoding="utf-8"))["candidates"] + } + for candidate_id in [ + "workbuddy_shadbala_handan_operator_card", + "workbuddy_first_shadbala_packet_assistant", + ]: + assert rows[candidate_id]["decision"] == "forbidden_private_or_obsolete" + assert "Do not migrate" in rows[candidate_id]["migration_plan"] + + +def test_reusable_fragments_become_tests_or_registries_not_runtime_copy(): + rows = { + row["candidate_id"]: row + for row in json.loads(LEDGER.read_text(encoding="utf-8"))["candidates"] + } + assert rows["workbuddy_event_judgment_engine"]["decision"] == "migrate_to_research_test_or_registry" + assert "Do not copy old engine" in rows["workbuddy_event_judgment_engine"]["migration_plan"] + assert rows["commercial_birth_time_journey_tests"]["decision"] == "migrate_to_research_test_or_registry" + assert "Copy no code" in rows["commercial_birth_time_journey_tests"]["risk"] + assert rows["vedicastro_kp_source_table_candidate"]["decision"] == "reference_only"