{
  "name": "BaZi Calculator Boundary Benchmark",
  "version": "0.1.0",
  "released": "2026-09-05",
  "status": "reference-fixtures",
  "license": {
    "name": "CC BY 4.0",
    "url": "https://creativecommons.org/licenses/by/4.0/"
  },
  "scope": "Synthetic test cases for calendar boundaries, time zones, true solar time and day-boundary policies. This release does not rank commercial calculators.",
  "sources": [
    {
      "id": "hko-terms",
      "name": "Hong Kong Observatory: 24 Solar Terms",
      "url": "https://www.hko.gov.hk/en/gts/time/24solarterms.htm"
    },
    {
      "id": "usno-eot",
      "name": "U.S. Naval Observatory: Equation of Time",
      "url": "https://aa.usno.navy.mil/faq/eqtime"
    },
    {
      "id": "iana-tzdb",
      "name": "IANA Time Zone Database",
      "url": "https://data.iana.org/time-zones/tz-link.html"
    },
    {
      "id": "lunar-javascript",
      "name": "6tail/lunar-javascript",
      "url": "https://github.com/6tail/lunar-javascript",
      "license": "MIT"
    },
    {
      "id": "bazi-core",
      "name": "Eastern-Sunrise/bazi-core",
      "url": "https://github.com/Eastern-Sunrise/bazi-core",
      "license": "MIT"
    },
    {
      "id": "zhiji-bazi",
      "name": "AmsonntagChow/zhiji-bazi",
      "url": "https://github.com/AmsonntagChow/zhiji-bazi",
      "license": "Apache-2.0"
    }
  ],
  "fixtures": [
    {
      "id": "solar-term-crossing",
      "scenario": "solar-term-crossing",
      "local_input": "2026-02-04 around the Li Chun crossing, plus or minus 60 minutes",
      "time_zone": "Asia/Hong_Kong",
      "what_to_check": "Compare the exact crossing instant instead of the displayed civil date.",
      "source_ids": ["hko-terms"]
    },
    {
      "id": "term-timezone",
      "scenario": "solar-term-time-standard",
      "local_input": "2026-02-18 23:52",
      "time_zone": "Asia/Hong_Kong",
      "expected_utc": "2026-02-18T15:52:00Z",
      "what_to_check": "Keep one instant while displaying different time zones.",
      "source_ids": ["hko-terms", "iana-tzdb"]
    },
    {
      "id": "historical-dst",
      "scenario": "historical-daylight-saving",
      "local_input": "2000-01-15 12:00",
      "time_zone": "Australia/Melbourne",
      "what_to_check": "Use the historical offset for the location and date.",
      "source_ids": ["iana-tzdb"]
    },
    {
      "id": "longitude-correction",
      "scenario": "longitude-and-true-solar-time",
      "local_input": "2000-01-01 00:30",
      "time_zone": "Asia/Shanghai",
      "longitude_east": 87.6168,
      "what_to_check": "Preserve civil input while recording the derived solar-time date.",
      "source_ids": ["usno-eot", "iana-tzdb"]
    },
    {
      "id": "fractional-timezone",
      "scenario": "fractional-time-zone",
      "local_input": "2000-01-01 12:00",
      "time_zone": "Asia/Kolkata",
      "longitude_east": 77.5946,
      "what_to_check": "Do not round UTC+05:30 to a whole-hour offset.",
      "source_ids": ["iana-tzdb", "bazi-core"]
    },
    {
      "id": "late-zi-boundary",
      "scenario": "late-zi-hour-boundary",
      "local_input": "2000-01-01 23:30",
      "time_zone": "Asia/Shanghai",
      "what_to_check": "Compare explicit 23:00 and 00:00 day-boundary policies.",
      "source_ids": ["lunar-javascript", "zhiji-bazi"]
    },
    {
      "id": "midnight-boundary",
      "scenario": "midnight-boundary",
      "local_input": "2000-01-02 00:30",
      "time_zone": "Asia/Shanghai",
      "what_to_check": "Recompute the day pillar and all fields derived from the day stem together.",
      "source_ids": ["lunar-javascript", "zhiji-bazi"]
    },
    {
      "id": "southern-hemisphere",
      "scenario": "southern-hemisphere-input",
      "local_input": "2026-02-04 12:00",
      "time_zone": "Australia/Sydney",
      "what_to_check": "Keep calendar boundaries, time policy and seasonal interpretation separate.",
      "source_ids": ["hko-terms", "iana-tzdb"]
    }
  ]
}
