Same seed, different team assignments: archived observation replay Observed October28,2026. Synthetic input; real tool outputs. Download seed-manage-observed.csv and seed-groupmixer-observed.csv into one folder. Save the Python3 code below as verify-seed.py in that folder and run python verify-seed.py. No packages required; it only reads the two files and prints the canonical groups and teammate-pair difference. It does not predict either site's shuffle or write files. To repeat the browser conditions: use P01 through P08 in order (see seed-test-roster.txt). Manage My Batch classroom group generator: Number of groups2, seed40, both constraint boxes empty. GroupMixer: new workspace, same roster,1session,2groups/capacity4,no constraints,default maximize contacts and avoid repeats; solver Auto/Effort deterministic seed40,one lane,stop on optimal score. The saved GroupMixer runs reported effective_seed40 and optimal_score_reached. Later tool versions/devices may differ; save accepted assignments. Do not treat exported row order, group labels or seed alone as group membership. import csv,io,json,itertools,pathlib root=pathlib.Path(__file__).resolve().parent with (root/'seed-manage-observed.csv').open(encoding='utf-8-sig',newline='') as f: a=list(csv.DictReader(f)) with (root/'seed-groupmixer-observed.csv').open(encoding='utf-8-sig',newline='') as f: text=f.read() b=list(csv.DictReader(io.StringIO(text[text.index('Person ID,Group ID,Group Name,Session,Person Name'): ]))) def group(rows,name,team): out={} for r in rows: out.setdefault(r[team],[]).append(r[name]) return out x=group(a,'student','group');y=group(b,'Person Name','Group Name') def canonical(g): return sorted(sorted(v) for v in g.values()) def pairs(g): return set(p for v in g.values() for p in itertools.combinations(sorted(v),2)) expected=['P%02d'%i for i in range(1,9)] assert sorted(sum(x.values(),[]))==expected==sorted(sum(y.values(),[])) assert len(x)==len(y)==2 and all(len(v)==4 for v in list(x.values())+list(y.values())) px,py=pairs(x),pairs(y) assert canonical(x)!=canonical(y) assert ('P01','P02') not in px and ('P01','P02') in py assert len(px)==len(py)==12 and len(px&py)==4 and len(px-py)==len(py-px)==8 print(json.dumps({'pass':True,'manageGroups':x,'groupMixerGroups':y,'sameUnlabeledMembership':False,'pairsEach':[len(px),len(py)],'sharedPairs':sorted(px&py),'manageOnlyPairs':sorted(px-py),'groupMixerOnlyPairs':sorted(py-px)},indent=2))