From e5f344a04f7215013c272cee9d3f15c43e7afac3 Mon Sep 17 00:00:00 2001 From: firestar5683 <168790843+firestar5683@users.noreply.github.com> Date: Sat, 19 Sep 2026 13:59:33 -0700 Subject: [PATCH] Isolate semantic planner environment and report preparation-inclusive latency --- roadscore/prototype/hook_launch.py | 10 +++++++- roadscore/prototype/planned_composition.py | 2 ++ roadscore/prototype/test_hook_launch.py | 23 ++++++++++++++++++- .../prototype/test_planned_composition.py | 2 ++ 4 files changed, 35 insertions(+), 2 deletions(-) diff --git a/roadscore/prototype/hook_launch.py b/roadscore/prototype/hook_launch.py index f1039ce316..7258a9bbbd 100644 --- a/roadscore/prototype/hook_launch.py +++ b/roadscore/prototype/hook_launch.py @@ -21,7 +21,15 @@ def start_planner(launch, env, out, roadscore, bench, native=False): if not python.is_file():raise RuntimeError('Existing Mac ACE preparation environment missing: '+str(python)) env['ROADSCORE_PLANNER_TOKEN']=secrets.token_urlsafe(32) ready=out/'planner_ready.json' - planner=launch([str(python),str(roadscore/'prototype/hook_service.py'),'--assets-root',str(assets),'--cache',str(assets/'cache/hook-plans-v2'),'--ready',str(ready)],'semantic_planner') + previous={key:env.get(key) for key in ('PYTHONPATH','PYTORCH_ENABLE_MPS_FALLBACK')} + try: + env['PYTHONPATH']=os.pathsep.join(str(roadscore/path) for path in ('prototype','experiments/ace_chestnut_20260916')) + env['PYTORCH_ENABLE_MPS_FALLBACK']='1' + planner=launch([str(python),str(roadscore/'prototype/hook_service.py'),'--assets-root',str(assets),'--cache',str(assets/'cache/hook-plans-v2'),'--ready',str(ready)],'semantic_planner') + finally: + for key,value in previous.items(): + if value is None:env.pop(key,None) + else:env[key]=value deadline=time.monotonic()+300 while not ready.exists(): if planner.poll() is not None or time.monotonic()>deadline:raise RuntimeError('Host semantic planner failed; see semantic_planner.log') diff --git a/roadscore/prototype/planned_composition.py b/roadscore/prototype/planned_composition.py index ec8899d864..1e72346f44 100644 --- a/roadscore/prototype/planned_composition.py +++ b/roadscore/prototype/planned_composition.py @@ -43,6 +43,8 @@ class PlannedComposition: if len(committed)!=frames*1920 or z.shape[1]!=frames:raise ValueError('Native sampler returned incomplete planned window') model_duration=stats['duration'];duration=frames/25;new=duration-stats['prefix_seconds'] if new<=0 or not np.isfinite(committed).all():raise ValueError('Invalid committed planned audio') + end_to_end=self.pending['host_preparation_seconds']+stats.get('wall_seconds',stats['generation_seconds']+stats['decode_seconds']) + stats.update(end_to_end_seconds=end_to_end,end_to_end_rtf_new_audio=end_to_end/new) stats.update(self.pending,case=role,prepared_profile=self.profile,model_duration=model_duration,duration=duration,new_seconds=new,discarded_lookahead_seconds=model_duration-duration,endpoint=endpoint,composition_policy='hook-v2',preparation_host='authenticated host semantic planner',warm_rtf_new_audio=(stats['generation_seconds']+stats['decode_seconds'])/new) return committed,z,stats def accept(self,wave,latent): diff --git a/roadscore/prototype/test_hook_launch.py b/roadscore/prototype/test_hook_launch.py index 5f3b21bfb4..d494fd662b 100644 --- a/roadscore/prototype/test_hook_launch.py +++ b/roadscore/prototype/test_hook_launch.py @@ -1,9 +1,30 @@ import unittest -from hook_launch import enabled +import tempfile +import json +from pathlib import Path +from types import SimpleNamespace +from hook_launch import enabled,start_planner from prepared_session import verify from session_seed import select_session class LaunchTests(unittest.TestCase): + def test_planner_environment_isolated_and_caller_restored(self): + with tempfile.TemporaryDirectory() as directory: + root=Path(directory);python=root/'python';python.touch() + env={'ROADSCORE_PLANNER_PYTHON':str(python),'PYTHONPATH':'unrelated-runtime:analysis/site-packages','PYTORCH_ENABLE_MPS_FALLBACK':'0'} + observed=[] + def launch(command,name,**kwargs): + observed.append((name,env.copy())) + if name=='semantic_planner':(root/'planner_ready.json').write_text(json.dumps({'port':12345})) + else:(root/'semantic_tunnel.log').write_text('PLANNER_TUNNEL_READY') + return SimpleNamespace(poll=lambda:None) + start_planner(launch,env,root,root/'roadscore','fake-no-connection') + self.assertEqual(observed[0][1]['PYTHONPATH'],str(root/'roadscore/prototype')+':'+str(root/'roadscore/experiments/ace_chestnut_20260916')) + self.assertEqual(observed[0][1]['PYTORCH_ENABLE_MPS_FALLBACK'],'1') + self.assertEqual(env['PYTHONPATH'],'unrelated-runtime:analysis/site-packages') + self.assertEqual(env['PYTORCH_ENABLE_MPS_FALLBACK'],'0') + self.assertEqual(observed[1][1]['PYTHONPATH'],env['PYTHONPATH']) + def test_fresh_and_explicit_but_not_judging_or_replay(self): self.assertTrue(enabled(select_session(123),False,'ace')) self.assertTrue(enabled(select_session(random_bits=lambda _:234),False,'ace')) diff --git a/roadscore/prototype/test_planned_composition.py b/roadscore/prototype/test_planned_composition.py index 755110a8da..701ddbe949 100644 --- a/roadscore/prototype/test_planned_composition.py +++ b/roadscore/prototype/test_planned_composition.py @@ -43,6 +43,8 @@ class IntegrationTests(unittest.TestCase): self.assertEqual(run.begin(None),'initial') wave,latent,stats=run.generate(sampler,11,None,retain) self.assertEqual(len(wave),28*48000);self.assertEqual(latent.shape,(1,700,64)) + self.assertAlmostEqual(stats['end_to_end_seconds'],stats['host_preparation_seconds']+1.1) + self.assertAlmostEqual(stats['end_to_end_rtf_new_audio'],stats['end_to_end_seconds']/28) initial_key=stats['plan_key'];run.accept(wave,latent) committed=latent.copy() self.assertEqual(run.begin(committed),'verse')