# Open Source P0 File Execution Plan > **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking. **Goal:** Finish the three P0 open-source integration fronts with the smallest real diff: `panchanga_api` sidecar integration, VedAstro official-default closure, and PyJHora black-box evidence consumption. **Architecture:** Reuse the existing unified planner, API server, MCP strict workflow, local `muhurta/prashna/remedies` modules, and existing VedAstro/PyJHora audit scripts. Do not add a parallel runtime chain. Extend existing payloads so web, MCP, and skill all read the same contract. **Tech Stack:** Python 3.11 stdlib, existing `scripts/` modules, existing `jyotish-app` frontend, pytest, existing repo docs. ## Global Constraints - Reuse existing repo modules; no new subsystem. - Keep authority order: VedAstro official snapshot first, local supplemental modules second, local fallback last. - `PyJHora` remains black-box evidence only; do not import/copy AGPL code. - `panchanga_api` ideas may shape sidecar outputs, but local computation stays in `scripts/muhurta.py`, `scripts/prashna.py`, `scripts/remedies.py`. - Keep diffs tight: prefer helper functions inside current files over new files. - Every task ends with targeted tests, not hand-waving. ## File Map ### P0-A: `panchanga_api`-style sidecar integration | File | Role | |---|---| | `scripts/unified_consultation_orchestrator.py` | Decide when workflow should run `prashna`, `muhurta/panchanga`, and audited remedies sidecars. | | `scripts/jyotish_api_server.py` | Build/attach `prashna`, `muhurta_panchanga`, and `audited_remedies` packets in one workflow response. | | `scripts/muhurta.py` | Existing local Panchanga/Muhurta engine. Expose one compact helper fit for API/strict workflow payloads. | | `scripts/prashna.py` | Existing time-question engine. Reuse, do not rebuild. | | `scripts/remedies.py` | Existing remedies engine; only fed audited gate outputs. | | `mcp_server.py` | Surface same sidecars in strict workflow output. | | `jyotish-app/index.html` | Existing three-entry UI shell. Only minor control copy/visibility changes if needed. | | `jyotish-app/main.js` | Send timing-sidecar inputs and render sidecar outputs. | | `jyotish-app/renderers.js` | Reuse existing Panchanga rendering slot instead of new UI surface. | | `tests/test_unified_consultation_orchestrator.py` | Planner contract tests. | | `tests/test_api_server_security.py` | Workflow contract tests. | | `tests/test_muhurta.py` | Compact Muhurta helper tests. | | `tests/test_frontend_productization.py` | Frontend contract/render tests. | ### P0-B: VedAstro official-default closure | File | Role | |---|---| | `scripts/vedastro_service_adapter.py` | Single official network boundary. Cache/queue/free-tier behavior lives here first. | | `scripts/vedastro_priority.py` | Shared official-first source-priority contract. | | `scripts/diagnose_vedastro_mode.py` | Runtime diagnosis for `official_extended` vs fallback, free-tier eligibility, queue/cache state. | | `scripts/jyotish_api_server.py` | Attach official summary/runtime truth to chart/full-reading/thematic/workflow responses. | | `scripts/unified_consultation_orchestrator.py` | Planner-visible official-step intent only; no extra engine. | | `mcp_server.py` | Surface same runtime truth and official execution layer summary. | | `jyotish-app/api-bridge.js` | Preserve official/runtime truth fields from API. | | `jyotish-app/main.js` | Render compact source-priority/runtime-truth block. | | `jyotish-app/professional-reading.js` | Show official/partial/fallback boundary in final reading. | | `jyotish-app/ai-chat.js` | Carry official evidence snapshot/runtime truth into follow-up payload. | | `tests/test_vedastro_runtime_mode_diagnostics.py` | Diagnose contract. | | `tests/test_vedastro_official_full_snapshot.py` | Snapshot contract. | | `tests/test_vedastro_service_adapter_executor.py` | Adapter execution/caching behavior. | | `tests/test_api_server_security.py` | Response contract propagation. | | `tests/test_frontend_productization.py` | Frontend visibility contract. | | `tests/test_vedastro_official_mcp_bridge.py` | Official bridge smoke. | ### P0-C: PyJHora black-box evidence consumption | File | Role | |---|---| | `scripts/generate_pyjhora_oracle_artifact_manifest.py` | Canonical artifact manifest generator. | | `scripts/oracle_benchmark_inventory.py` | Make PyJHora artifact counts/queryable fronts visible. | | `scripts/external_oracle_sanity_closure.py` | Summarize PyJHora evidence availability into closure report. | | `scripts/historical_event_backtest.py` | Attach matching external evidence refs into backtest output. | | `scripts/oracle_closure_master_dashboard.py` | Lift PyJHora evidence readiness into one master board. | | `README.md` | State black-box boundary and what counts as closed vs not closed. | | `tests/test_pyjhora_oracle_artifact_manifest.py` | Manifest shape tests. | | `tests/test_oracle_benchmark_inventory.py` | Inventory tests. | | `tests/test_external_oracle_sanity_closure.py` | Closure summary tests. | | `tests/test_historical_event_backtest.py` | Backtest evidence-link tests. | | `tests/test_oracle_closure_master_dashboard.py` | Master dashboard tests. | ## Task 1: Add `muhurta_panchanga` sidecar to unified workflow **Files:** - Modify: `scripts/muhurta.py` - Modify: `scripts/unified_consultation_orchestrator.py` - Modify: `scripts/jyotish_api_server.py` - Test: `tests/test_muhurta.py` - Test: `tests/test_unified_consultation_orchestrator.py` - Test: `tests/test_api_server_security.py` **Interfaces:** - Consumes: existing birth/location/time payload, optional `reference_date`, optional user question/topic. - Produces: `muhurta_panchanga: {status, source, panchanga, muhurta_windows, remedy_timing, blocked_reason?}` in workflow/module payload. - [ ] **Step 1: Write failing helper test in `tests/test_muhurta.py`** - Target a new compact helper in `scripts/muhurta.py`, e.g. `build_muhurta_sidecar(...)`. - [ ] **Step 2: Run targeted test to verify failure** - Run: `python3 -m pytest tests/test_muhurta.py -q` - [ ] **Step 3: Write failing planner/API tests** - `tests/test_unified_consultation_orchestrator.py`: planner adds `run_muhurta_panchanga` for timing/remedy/prashna routes. - `tests/test_api_server_security.py`: workflow response includes `muhurta_panchanga`. - [ ] **Step 4: Run targeted planner/API tests** - [ ] **Step 5: Implement minimal helper in `scripts/muhurta.py`** - Reuse current Panchanga/Muhurta math. - Return compact summary only; no giant raw blob. - [ ] **Step 6: Thread helper into `scripts/jyotish_api_server.py`** - Add one private helper, e.g. `_compute_muhurta_panchanga(...)`. - Attach result to consultation workflow and high-rigor/full-reading payloads where timing/remedies are relevant. - [ ] **Step 7: Update planner in `scripts/unified_consultation_orchestrator.py`** - Add `run_muhurta_panchanga` only when route needs timing/remedy support. - [ ] **Step 8: Re-run targeted tests** ## Task 2: Surface timing sidecar in MCP and frontend **Files:** - Modify: `mcp_server.py` - Modify: `jyotish-app/main.js` - Modify: `jyotish-app/renderers.js` - Modify: `jyotish-app/index.html` only if an existing slot/label is missing - Test: `tests/test_frontend_productization.py` **Interfaces:** - Consumes: workflow payload with `muhurta_panchanga`, `prashna`, `audited_remedies`. - Produces: visible timing/remedy panel in frontend + strict workflow payload exposure in MCP. - [ ] **Step 1: Write failing frontend/MCP contract test** - Assert payload/rendering can see `muhurta_panchanga`. - [ ] **Step 2: Run targeted tests to verify failure** - [ ] **Step 3: Thread `muhurta_panchanga` through `mcp_server.py` strict output** - [ ] **Step 4: Reuse existing Panchanga render path in `jyotish-app/renderers.js`** - No new tab unless current UI truly has nowhere to show it. - [ ] **Step 5: Update `jyotish-app/main.js` to render sidecar from unified workflow response** - [ ] **Step 6: Re-run targeted tests** ## Task 3: Make VedAstro official path the real default contract **Files:** - Modify: `scripts/vedastro_service_adapter.py` - Modify: `scripts/vedastro_priority.py` - Modify: `scripts/diagnose_vedastro_mode.py` - Modify: `scripts/jyotish_api_server.py` - Test: `tests/test_vedastro_runtime_mode_diagnostics.py` - Test: `tests/test_vedastro_service_adapter_executor.py` - Test: `tests/test_vedastro_official_full_snapshot.py` - Test: `tests/test_api_server_security.py` **Interfaces:** - Consumes: same birth payload/reference date/theme, existing env/free-tier settings, adapter cache/queue config. - Produces: one normalized block: - `runtime_truth` - `official_execution_layers` - `source_priority` - `free_tier_strategy` - [ ] **Step 1: Write/extend failing diagnostics tests** - Missing premium key should not masquerade as universal blocker. - Free-tier cache/queue possibility should be explicit. - [ ] **Step 2: Run diagnostics tests to verify failure** - [ ] **Step 3: Write/extend failing adapter/API tests** - Repeated same request should show cache-hit semantics. - Official snapshot status should flow as `ok/partial/blocked`, not disappear. - [ ] **Step 4: Run targeted adapter/API tests** - [ ] **Step 5: Tighten `scripts/vedastro_service_adapter.py`** - Reuse existing cache + queue path. - Expose explicit metadata, not hidden internal state. - [ ] **Step 6: Tighten `scripts/vedastro_priority.py`** - Keep one source-priority truth used by API/MCP/frontend. - [ ] **Step 7: Thread normalized blocks through `scripts/jyotish_api_server.py`** - `/api/chart` - `/api/full-reading` - `/api/thematic_report` - `/api/consultation_workflow` - [ ] **Step 8: Re-run targeted tests** ## Task 4: Show VedAstro official/fallback truth in MCP + frontend **Files:** - Modify: `mcp_server.py` - Modify: `jyotish-app/api-bridge.js` - Modify: `jyotish-app/main.js` - Modify: `jyotish-app/professional-reading.js` - Modify: `jyotish-app/ai-chat.js` - Test: `tests/test_frontend_productization.py` - Test: `tests/test_vedastro_official_mcp_bridge.py` **Interfaces:** - Consumes: API payload with `runtime_truth`, `official_execution_layers`, `source_priority`. - Produces: user-visible compact truth block and AI follow-up payload carrying same boundary. - [ ] **Step 1: Write failing frontend contract tests** - Assert frontend preserves and renders runtime-truth/source-priority data. - [ ] **Step 2: Run targeted tests to verify failure** - [ ] **Step 3: Thread fields via `jyotish-app/api-bridge.js`** - [ ] **Step 4: Render concise truth block in `jyotish-app/main.js` / `professional-reading.js`** - Show direct facts: official `ok/partial/blocked`, cache hit, queue used, fallback used or not. - [ ] **Step 5: Pass same block into `jyotish-app/ai-chat.js` follow-up payload** - [ ] **Step 6: Surface same summary in `mcp_server.py` strict workflow output** - [ ] **Step 7: Re-run targeted tests** ## Task 5: Normalize PyJHora artifact manifest for downstream consumers **Files:** - Modify: `scripts/generate_pyjhora_oracle_artifact_manifest.py` - Modify: `scripts/oracle_benchmark_inventory.py` - Modify: `scripts/external_oracle_sanity_closure.py` - Test: `tests/test_pyjhora_oracle_artifact_manifest.py` - Test: `tests/test_oracle_benchmark_inventory.py` - Test: `tests/test_external_oracle_sanity_closure.py` **Interfaces:** - Consumes: `references/oracle/artifacts/pyjhora_*` + `pending_packets/*pyjhora*.json`. - Produces: consistent per-front summary (`dasha`, `shadbala`, `tajika_sahams`) for audit scripts. - [ ] **Step 1: Write failing manifest/inventory tests** - Need front-wise counts + file refs + boundary text. - [ ] **Step 2: Run targeted tests to verify failure** - [ ] **Step 3: Extend `generate_pyjhora_oracle_artifact_manifest.py` minimally** - Add any missing fields needed by inventory/closure consumers. - [ ] **Step 4: Update `oracle_benchmark_inventory.py` to consume manifest, not ad hoc file scanning** - [ ] **Step 5: Update `external_oracle_sanity_closure.py` to report PyJHora evidence availability explicitly** - [ ] **Step 6: Re-run targeted tests** ## Task 6: Feed PyJHora evidence into backtest + master dashboard **Files:** - Modify: `scripts/historical_event_backtest.py` - Modify: `scripts/oracle_closure_master_dashboard.py` - Modify: `README.md` - Test: `tests/test_historical_event_backtest.py` - Test: `tests/test_oracle_closure_master_dashboard.py` **Interfaces:** - Consumes: normalized PyJHora manifest/inventory summary. - Produces: - backtest result includes matching `external_evidence_refs` - master dashboard shows PyJHora evidence readiness - README truth text stays honest - [ ] **Step 1: Write failing backtest/dashboard tests** - [ ] **Step 2: Run targeted tests to verify failure** - [ ] **Step 3: Update `historical_event_backtest.py`** - Link relevant artifact refs by front/domain; do not overclaim validation. - [ ] **Step 4: Update `oracle_closure_master_dashboard.py`** - Lift manifest summary into one closure board. - [ ] **Step 5: Refresh README wording** - Keep “black-box evidence only” explicit. - [ ] **Step 6: Re-run targeted tests** ## Task 7: Final regression pack **Files:** - No new files unless a missing narrow test is unavoidable **Run:** - [ ] `python3 -m pytest tests/test_muhurta.py tests/test_unified_consultation_orchestrator.py tests/test_api_server_security.py -q` - [ ] `python3 -m pytest tests/test_vedastro_runtime_mode_diagnostics.py tests/test_vedastro_service_adapter_executor.py tests/test_vedastro_official_full_snapshot.py tests/test_vedastro_official_mcp_bridge.py tests/test_frontend_productization.py -q` - [ ] `python3 -m pytest tests/test_pyjhora_oracle_artifact_manifest.py tests/test_oracle_benchmark_inventory.py tests/test_external_oracle_sanity_closure.py tests/test_historical_event_backtest.py tests/test_oracle_closure_master_dashboard.py -q` - [ ] Run one manual local workflow smoke: - direct chart - prashna/time question - one repeated request to verify cache hit metadata - [ ] Record remaining blocked items explicitly, especially: - official live endpoint availability - free-tier queue delay - missing PyJHora evidence fronts ## Fastest Execution Order 1. Task 3 2. Task 4 3. Task 1 4. Task 2 5. Task 5 6. Task 6 7. Task 7 Reason: - VedAstro default truth is the highest-value user-facing fix. - `muhurta/panchanga` sidecar reuses local code and is cheap once workflow contract is stable. - PyJHora evidence work is mainly audit/dashboards, not user runtime critical path. ## Stop Conditions Stop and mark `blocked` if any of these happen: - VedAstro official endpoint can only return `blocked` in the current environment and no cache sample exists. - A proposed PyJHora consumption change would require importing AGPL code instead of consuming stored artifacts. - `panchanga_api`-style sidecar would require a second planner/entry system instead of extending current unified workflow.