"""Silent creation of exactly six reviewed metered activation requests; never approves or consumes.""" import argparse,base64,json,os,stat,subprocess,time,sys from pathlib import Path from datetime import datetime,timezone,timedelta from urllib.request import Request,build_opener,ProxyHandler,HTTPRedirectHandler from urllib.parse import urlencode from urllib.error import HTTPError import jwt ROOT=Path('/home/worsch/railiance-platform') RECEIPT=ROOT/'docs/evidence/2026-09-27-metered-approval-requests.json' POLICY='workload-kv-read-secrets-engine-requester-client' KV='platform/data/workloads/secrets-engine/approval-requester' ISSUER='https://kc.coulomb.social' class NoRedirect(HTTPRedirectHandler): def redirect_request(self,*args,**kwargs): return None def http(url,*,body=None,headers=None): req=Request(url,data=body,headers=headers or {}) try: with build_opener(ProxyHandler({}),NoRedirect()).open(req,timeout=20) as response: content=response.read(1048577);status=response.status except HTTPError as error: status=error.code;content=error.read(1048577);error.close() if len(content)>1048576:raise ValueError('response_too_large') return status,json.loads(content) def bao(*args): p=subprocess.run(['bao',*args],capture_output=True,text=True,timeout=20) if p.returncode:raise ValueError('metadata_failed') return json.loads(p.stdout) def check_identity(d): policies=set(d.get('policies',[]))|set(d.get('identity_policies',[])) if POLICY not in policies or policies-{POLICY,'default'} or not d.get('entity_id') or not 0= WINDOW_END:raise ValueError('spend_window_expired') body={'id':record['approval_id'],'binding':record['binding'],'validity':{'not_before':now.isoformat(),'expires_at':min(now+timedelta(hours=24),WINDOW_END).isoformat()},'required_count':1,'human_control':record['human_control'],'pdp_path':True,'pdp_digest':pdp_digest} receipt['phase']='create_attempt:'+record['action'];RECEIPT.write_text(json.dumps(receipt,indent=2)+'\n') status,result=http('http://127.0.0.1:18281/v1/approvals',body=json.dumps(body).encode(),headers={'Authorization':'Bearer '+token,'Content-Type':'application/json'}) if status!=201 or result['status']!='requested' or result['entries'] or result['binding']['digest']!=record['binding_digest'] or result['binding']['human_control'] is not record['human_control'] or result['binding']['pdp_digest']!=pdp_digest:raise ValueError('request_creation_requires_reconciliation') receipt['requests'].append({'memo_id':memo.removeprefix('memo:'),'memo_version':record['memo_version'],'action':record['action'],'catalog':record['catalog'],'approval':result}) RECEIPT.write_text(json.dumps(receipt,indent=2)+'\n') receipt.update(status='created',phase='six_unapproved_requests_created',human_entries_created=False,approvals_consumed=False) if __name__=='__main__': p=argparse.ArgumentParser();p.add_argument('--clock-trust-file',type=Path);p.add_argument('--mandate',type=Path);p.add_argument('--dry-run',action='store_true');a=p.parse_args() if a.dry_run: rows=requests() print(json.dumps({'count':len(rows),'packet_sha256':PACKET_SHA256,'requests':[{'memo_id':m,'catalog':r['catalog'],'action':r['action'],'human_control':r['human_control']} for m,r,_ in rows],'posted':False})) raise SystemExit(0) if not a.clock_trust_file or not a.mandate:raise SystemExit('reviewed mandate and Clock admission required') mandate=json.loads(a.mandate.read_text()) if mandate != {'status':'operator-approved','packet_sha256':PACKET_SHA256,'scope':'create-only-six-metered-requests','source':'explicit user approval in attended Codex session'}:raise SystemExit('exact requester mandate required') sys.path.insert(0,'/home/worsch/railiance-clock/src') from railiance_clock.client import Clock,FileTrust CLOCK=Clock(FileTrust(a.clock_trust_file));CLOCK.read() if RECEIPT.exists():raise SystemExit(1) receipt={'observed_at':datetime.now(timezone.utc).isoformat(),'status':'failed','phase':'preflight','requests':[],'credential_values_emitted':False,'packet_sha256':PACKET_SHA256} try:main(receipt) except Exception:raise SystemExit(1) from None finally:RECEIPT.write_text(json.dumps(receipt,indent=2)+'\n')