20 lines
1.5 KiB
Python
20 lines
1.5 KiB
Python
#!/usr/bin/env python3
|
|
"""Read-only checkpoint for the grounded-decision trial. No keys or player whispers."""
|
|
import collections,json,time,urllib.request
|
|
from pathlib import Path
|
|
base='http://127.0.0.1:8787'
|
|
def get(path):
|
|
with urllib.request.urlopen(base+path,timeout=20) as r:return json.load(r)
|
|
s=get('/api/state');insights=get('/api/realm-insights');now=time.time()
|
|
bots=[b for b in s['bots'] if b.get('status')=='online' and b.get('autonomy',{}).get('managed')]
|
|
checks=[c for b in bots for c in b.get('autonomy',{}).get('intentChecks',[])]
|
|
report={'checkedAt':now,'online':len(bots),'teams':dict(collections.Counter(b.get('world',{}).get('team') for b in bots)),
|
|
'freshObservations':sum(0<=now-b.get('world',{}).get('at',0)<90 for b in bots),
|
|
'groupedBots':sum(bool(b.get('world',{}).get('groupId')) for b in bots),
|
|
'questKnowledge':sum(bool(b.get('world',{}).get('questBrief')) for b in bots),
|
|
'evaluation':insights.get('evaluation'),'recentIntentResults':dict(collections.Counter(c['status'] for c in checks)),
|
|
'currentActivity':dict(collections.Counter(b['label'] for b in insights.get('activity',[]))),
|
|
'zaku':[{k:b.get(k) for k in ('name','level','zone','lastDecision')} for b in bots if b['name']=='Zaku'],
|
|
'limitations':['Rates use fresh sampled bot-hours; collection gaps excluded.','Native death deltas use retained death records; retention can undercount at rollover.','An observed outcome following an intention does not establish causation.','One day is an initial comparison, not proof of long-term reliability.']}
|
|
print(json.dumps(report,indent=2))
|