{
  "invariant": "relative offset vector between species orbits (min-image, fractional coords)",
  "claim": {
    "invariant_under_origin_shift": "shifting the origin moves both orbits equally, so b-a is unchanged",
    "flips_under_decoration_or_polarity_swap": "swapping which fcc orbit hosts a species (or inverting a polar decoration) negates the relative offset, and no origin shift or lattice translation can reproduce the flip",
    "position_in_invariants_list": [
      "1. space group (SG label)",
      "2. NN coordination fingerprint",
      "3. NEW: relative offset vectors between species orbits"
    ]
  },
  "cases": {
    "zinc_blende_ZnS_F-43m_216": {
      "D1 (S at +(1/4,1/4,1/4) from Zn)": {
        "offset": [
          0.25,
          0.25,
          0.25
        ],
        "sg": "F-43m (216)",
        "nn": {
          "Zn->S": 4.0,
          "S->Zn": 4.0
        }
      },
      "D2 (S at -(1/4,1/4,1/4) from Zn)": {
        "offset": [
          -0.25,
          -0.25,
          -0.25
        ],
        "sg": "F-43m (216)",
        "nn": {
          "Zn->S": 4.0,
          "S->Zn": 4.0
        }
      },
      "D1 after origin shift (1/4,1/4,1/4)": {
        "offset": [
          0.25,
          0.25,
          0.25
        ]
      },
      "verdict": "same SG, same NN; offset distinguishes; origin-shift-invariant confirmed"
    },
    "wurtzite_ZnS_P6_3mc_186_polarity": {
      "up (S +3/8 c from Zn)": {
        "offset": [
          0.0,
          0.0,
          0.375
        ],
        "sg": "P6_3mc (186)",
        "nn": {
          "Zn->S": 4.0,
          "S->Zn": 4.0
        },
        "Zn_wyckoffs": [
          "b",
          "b"
        ],
        "S_wyckoffs": [
          "b",
          "b"
        ]
      },
      "down (S -3/8 c from Zn)": {
        "offset": [
          0.0,
          0.0,
          -0.375
        ],
        "sg": "P6_3mc (186)",
        "nn": {
          "Zn->S": 4.0,
          "S->Zn": 4.0
        },
        "Zn_wyckoffs": [
          "b",
          "b"
        ],
        "S_wyckoffs": [
          "b",
          "b"
        ]
      },
      "up after origin shift c=0.37": {
        "offset": [
          0.0,
          0.0,
          0.375
        ]
      },
      "verdict": "STRONGEST CASE: identical SG, identical species->Wyckoff letters (both 2b), identical NN -- the role-map fingerprint from sanity card v4.6 CANNOT see this flip; only the relative offset does. Physically distinct: inversion partners with opposite piezoelectric polarity."
    },
    "half_heusler_C1b_F-43m_216_vacancy_choice": {
      "A (Ag 0-orbit, Mg 1/4-orbit, vacancy 1/2-orbit)": {
        "offset_Ag_to_Mg": [
          0.25,
          0.25,
          0.25
        ],
        "sg": "F-43m (216)",
        "nn": {
          "Ag->Mg": 4.0,
          "Mg->Ag": 4.0
        }
      },
      "B (Ag 0-orbit, Mg 3/4-orbit, vacancy 1/4-orbit)": {
        "offset_Ag_to_Mg": [
          -0.25,
          -0.25,
          -0.25
        ],
        "sg": "F-43m (216)",
        "nn": {
          "Ag->Mg": 4.0,
          "Mg->Ag": 4.0
        }
      },
      "verdict": "same SG, same NN (4/4 tetrahedral); vacancy-orbit choice readable from offset sign alone"
    }
  },
  "known_answer_control": {
    "MgAgAs_full_prototype (Ag 4a, Mg 4b, Sb 4c)": "F-43m (216) -- pipeline validated before interpreting example outputs",
    "scar_re_earned": "first attempt built 2-atom cells on primitive cubic/hexagonal lattices; spglib returned R3m (160) / P6mm (183). The control caught it; proper fcc-decorated conventional cells give the correct groups. Also fixed an NN-count normalization bug (totals divided by all atoms instead of atoms of the source species) that read 2.0 instead of the known 4.0."
  },
  "files": [
    "offset_invariant_check.json",
    "offset_invariant_spglib.json",
    "offset_invariant_nn_counts.json",
    "offset_invariant_wyckoffs_wurtzite.json"
  ],
  "generated": "2026-09-08"
}