Everything the next agent needs to run the Phase 2 optimisation loop on a machine that can launch the client: - analysis/client-perf/: LEVERS (ranked levers + corrections), BENCH-MATRIX (world, scenes, config IDs, blocks B0-B14 with decision rules), PLAYER-TUNING, SPAWN-TUNING, research briefs, the jar scanner and its output, observed default configs, and proposed-configs/ (build.py generates tiers and bench variants and fails on unknown keys; apply_variant.py applies a variant and merges options.txt). - analysis/client-perf/bench/onion-bench/: bench-world datapack (scene teleports, Create grid, mob pen, sound storm, 120 s teleport tour). - analysis/audit/: the static recipe/dependency audit, including gen_fixes.py, which generates the shipped Paxi datapack and was never tracked. - phase0/: per-machine measurement harness (Steam Deck, 7700K/1060, 6700K/1080 Ti). - .pi/journal.md: running work log; read it first. All of it is packwizignored, so nothing here ships to players.
43 lines
1.9 KiB
Python
43 lines
1.9 KiB
Python
import pickle,re
|
|
D=pickle.load(open("data.pkl","rb")); mods=D["mods"]
|
|
mods.setdefault("minecraft",[dict(jar="base",version="1.21.1",deps=[],nested=False)])
|
|
def vt(v): return [int(x) if x.isdigit() else x for x in re.split(r'[.\-+_]',v)]
|
|
def cmp(a,b):
|
|
a,b=vt(a),vt(b)
|
|
for x,y in zip(a,b):
|
|
if x==y: continue
|
|
if type(x)==type(y): return -1 if x<y else 1
|
|
return -1 if isinstance(x,str) else 1
|
|
return (len(a)>len(b))-(len(a)<len(b))
|
|
def inrange(v,r):
|
|
r=r.strip()
|
|
if not r or r=="*": return True
|
|
for part in re.findall(r'[\[\(][^\]\)]*[\]\)]',r) or [None]:
|
|
if part is None: return cmp(v,r)>=0
|
|
lo,_,hi=part[1:-1].partition(",")
|
|
if "," not in part:
|
|
if cmp(v,lo)==0: return True
|
|
continue
|
|
ok=True
|
|
if lo.strip(): c=cmp(v,lo.strip()); ok&= c>0 or (c==0 and part[0]=="[")
|
|
if hi.strip(): c=cmp(v,hi.strip()); ok&= c<0 or (c==0 and part[-1]=="]")
|
|
if ok: return True
|
|
return False
|
|
# duplicate modids among top-level jars
|
|
for mid,l in mods.items():
|
|
top=[x for x in l if not x["nested"]]
|
|
if len(top)>1: print("DUP-MODID",mid,[x["jar"] for x in top])
|
|
for mid,l in sorted(mods.items()):
|
|
e=[x for x in l if not x["nested"]] or l
|
|
for d in e[0]["deps"]:
|
|
t=str(d.get("type",d.get("mandatory") and "required" or "optional")).lower()
|
|
if d.get("mandatory") is True: t="required"
|
|
did=d.get("modId"); side=d.get("side","BOTH")
|
|
if t not in("required","incompatible","discouraged"): continue
|
|
if did not in mods:
|
|
if t=="required": print("MISSING",mid,"->",did,d.get("versionRange"),side)
|
|
continue
|
|
v=mods[did][0]["version"]; r=d.get("versionRange","")
|
|
if t=="required" and not v.startswith("$") and not inrange(v,r): print("VERSION",mid,"->",did,"needs",r,"have",v)
|
|
if t in("incompatible","discouraged") and (not r or inrange(v,r)): print(t.upper(),mid,"->",did,r,"have",v)
|