Files
Jyotisha/docs/superpowers/plans/2026-07-16-dual-project-contract-implementation.md
T

4.1 KiB

Dual-Project Contract Implementation Plan

Execute after design approval. Two independent repositories; no runtime coupling.

Scope

Implement the first synchronization foundation in both repositories:

  1. versioned public synthetic-fixture manifest;
  2. stable compatibility-hash comparator;
  3. append-only cross-project synchronization ledger;
  4. focused tests and CI-friendly commands.

No production deployment, secret access, user-data migration, or formula change is in this phase.

Shared Files

Create byte-identical copies in both repositories:

  • references/cross_project_contract/fixture_manifest.v1.json
  • references/cross_project_contract/sync_ledger.json
  • scripts/cross_project_contract.py
  • tests/test_cross_project_contract.py

The fixture uses only generic public synthetic birth inputs. It declares the effective Ayanamsa and node mode. It contains a compatibility_hash, not a full internal result_hash: the former is generated from the fixed public contract fields below and is intentionally insensitive to extra report/evidence fields.

birth/effective params
ascendant longitude/sign
D1 Sun..Saturn/Rahu/Ketu longitude/sign

Task 1: Research Repository Contract

Files:

  • Modify: scripts/cross_project_contract.py (new)
  • Modify: references/cross_project_contract/fixture_manifest.v1.json (new)
  • Modify: references/cross_project_contract/sync_ledger.json (new)
  • Modify: tests/test_cross_project_contract.py (new)

Tests first:

  1. fixture accepts only synthetic/public metadata and complete effective settings;
  2. local calculation reproduces declared compatibility hash;
  3. altered node mode or expected hash produces non-zero comparator result;
  4. ledger entries require source/target commit, class, file allow-list, secret review, tests, hash result and rollback reference.

Implementation:

  1. call common jyotish_engine.compute_chart_data() directly;
  2. normalize only the contract fields into sorted JSON;
  3. SHA-256 the normalized bytes;
  4. expose --manifest, --format json, --require-match;
  5. validate ledger shape without reading either repository's Git history.

Verification:

python3 -m pytest -q tests/test_cross_project_contract.py
python3 scripts/cross_project_contract.py --require-match --format json

Task 2: Commercial Repository Port

Working tree: /tmp/Jyotisha-jesse-ux only after reading its AGENTS.md and running its pre-work check.

Tests first: copy the same contract tests. The initial test must fail because the contract files do not exist. Port the source commit's four files without copying deployment configuration or secrets.

Verification:

.venv/bin/python -m pytest -q tests/test_cross_project_contract.py
.venv/bin/python scripts/cross_project_contract.py --require-match --format json

If the commercial virtual environment does not exist, use its documented Python environment and report the missing dependency rather than installing into production or changing deployment configuration.

Task 3: Bidirectional Check

  1. run both comparator commands;
  2. compare their JSON compatibility_hash and manifest SHA-256;
  3. append a research-to-commercial ledger entry with exact commits;
  4. run public privacy scanning in both repositories;
  5. commit research changes to codex/release-hygiene-ci and commercial changes to codex/cross-project-contract; push both branches, but do not merge or deploy commercial main.

Failure Handling

  • Hash mismatch: do not normalize it away; record mismatch and identify the effective parameter/longitude difference.
  • Missing external raw: not relevant to a local compatibility hash; retain its existing blocked state in reports.
  • Private or production identifier found: reject the port, record the failure, and do not stage it.
  • Existing unrelated dirty files: leave untouched.

Discovery Adjustment

Jyotisha does not yet contain the research repository's domain_calculation_service.py. This is a phase-two safety port, not a prerequisite for the shared raw-chart compatibility hash. The phase-one comparator therefore targets the common engine API and does not claim REST/API calculation-contract parity.