{
  "schemaVersion": "bazi-compatibility-replay-v1",
  "observedAt": "2026-09-27",
  "scope": {
    "cases": 240,
    "seed": 20260925,
    "scenario": "marriage",
    "yearRange": [
      1900,
      2099
    ],
    "composition": {
      "uniformRandom": 200,
      "earlyLateZiBoundary": 20,
      "solarTermBoundary": 20
    },
    "description": "240 seeded synthetic birth-data pairs: 200 uniform over 1900-2099, 20 with at least one person's hour forced to 23 or 0 (early/late 子時 either side of the midnight day boundary), 20 within a few days of one of the 12 solar-term month-boundary anchors. Each pair is charted by OpenFate's actual compatibility engine and by a separately written replay script, then their classical stem/branch interaction facts are diffed."
  },
  "comparedFields": [
    "Four Pillars (年/月/日/時 stem + branch) for both people",
    "Cross-chart branch relations: 六合 combination, 三合 trine, 半合 semi-trine, 三會 directional, 六沖 clash, 相刑 punishment (incl. 自刑 self-punishment), 六害 harm, 六破 destruction",
    "Cross-chart stem relations: 天干五合 combination, and the broader 相克 controlling relation OpenFate's engine evidences",
    "Day-master Ten God relation, both directions (A looking at B, B looking at A)"
  ],
  "results": {
    "cases": 240,
    "casesFullyMatched": 240,
    "factTypeMatches": {
      "pillars": 240,
      "branchLinks": 240,
      "stemFacts": 240,
      "dayMasterRelation": 240
    },
    "differenceCounts": {
      "convention": 0,
      "calendar-boundary": 0,
      "engine-bug": 0,
      "replay-bug": 0
    }
  },
  "differences": [],
  "conventionVariants": [
    {
      "id": "stemControlBreadth",
      "label": "天干相沖採狹義四沖（甲庚/乙辛/丙壬/丁癸）而非 OpenFate 引擎的廣義相克",
      "description": "OpenFate's engine evidences a broad stem \"controlling\" relation (any pair of stems whose elements sit in a direct 五行相克 relationship, either direction) under the label 天干相克. A narrower classical reading limits \"天干相沖\" to only the four same-polarity opposite pairs 甲庚/乙辛/丙壬/丁癸 (戊/己 Earth has no clash partner under this reading). This variant keeps only 天干五合 plus those four strict-clash pairs and drops every other broad-control fact the declared convention reports.",
      "citations": [
        "《淵海子平》— narrower 天干相沖 reading limited to the four same-polarity opposite stem pairs."
      ],
      "casesAffected": 237,
      "totalFactChanges": 1252
    },
    {
      "id": "destructionRecognition",
      "label": "不採認六破為獨立關係",
      "description": "OpenFate's engine reports 六破 (destruction: 子酉/卯午/辰丑/未戌/寅亥/巳申) as its own branch-relation category. Some modern schools treat only 合/沖/刑/害 as the recognised branch relations and do not score or even name 破 as an independent interaction. This variant drops every destruction link from the declared set.",
      "citations": [
        "Modern 四柱 teaching lineages that limit branch relations to 合/沖/刑/害 and omit 破 — a common but not universal simplification; 《淵海子平》 itself does name 六破."
      ],
      "casesAffected": 166,
      "totalFactChanges": 282
    },
    {
      "id": "semiTrineFirstLastPair",
      "label": "半合納入不含主氣支的首尾式（如申辰、寅戌）",
      "description": "Each 三合 trio has 3 possible two-branch subsets; OpenFate's declared 半合 table keeps only the 2 subsets that include the trio's 桃花/peak branch (子/午/卯/酉) — e.g. 申子 and 子辰 from 申子辰, but not 申辰. Some schools count any two of the three trio branches as a valid 半合. This variant adds the 4 excluded first-last pairs (申辰/寅戌/亥未/巳丑) wherever OpenFate's own cross-chart anchor-selection rule would match them.",
      "citations": [
        "Schools that define 半合 as \"any two of a 三合 trio's three branches\", rather than requiring the peak/桃花 branch — a documented alternative reading, not the 《淵海子平》 mainstream one OpenFate follows."
      ],
      "casesAffected": 129,
      "totalFactChanges": 157
    },
    {
      "id": "partialPunishmentRequiresTriple",
      "label": "兩支相刑（寅巳/巳申/丑戌/戌未）須第三支同時在場才算，子卯除外",
      "description": "OpenFate's engine credits a bare two-branch punishment pair (寅巳, 巳申, 丑戌, 戌未) as 相刑 whether or not the third branch completing its full three-punishment set (寅巳申 or 丑戌未) is present anywhere on either chart. Some schools require the complete triple before granting punishment credit to any of its pairs. This variant removes such a pair's link whenever the missing third branch is absent from both charts' eight branches; 子卯相刑 is unaffected because it has no three-branch completion in the classical set.",
      "citations": [
        "Schools requiring the full 寅巳申/丑戌未 triple before crediting any two-branch subset as 相刑 — a stricter, also-classical alternative to treating each pair independently."
      ],
      "casesAffected": 82,
      "totalFactChanges": 115
    },
    {
      "id": "dayBoundaryConvention",
      "label": "以子夜 00:00 為日界（現代 sect 2）而非以 23:00 為日界（OpenFate 實際預設 sect 1）",
      "description": "OpenFate's actual declared/effective day boundary is the traditional 23:00 early/late-子時 split (lunar-javascript EightChar sect 1, internal implementation BAZI_ENGINE_POLICY.dayBoundaryMode = 'ZI_HOUR_23'): a birth at 23:xx already rolls onto the next day's day-pillar. A modern alternative (sect 2) instead holds the day-pillar until midnight. This variant recomputes every case's full fact bundle under sect 2 and counts how many differ from the sect-1 (declared) reading — it is expected to concentrate in the 20 early/late-子時 boundary cases (hour 23 or 0) in this dataset.",
      "citations": [
        "Modern midnight day-boundary convention (sect 2, \"MIDNIGHT_00\"), as implemented by lunar-javascript EightChar.setSect(2) — this is the @openfate/bazi-engine npm package's own \"modern default\" per a source comment in node_modules/@openfate/bazi-engine/dist/core/pillars.js, but OpenFate's product policy (internal implementation) explicitly overrides it to ZI_HOUR_23."
      ],
      "casesAffected": 36,
      "totalFactChanges": 431
    }
  ],
  "limitations": [
    "The compatibility SCORE, evidence tone/weight, and any 喜用神 (useful-god) judgment are school-specific design choices, not recomputable facts, and are entirely out of scope for this replay.",
    "Only the \"marriage\" scenario is exercised; the other 8 compatibility scenarios share the same fact layer but use different pillar-weight tie-break tables for the rare multi-branch cross-pattern anchor case (see conventions.crossPatternAnchor) and are not separately replayed.",
    "True Solar Time, DST, and IANA timezone-transition handling are out of scope here (see conventions.trueSolarTime); that layer is covered separately by private verification implementation.",
    "Lunar-calendar birth-data input is not exercised; every synthetic case uses Gregorian input.",
    "This replay validates that OpenFate applies its own declared rules consistently, not that any particular classical school's interaction rules are the \"correct\" ones for 合婚."
  ],
  "citations": [
    "《淵海子平》— classical source for the six branch relations (六合/六沖/六害/六破), the two- and three-branch 相刑 punishment sets, and the five stem combinations (天干五合).",
    "《三命通會》— classical source cross-referenced for the same branch/stem relation tables.",
    "internal implementation and internal implementation (OpenFate repository) — read for which convention OpenFate declares where more than one classical reading exists (day boundary, stem-control breadth, cross-pattern anchor tie-break); not copied from.",
    "lunar-javascript (https://github.com/6tail/lunar-javascript) — the shared calendar library; see the public script header for why reusing it is a deliberate, disclosed choice."
  ],
  "title": "OpenFate calculation verification summary",
  "publicationKind": "first-party-verification-summary",
  "claimBoundary": "OpenFate performed this comparison using a separately written implementation. This is a publisher-reported result, not independent certification, a public replay kit, or evidence of predictive accuracy. Full execution records and implementation remain private.",
  "receiptSha256": "ff08774e209d0dccbd75d3a7b5c7fb432ca099f7584cca2a6aa3d03412b05540"
}
