{
  "BROWSER_PARITY.json": {
    "ok": true,
    "method": "Actual browser WASM output vs native CPython/PHP for full synthetic inputs",
    "normalizations": [
      "Symmetric internal aspects use unordered endpoints and deterministic row order; equal-orb contact rows sorted by named endpoints and angle; cross-person directions unchanged",
      "Runtime version and ephemeris directory metadata excluded",
      "Numeric tolerance 1e-7; ISO time rounding tolerance 50 ms"
    ],
    "cases": {
      "full_pair": {
        "elapsedMs": 77,
        "numericValues": 39487,
        "maxAbsoluteDifference": 9.999999994736442e-09,
        "equalStrings": 31838,
        "platformPathFields": 160,
        "failures": [],
        "failureCount": 0
      },
      "sidereal_true_node": {
        "elapsedMs": 59,
        "numericValues": 39563,
        "maxAbsoluteDifference": 9.999999994736442e-09,
        "equalStrings": 32161,
        "platformPathFields": 160,
        "failures": [],
        "failureCount": 0
      },
      "question_and_scan": {
        "elapsedMs": 31,
        "numericValues": 19306,
        "maxAbsoluteDifference": 1.893596390800667e-12,
        "equalStrings": 14979,
        "platformPathFields": 86,
        "failures": [],
        "failureCount": 0
      },
      "southern_hemisphere": {
        "elapsedMs": 23,
        "numericValues": 13725,
        "maxAbsoluteDifference": 7.727019024628135e-11,
        "equalStrings": 10733,
        "platformPathFields": 62,
        "failures": [],
        "failureCount": 0
      }
    }
  },
  "BROWSER_REGRESSION.json": {
    "ok": true,
    "browser": "154.0.4258.62",
    "elapsedMs": 9277,
    "core": {
      "ok": true,
      "test_count": 47,
      "checks": [
        "three DE441 files, hashes and actual paths verified",
        "pinned Kerykeion 5.12.9",
        "J2000 Sun independent fixed reference",
        "DST gap/fold rejected: 2026-03-08T02:30:00",
        "DST gap/fold rejected: 2026-11-01T01:30:00",
        "explicit DST fold offset preserves instant",
        "Kerykeion UTC bridge preserves fold coordinates",
        "missing Moon ephemeris rejects Moshier fallback",
        "checksum mismatch rejected",
        "lunar return roots and expected cycle count",
        "lunar return period follows ephemeris, not fixed 30-day steps",
        "profection boundary at exact civil birth clock",
        "ZR Cancer L2 first-cycle bond release to Capricorn",
        "no L1 bond-release injection",
        "ZR all three Lots return L1–L4",
        "ZR child interval contained in parent",
        "ZR child interval contained in parent",
        "ZR child interval contained in parent",
        "ZR child interval contained in parent",
        "ZR child interval contained in parent",
        "ZR child interval contained in parent",
        "ZR child interval contained in parent",
        "ZR child interval contained in parent",
        "ZR child interval contained in parent",
        "same solar arc applied to planets and angles",
        "progression time-key secondary",
        "progression time-key tertiary_sidereal",
        "progression time-key minor_synodic",
        "circular midpoint across 0 Aries",
        "SAV total 337",
        "16 vargas and five Vimshottari levels",
        "D4 fixed fixture: Taurus 15° -> Scorpio",
        "D60 source-sign and legacy-Aries variants distinguished",
        "BAV 12 signs per planet",
        "sidereal native/direct agreement ayanamsa 0",
        "sidereal native/direct agreement ayanamsa 1",
        "sidereal native/direct agreement ayanamsa 3",
        "sidereal native/direct agreement ayanamsa 5",
        "bound distributor active in direct and converse sequences",
        "bound distribution matches independent directed ARMC Ascendant",
        "exact event belongs to entry/exit orb interval",
        "same display name keeps two independent person IDs",
        "full GPT export contains every major calculation and limitations",
        "coverage record for every person output A",
        "coverage record for every person output B",
        "unrequested expensive scan explicitly not_run",
        "upstream relationship_self_test passed"
      ],
      "core_test": {
        "ok": true,
        "engine_version": "2.3.0",
        "synastry_aspects": 46,
        "transit_events": 82,
        "progression_to_natal_events": 40,
        "progressed_pair_events": 13
      },
      "limits": [
        "Actual Edge WebAssembly run. The subprocess-only relationship test is executed in process. Jyotish is tested separately via actual PHP WASM.",
        "Numerical regression does not establish predictive accuracy."
      ]
    },
    "v8": {
      "ok": true,
      "test_count": 69,
      "checks": [
        "입력 객체를 계산 중 변경하지 않음",
        "V9 스키마에서 V8 기능 회귀검사",
        "솔라아크가 원국을 변경하지 않음",
        "솔라아크 도수 메타데이터 Sun",
        "솔라아크 도수 메타데이터 Moon",
        "솔라아크 도수 메타데이터 Mercury",
        "솔라아크 도수 메타데이터 Venus",
        "솔라아크 도수 메타데이터 Mars",
        "솔라아크 도수 메타데이터 Jupiter",
        "솔라아크 도수 메타데이터 Saturn",
        "솔라아크 도수 메타데이터 Uranus",
        "솔라아크 도수 메타데이터 Neptune",
        "솔라아크 도수 메타데이터 Pluto",
        "솔라아크 도수 메타데이터 Mean Node",
        "솔라아크 도수 메타데이터 True Node",
        "솔라아크 도수 메타데이터 Lilith",
        "솔라아크 도수 메타데이터 Chiron",
        "솔라아크 도수 메타데이터 South Node",
        "솔라아크 도수 메타데이터 ASC",
        "솔라아크 도수 메타데이터 MC",
        "솔라아크 도수 메타데이터 Vertex",
        "솔라아크 도수 메타데이터 Equatorial ASC",
        "솔라아크 도수 메타데이터 DSC",
        "솔라아크 도수 메타데이터 IC",
        "솔라아크 도수 메타데이터 Anti-Vertex",
        "솔라아크 도수 메타데이터 Fortune",
        "솔라아크 도수 메타데이터 Spirit",
        "솔라아크 도수 메타데이터 Eros",
        "12궁 경계점을 시작 궁에 배정",
        "고정 원국의 당시 속도를 현재 상대속도로 쓰지 않음",
        "고정 목표에서 분리각",
        "두 이동체 상대속도 적용",
        "속도 없는 상징점은 미상으로 표기",
        "충 정확각 경계",
        "질문궁 R 주 기준과 세 방식 비교",
        "질문자 목성 상대 수성",
        "제공된 반올림 레기오몬타누스 표 검산",
        "참조값 불일치와 누락을 숨기지 않음",
        "달의 별자리 이탈 전 화성 삼각 검산",
        "달 정확각은 별자리 이탈 이전",
        "수성 목성 육각은 분리",
        "케투 반대 별자리 메타데이터 보정",
        "케투 이름이 라후에서 복사되지 않음",
        "불확실한 생시 13표본과 마지막 끝점 포함",
        "공통 다샤와 변동 다샤를 분리",
        "생시별 상승궁 변화 보존",
        "현재 월회귀와 다음 월회귀 A",
        "접촉 위상 범위 A",
        "적위는 실제 적도좌표 범위 A",
        "현재 월회귀와 다음 월회귀 B",
        "접촉 위상 범위 B",
        "적위는 실제 적도좌표 범위 B",
        "마크스 변경 시계의 낡은 분수 궁 위치 제거",
        "데이비슨 8종 진행",
        "8종 좌표 변환 관계 접촉",
        "데이비슨 태양회귀 경계",
        "사용자 관찰의 미검증 상태 보존",
        "새 계산의 실행 범위 기록 A.contact_dynamics",
        "새 계산의 실행 범위 기록 B.contact_dynamics",
        "새 계산의 실행 범위 기록 question.diagnostics_v8",
        "새 계산의 실행 범위 기록 relationship.davison_dynamics",
        "새 계산의 실행 범위 기록 birth_time_robustness",
        "결과 전체에 NaN 및 무한값 없음",
        "V8 확장 끄기 및 단일 인물 입력",
        "계묘일 갑오순 진사공망",
        "몽 2·6효 동 곤 구조",
        "손 2효 동 이 구조",
        "화궁 육친 오행 관계",
        "불완전 괘 입력 거절"
      ],
      "limits": [
        "수치·구조 회귀검사이며 점술의 실증 검증이 아닙니다.",
        "출생시각 범위는 표본 검사이며 연속 구간의 모든 시각을 증명하지 않습니다."
      ]
    },
    "v9": {
      "ok": true,
      "test_count": 240,
      "checks": [
        "natal all added calculations return without suppressed errors",
        "natal all nine grahas present",
        "natal exact DE441 coordinate echo Sun",
        "natal exact DE441 coordinate echo Moon",
        "natal exact DE441 coordinate echo Mars",
        "natal exact DE441 coordinate echo Mercury",
        "natal exact DE441 coordinate echo Jupiter",
        "natal exact DE441 coordinate echo Venus",
        "natal exact DE441 coordinate echo Saturn",
        "natal exact DE441 coordinate echo Rahu",
        "natal exact DE441 coordinate echo Ketu",
        "natal three styles D1",
        "natal valid nonempty SVG D1/north",
        "natal valid nonempty SVG D1/south",
        "natal valid nonempty SVG D1/east",
        "natal three styles D2",
        "natal valid nonempty SVG D2/north",
        "natal valid nonempty SVG D2/south",
        "natal valid nonempty SVG D2/east",
        "natal three styles D3",
        "natal valid nonempty SVG D3/north",
        "natal valid nonempty SVG D3/south",
        "natal valid nonempty SVG D3/east",
        "natal three styles D4",
        "natal valid nonempty SVG D4/north",
        "natal valid nonempty SVG D4/south",
        "natal valid nonempty SVG D4/east",
        "natal three styles D7",
        "natal valid nonempty SVG D7/north",
        "natal valid nonempty SVG D7/south",
        "natal valid nonempty SVG D7/east",
        "natal three styles D9",
        "natal valid nonempty SVG D9/north",
        "natal valid nonempty SVG D9/south",
        "natal valid nonempty SVG D9/east",
        "natal three styles D10",
        "natal valid nonempty SVG D10/north",
        "natal valid nonempty SVG D10/south",
        "natal valid nonempty SVG D10/east",
        "natal three styles D12",
        "natal valid nonempty SVG D12/north",
        "natal valid nonempty SVG D12/south",
        "natal valid nonempty SVG D12/east",
        "natal three styles D16",
        "natal valid nonempty SVG D16/north",
        "natal valid nonempty SVG D16/south",
        "natal valid nonempty SVG D16/east",
        "natal three styles D20",
        "natal valid nonempty SVG D20/north",
        "natal valid nonempty SVG D20/south",
        "natal valid nonempty SVG D20/east",
        "natal three styles D24",
        "natal valid nonempty SVG D24/north",
        "natal valid nonempty SVG D24/south",
        "natal valid nonempty SVG D24/east",
        "natal three styles D27",
        "natal valid nonempty SVG D27/north",
        "natal valid nonempty SVG D27/south",
        "natal valid nonempty SVG D27/east",
        "natal three styles D30",
        "natal valid nonempty SVG D30/north",
        "natal valid nonempty SVG D30/south",
        "natal valid nonempty SVG D30/east",
        "natal three styles D40",
        "natal valid nonempty SVG D40/north",
        "natal valid nonempty SVG D40/south",
        "natal valid nonempty SVG D40/east",
        "natal three styles D45",
        "natal valid nonempty SVG D45/north",
        "natal valid nonempty SVG D45/south",
        "natal valid nonempty SVG D45/east",
        "natal three styles D60",
        "natal valid nonempty SVG D60/north",
        "natal valid nonempty SVG D60/south",
        "natal valid nonempty SVG D60/east",
        "natal Jaimini seven-rank sum 280",
        "natal Graha Bala component arithmetic",
        "natal Rashi Bala component arithmetic",
        "natal rashi occupancy counts seven classical planets only",
        "natal all six yoga families evaluated",
        "natal all five upagrahas normalized",
        "natal tithi next root and residual",
        "natal karana next root and residual",
        "natal nakshatra next root and residual",
        "natal yoga next root and residual",
        "natal active hora interval contains requested instant",
        "target all added calculations return without suppressed errors",
        "target all nine grahas present",
        "target exact DE441 coordinate echo Sun",
        "target exact DE441 coordinate echo Moon",
        "target exact DE441 coordinate echo Mars",
        "target exact DE441 coordinate echo Mercury",
        "target exact DE441 coordinate echo Jupiter",
        "target exact DE441 coordinate echo Venus",
        "target exact DE441 coordinate echo Saturn",
        "target exact DE441 coordinate echo Rahu",
        "target exact DE441 coordinate echo Ketu",
        "target three styles D1",
        "target valid nonempty SVG D1/north",
        "target valid nonempty SVG D1/south",
        "target valid nonempty SVG D1/east",
        "target three styles D2",
        "target valid nonempty SVG D2/north",
        "target valid nonempty SVG D2/south",
        "target valid nonempty SVG D2/east",
        "target three styles D3",
        "target valid nonempty SVG D3/north",
        "target valid nonempty SVG D3/south",
        "target valid nonempty SVG D3/east",
        "target three styles D4",
        "target valid nonempty SVG D4/north",
        "target valid nonempty SVG D4/south",
        "target valid nonempty SVG D4/east",
        "target three styles D7",
        "target valid nonempty SVG D7/north",
        "target valid nonempty SVG D7/south",
        "target valid nonempty SVG D7/east",
        "target three styles D9",
        "target valid nonempty SVG D9/north",
        "target valid nonempty SVG D9/south",
        "target valid nonempty SVG D9/east",
        "target three styles D10",
        "target valid nonempty SVG D10/north",
        "target valid nonempty SVG D10/south",
        "target valid nonempty SVG D10/east",
        "target three styles D12",
        "target valid nonempty SVG D12/north",
        "target valid nonempty SVG D12/south",
        "target valid nonempty SVG D12/east",
        "target three styles D16",
        "target valid nonempty SVG D16/north",
        "target valid nonempty SVG D16/south",
        "target valid nonempty SVG D16/east",
        "target three styles D20",
        "target valid nonempty SVG D20/north",
        "target valid nonempty SVG D20/south",
        "target valid nonempty SVG D20/east",
        "target three styles D24",
        "target valid nonempty SVG D24/north",
        "target valid nonempty SVG D24/south",
        "target valid nonempty SVG D24/east",
        "target three styles D27",
        "target valid nonempty SVG D27/north",
        "target valid nonempty SVG D27/south",
        "target valid nonempty SVG D27/east",
        "target three styles D30",
        "target valid nonempty SVG D30/north",
        "target valid nonempty SVG D30/south",
        "target valid nonempty SVG D30/east",
        "target three styles D40",
        "target valid nonempty SVG D40/north",
        "target valid nonempty SVG D40/south",
        "target valid nonempty SVG D40/east",
        "target three styles D45",
        "target valid nonempty SVG D45/north",
        "target valid nonempty SVG D45/south",
        "target valid nonempty SVG D45/east",
        "target three styles D60",
        "target valid nonempty SVG D60/north",
        "target valid nonempty SVG D60/south",
        "target valid nonempty SVG D60/east",
        "target Jaimini seven-rank sum 280",
        "target Graha Bala component arithmetic",
        "target Rashi Bala component arithmetic",
        "target rashi occupancy counts seven classical planets only",
        "target all six yoga families evaluated",
        "target all five upagrahas normalized",
        "target tithi next root and residual",
        "target karana next root and residual",
        "target nakshatra next root and residual",
        "target yoga next root and residual",
        "target active hora interval contains requested instant",
        "Independent library SAV agrees with existing PyJHora table",
        "Independent BAV agreement Sun",
        "Independent BAV agreement Moon",
        "Independent BAV agreement Mars",
        "Independent BAV agreement Mercury",
        "Independent BAV agreement Jupiter",
        "Independent BAV agreement Venus",
        "Independent BAV agreement Saturn",
        "Native/direct sidereal Moon agreement Fagan-Bradley",
        "Native/direct sidereal Moon agreement Lahiri",
        "Native/direct sidereal Moon agreement De Luce",
        "Native/direct sidereal Moon agreement Raman",
        "Native/direct sidereal Moon agreement Usha-Shashi",
        "Native/direct sidereal Moon agreement Krishnamurti",
        "Native/direct sidereal Moon agreement Djwhal Khul",
        "Native/direct sidereal Moon agreement Yukteshwar",
        "Native/direct sidereal Moon agreement J.N. Bhasin",
        "Native/direct sidereal Moon agreement Sassanian",
        "wrap synthetic boundary chart has no hidden component errors []",
        "zero synthetic boundary chart has no hidden component errors []",
        "upzero synthetic boundary chart has no hidden component errors []",
        "dhana synthetic boundary chart has no hidden component errors []",
        "moon_mercury_dhana synthetic boundary chart has no hidden component errors []",
        "pada synthetic boundary chart has no hidden component errors []",
        "exchange synthetic boundary chart has no hidden component errors []",
        "mahapurusha synthetic boundary chart has no hidden component errors []",
        "sannyasa synthetic boundary chart has no hidden component errors []",
        "lagna0 synthetic boundary chart has no hidden component errors []",
        "lagna1 synthetic boundary chart has no hidden component errors []",
        "lagna2 synthetic boundary chart has no hidden component errors []",
        "lagna3 synthetic boundary chart has no hidden component errors []",
        "lagna4 synthetic boundary chart has no hidden component errors []",
        "lagna5 synthetic boundary chart has no hidden component errors []",
        "lagna6 synthetic boundary chart has no hidden component errors []",
        "lagna7 synthetic boundary chart has no hidden component errors []",
        "lagna8 synthetic boundary chart has no hidden component errors []",
        "lagna9 synthetic boundary chart has no hidden component errors []",
        "lagna10 synthetic boundary chart has no hidden component errors []",
        "lagna11 synthetic boundary chart has no hidden component errors []",
        "Exact quarter boundary starts pada 2",
        "Exact nakshatra boundary starts next mansion pada 1",
        "Exact halfway boundary starts pada 3",
        "Dhana documented Mercury condition does not substitute Mars",
        "Combustion crosses 360/0 correctly",
        "Planetary war crosses 360/0 correctly",
        "Odd sign zero degree is Bala",
        "Even sign zero degree is Mrita",
        "Upagraha exact 360 normalizes to Aries",
        "Dhana positive own-sign fifth/eleventh fixture",
        "Mutual exchange positive fixture",
        "Mahapurusha positive own-sign kendra fixture",
        "Sannyasa positive tenth lord with four planets fixture",
        "Ashtottari five levels preserve conditional applicability",
        "Ashtottari all active levels contain target time",
        "2026-10-08T00:00:00 day/night hora containment",
        "2026-10-08T05:00:00 day/night hora containment",
        "2026-10-08T12:00:00 day/night hora containment",
        "2026-10-08T23:59:59 day/night hora containment",
        "Exact sunrise begins hora 1, never 0 or 24",
        "Disable option preserves base calculations and explicit not_run",
        "Complete engine executes v9 by default",
        "Per-person coverage includes new output",
        "Birth and target epochs remain distinct",
        "Invalid ayanamsa rejected True",
        "Invalid ayanamsa rejected 99",
        "Invalid ayanamsa rejected Lahiri",
        "GPT text omits vector markup while retaining calculations",
        "Entire integrated output serializes without NaN/Infinity"
      ],
      "platform": "Actual Edge / Pyodide / PHP WASM",
      "python": "3.14.2",
      "source_commit": "8421a205495d4d8f410ea179590f5b0cc2cdceeb",
      "limits": [
        "PHP was executed in this browser for all 25 input packets. Test-only subprocess adapter matches every packet key/value (numeric tolerance 1e-7) before using its real PHP WASM response.",
        "Full native/browser comparisons separately test live request-to-result flow without replay.",
        "Numerical regression does not establish predictive accuracy."
      ]
    }
  },
  "UI_VALIDATION.json": {
    "ok": true,
    "base": "http://127.0.0.1:8788/",
    "browser": "154.0.4258.62",
    "checks": [
      "missing birth rejected in UI",
      "full two-person result displayed",
      "Jyotish both people and epochs computed",
      "input is not stored by default",
      "JSON export preserves result schema",
      "ChatGPT text export contains calculations and omits SVG markup",
      "selected person/B target D60 east SVG opens and downloads",
      "390px viewport without page horizontal overflow",
      "320px viewport without page horizontal overflow",
      "opt-in remembered input survives reload",
      "forget removes saved input",
      "offline reload and fresh calculation succeed",
      "no input/result POST or other write network request",
      "all assets load from this site only",
      "no uncaught page errors"
    ],
    "uncaughtErrors": [],
    "network": {
      "requestCount": 101,
      "methods": [
        "GET"
      ],
      "origins": [
        "http://127.0.0.1:8788"
      ]
    },
    "limits": [
      "390px and 320px are viewport emulation in Windows Edge, not a physical mobile device.",
      "Offline execution requires a successful first load and retained browser storage."
    ]
  }
}