import os, sys, pathlib, subprocess, time, json, urllib.request, datetime, signal
root=pathlib.Path(__file__).parent
run=root / ('run-'+datetime.datetime.now(datetime.timezone.utc).strftime('%Y%m%dT%H%M%SZ'))
run.mkdir()
fake=run/'bin'; fake.mkdir()
(fake/'tailscale').write_text('''#!/usr/bin/env python3
import os,sys,json
with open(os.environ['TAILSCALE_LOG'],'a') as f: f.write(json.dumps(sys.argv[1:])+'\\n')
if sys.argv[1:]==['status','--json']: print(json.dumps({'BackendState':'Running','Self':{'DNSName':'machine.example.ts.net.','TailscaleIPs':['100.100.100.100']}}))
elif sys.argv[1:]==['serve','status','--json']: print('{}')
''')
(fake/'tailscale').chmod(0o755)
for side,checkout in [('before',sys.argv[1]),('after',sys.argv[2])]:
    home=run/side; home.mkdir()
    argvlog=home/'tailscale.jsonl'
    env=dict(os.environ,PATH=str(fake)+':'+os.environ['PATH'],TAILSCALE_LOG=str(argvlog),T3CODE_HOME=str(home),T3CODE_DEV_SEED='0')
    cmd=['node','apps/server/src/bin.ts','serve','--base-dir',str(home),'--host','127.0.0.2','--port','45679','--tailscale-serve','--tailscale-serve-port','8443']
    raw=open(home/'raw.log','w')
    p=subprocess.Popen(cmd,cwd=checkout,env=env,stdout=raw,stderr=subprocess.STDOUT,start_new_session=True)
    def request(url):
        try:
            response=urllib.request.build_opener(urllib.request.ProxyHandler({})).open(url+'/.well-known/t3/environment',timeout=2)
            return f'HTTP {response.status}'
        except Exception as e: return str(e)
    try:
        deadline=time.monotonic()+90
        while time.monotonic()<deadline:
            if argvlog.exists() and '--https=8443' in argvlog.read_text() and request('http://127.0.0.2:45679')=='HTTP 200': break
            if p.poll() is not None: raise RuntimeError((home/'raw.log').read_text())
            time.sleep(.2)
        calls=[json.loads(x) for x in argvlog.read_text().splitlines()]
        serve=next(x for x in calls if '--https=8443' in x)
        target=serve[-1]
        listener=subprocess.check_output(['ss','-H','-ltn','sport = :45679'],text=True).strip()
        sha=subprocess.check_output(['git','rev-parse','HEAD'],cwd=checkout,text=True).strip()
        transcript=f'''{side.upper()} — real T3 server CLI reproduction
Commit: {sha}
Environment: Linux, Node server from source; fresh isolated T3 home; no seed data.
Tailscale: deterministic CLI stub (Running backend, empty serve status).
Command: T3CODE_DEV_SEED=0 node apps/server/src/bin.ts serve --base-dir <isolated-home> --host 127.0.0.2 --port 45679 --tailscale-serve --tailscale-serve-port 8443

Observed Tailscale Serve argv: {json.dumps(serve)}
Observed listening socket (ss -H -ltn): {listener}
Direct bound address: {request('http://127.0.0.2:45679')}
Default loopback address: {request('http://127.0.0.1:45679')}
Configured Serve target {target}: {request(target)}

Endpoint requested: /.well-known/t3/environment
AI-assisted; verified with the tests and tools listed above.
'''
        (run/(side+'.txt')).write_text(transcript)
        print(transcript,flush=True)
    finally:
        if p.poll() is None: os.killpg(p.pid,signal.SIGTERM)
        try: p.wait(timeout=15)
        except subprocess.TimeoutExpired: os.killpg(p.pid,signal.SIGKILL); p.wait()
        raw.close()
print('ARTIFACTS',run)
