8000 aligns.md/benchmarks/run.py at main · hmmhmmhm/aligns.md · GitHub
[go: up one dir, main page]

Skip to content

Latest commit

 

History

History
306 lines (276 loc) · 16.6 KB

run.py

File metadata and controls

306 lines (276 loc) · 16.6 KB
sessions = codex_home / 'sessions'
if sessions.exists():
shutil.copytree(sessions, raw_dir / 'sessions')
session_contexts = []
for path in (raw_dir / 'sessions').rglob('*.jsonl') if (raw_dir / 'sessions').exists() else []:
events, _ = parse_events(path.read_text())
session_contexts.extend(e for e in events if e.get('type') in ('session_meta', 'turn_context'))
identity_values = []
for context in session_contexts:
payload = context.get('payload', {})
for key in ('creator_user_id', 'creator_account_id'):
if payload.get(key):
identity_values.append(payload[key])
auth_secrets = [*auth_secrets, *identity_values]
record['resolved_models'] = sorted({c['payload']['model'] for c in session_contexts if c.get('type') == 'turn_context'})
record['model_verified'] = record['resolved_models'] == [args.model]
if not record['model_verified'] and record['status'] == 'completed':
record['status'] = 'model_verification_failure'
record['session_contexts'] = session_contexts
record['before'] = before
write_json(raw_dir / 'record.json', record)
public = sanitize(record, replacements, auth_secrets)
write_json(args.output / 'trials' / (trial_id + '.json'), public)
# Publish all session events with the same literal substitutions, without auth files.
for path in (raw_dir / 'sessions').rglob('*.jsonl') if (raw_dir / 'sessions').exists() else []:
target = args.output / 'session-traces' / trial_id / (path.name + '.gz')
target.parent.mkdir(parents=True, exist_ok=True)
with gzip.open(target, 'wt') as handle:
handle.write(sanitize(path.read_text(), replacements, auth_secrets))
shutil.rmtree(runtime)
print(json.dumps({'trial': trial_id, 'status': record['status'], 'seconds': sum(t['duration_seconds'] for t in record['turns'])}), flush=True)
return {'id': trial_id, 'status': record['status']}
def main():
p = argparse.ArgumentParser(description=__doc__)
p.add_argument('--cases', type=Path, default=ROOT / 'benchmarks/cases.json')
p.add_argument('--output', type=Path, required=True)
p.add_argument('--private-output', type=Path, required=True)
p.add_argument('--auth', type=Path, default=Path.home() / '.codex/auth.json')
p.add_argument('--codex', type=Path, default=Path(shutil.which('codex') or 'codex'))
p.add_argument('--model', default='gpt-6-astra')
p.add_argument('--effort', choices=('low', 'medium', 'high', 'xhigh'), default='medium')
p.add_argument('--repeats', type=int, default=3)
p.add_argument('--workers', type=int, choices=(1, 2, 3), default=3)
p.add_argument('--timeout', type=int, default=240)
p.add_argument('--seed', type=int, default=20261015)
p.add_argument('--case', action='append')
p.add_argument('--expected-source-digest', help='Require exact SHA-256 of canonical source manifest JSON before executing')
p.add_argument('--manifest-only', action='store_true')
args = p.parse_args()
args.output = args.output.resolve()
args.private_output = args.private_output.resolve()
args.auth = args.auth.resolve()
if args.model != 'gpt-6-astra':
p.error('This preregistered benchmark requires gpt-6-astra; substitutions need a new protocol.')
if args.private_output.is_relative_to(ROOT):
p.error('Private evidence must be outside the repository.')
cases_doc = json.loads(args.cases.read_text())
cases = [c for c in cases_doc['cases'] if not args.case or c['id'] in args.case]
sources = source_manifest(args.cases.resolve())
source_hash = digest(json.dumps(sources, sort_keys=True))
if args.expected_source_digest and source_hash != args.expected_source_digest:
p.error(f'Source changed: expected {args.expected_source_digest}, got {source_hash}')
if not args.manifest_only and not args.expected_source_digest:
p.error('Execution requires --expected-source-digest from the frozen manifest.')
order = [(case, arm, repeat) for case in cases for arm in ARMS for repeat in range(1, args.repeats + 1)]
random.Random(args.seed).shuffle(order)
manifest = {'schema_version': 1, 'created_at': datetime.now(timezone.utc).isoformat(), 'source_files': sources,
'source_digest': source_hash, 'preregistered_commit': subprocess.check_output(['git', 'rev-parse', 'HEAD'], cwd=ROOT, text=True).strip(), 'cli_sha256': digest(args.codex.read_bytes()), 'model': args.model, 'reasoning_effort': args.effort,
'cli_version': subprocess.check_output([str(args.codex), '--version'], text=True).strip(),
'config_flags': config_flags(args.effort), 'seed': args.seed, 'repeats': args.repeats, 'workers': args.workers,
'timeout_seconds_per_turn': args.timeout, 'retry_policy': 'none',
'ordered_trials': [f'{c["id"]}__{a}__r{r}' for c, a, r in order],
'sanitization': 'Literal runtime, fixture, binary, source-repo and host-home paths replaced with named placeholders; auth JSON string values of 16+ characters and session creator account/user IDs replaced if present. Gzip session traces. No other trace normalization.',
'isolation': 'Fresh HOME and CODEX_HOME per scenario, auth-only symlink, empty inherited config, no ancestor project instructions, workspace-write sandbox, network tools disabled. OS sandbox permits reads outside fixture; held-out rubric is never supplied to the actor.'}
if args.manifest_only:
print(json.dumps(manifest, indent=2))
return
dirty_inputs = subprocess.check_output(['git', 'status', '--porcelain', '--', *sources.keys()], cwd=ROOT, text=True)
if dirty_inputs.strip():
p.error('Benchmark inputs must match the preregistered commit before execution.')
if args.output.exists() or args.private_output.exists():
p.error('Output locations must be new; failed trials are never overwritten or silently retried.')
args.output.mkdir(parents=True)
args.private_output.mkdir(parents=True, mode=0o700)
write_json(args.output / 'manifest.json', manifest)
auth_secrets = collect_strings(json.loads(args.auth.read_text()))
outcomes = []
run_started = time.monotonic()
with concurrent.futures.ThreadPoolExecutor(max_workers=args.workers) as pool:
futures = {pool.submit(run_trial, c, a, r, args, cases_doc['common_instructions'], auth_secrets): f'{c["id"]}__{a}__r{r}' for c, a, r in order}
for future in concurrent.futures.as_completed(futures):
try:
outcomes.append(future.result())
except Exception as exc:
outcomes.append({'id': futures[future], 'status': 'harness_failure', 'error': type(exc).__name__ + ': ' + str(exc)})
write_json(args.output / 'outcomes.json', outcomes)
final_sources = source_manifest(args.cases.resolve())
write_json(args.output / 'source-verification.json', {'matches_start': final_sources == sources, 'final_source_files': final_sources})
write_json(args.output / 'completion.json', {'finished_at': datetime.now(timezone.utc).isoformat(), 'wall_seconds': round(time.monotonic() - run_started, 3), 'completed_scenarios': sum(o['status'] == 'completed' for o in outcomes), 'planned_scenarios': len(order)})
print(json.dumps({'completed': sum(o['status'] == 'completed' for o in outcomes), 'total': len(order), 'source_unchanged': final_sources == sources}))
if __name__ == '__main__':
main()
0