AnasSarkiz/usb-c-pd-brushed-motor

USB-C PD-powered motor controller with protected input, selectable 5/9/12 V buck supply, MCU qualification, PWM H-bridge drive, overvoltage sensing, regenerative energy-dump resistors, and safety interlocks.

Version
0.0.1-a48-cloud-pipeline9-unrouted-c41d79a-305b1e7a
License
unset
Stars
0

scripts/review-firmware-stack.py

"""Conservative static call-path screen of the linked ARM image, not a stack measurement."""
from pathlib import Path
import re,json,subprocess,hashlib
ROOT=Path.cwd();FOLDER=ROOT/'dist/firmware/bringup';ELF=FOLDER/'motor-controller-A22.elf'
assembly=subprocess.check_output(['arm-none-eabi-objdump','-d',str(ELF)],text=True)
(FOLDER/'disassembly.txt').write_text(assembly)
def canonical(name):return re.sub(r'\.(constprop|isra)\.\d+$',r'.\1',name)
frames={};origins={};issues=[]
for path in FOLDER.glob('*.su'):
 for line in path.read_text().splitlines():
  location,size,classification=line.split('\t');name=canonical(location.split(':')[-1])
  frames[name]=max(frames.get(name,0),int(size));origins.setdefault(name,set()).add(path.name)
  if classification!='static':issues.append(name+': nonstatic stack usage '+classification)
functions={};function=None
for line in assembly.splitlines():
 match=re.match(r'([0-9a-f]+) <([^>]+)>:',line)
 if match:
  function=canonical(match[2]);functions.setdefault(function,{'calls':set(),'assemblyStack':0,'indirect':False})
 elif function:
  block=functions[function]
  if re.search(r'\bblx\s+r\d+',line):block['indirect']=True
  call=re.search(r'\b(?:bl|b|b\.w)\s+[0-9a-f]+ <([^>]+)>',line)
  if call:
   destination=canonical(call[1].split('+')[0])
   if destination!=function:block['calls'].add(destination)
  push=re.search(r'\bpush\s+\{([^}]+)\}',line)
  if push:block['assemblyStack']+=4*len(push[1].split(','))
  allocation=re.search(r'\bsub\s+sp,\s*#(\d+)',line)
  if allocation:block['assemblyStack']+=int(allocation[1])
  if re.search(r'\bsub\s+sp,\s*r',line):issues.append(function+': register-sized stack allocation')
# Closed target callback assignments are in motor_main/stm32_{adc,i2c,safe_gpio}.
# Over-approximate every reachable callback within its production owner family.
for name,block in functions.items():
 if not block['indirect']:continue
 origin=' '.join(origins.get(name,[]))
 if 'stusb4500' in origin or name in ['hold_reset','late','read_checked','write_checked']:
  targets={'read_transfer','write_transfer','bus_time','motor_gpio_inhibit','motor_time_us'}
 elif 'motor_owner' in origin:targets={'read_transfer','write_transfer','bus_time','interrupt_pending','enter_critical','leave_critical'}
 elif 'stm32_safe_gpio' in origin:targets={'target_bsrr'}
 elif 'stm32_adc' in origin or 'stm32_i2c' in origin:targets={'target_write','motor_time_us'}
 else:issues.append(name+': indirect target family unresolved');targets=set()
 for target in targets:
  if target not in functions:issues.append(name+': missing callback '+target)
 block['calls'].update(targets)
for name,block in functions.items():
 block['frame']=frames.get(name,block['assemblyStack'])
 block['origin']=sorted(origins.get(name,[])) or ['linked assembly conservative push/allocation sum']
def bound(name,path):
 if name in path:raise RuntimeError('Recursive call graph: '+' -> '.join(path+[name]))
 if name not in functions:raise RuntimeError('Unresolved call target '+name)
 block=functions[name];children=[bound(child,path+[name])for child in block['calls']]
 longest=max(children,key=lambda item:item['bytes'],default={'bytes':0,'path':[]})
 return {'bytes':block['frame']+longest['bytes'],'path':[name]+longest['path']}
try:
 main=bound('motor_main',[]);exti=bound('EXTI4_15_IRQHandler',[]);timer=bound('TIM3_IRQHandler',[])
 # Cortex-M exception frames8 words each +up to4-byte alignment, EXTI can be
 # interrupted by higher-priority TIM3. No floating-point hardware state.
 combined=main['bytes']+exti['bytes']+timer['bytes']+2*(32+4)
 if combined>2048:issues.append('Bound exceeds reserved2KiB stack')
except RuntimeError as error:
 issues.append(str(error));main=exti=timer=None;combined=None
report={'revision':'A22','elfSha256':hashlib.sha256(ELF.read_bytes()).hexdigest(),'method':'compiler static frames/direct and closed indirect call paths; linked library assembly conservative allocation sum','foreground':main,'exti':exti,'timer':timer,'combinedUpperScreenBytes':combined,'reservedBytes':2048,'issues':issues,'functions':{name:{**block,'calls':sorted(block['calls'])}for name,block in functions.items()},'limitations':['Callbacks must remain the closed production target set; configuration changes require reanalysis','Static screen is not stack high-water evidence on a physical MCU','Latency/watchdog/interrupt-masking duration still require target captures']}
(ROOT/'evidence/firmware-stack-screen-A22.json').write_text(json.dumps(report,indent=2)+'\n')
print(json.dumps({k:report[k]for k in ['foreground','exti','timer','combinedUpperScreenBytes','reservedBytes','issues']},indent=2))
if issues:raise SystemExit(1)
,r'.\\1',name)\nframes={};origins={};issues=[]\nfor path in FOLDER.glob('*.su'):\n for line in path.read_text().splitlines():\n location,size,classification=line.split('\\t');name=canonical(location.split(':')[-1])\n frames[name]=max(frames.get(name,0),int(size));origins.setdefault(name,set()).add(path.name)\n if classification!='static':issues.append(name+': nonstatic stack usage '+classification)\nfunctions={};function=None\nfor line in assembly.splitlines():\n match=re.match(r'([0-9a-f]+) \u003c([^\u003e]+)\u003e:',line)\n if match:\n function=canonical(match[2]);functions.setdefault(function,{'calls':set(),'assemblyStack':0,'indirect':False})\n elif function:\n block=functions[function]\n if re.search(r'\\bblx\\s+r\\d+',line):block['indirect']=True\n call=re.search(r'\\b(?:bl|b|b\\.w)\\s+[0-9a-f]+ \u003c([^\u003e]+)\u003e',line)\n if call:\n destination=canonical(call[1].split('+')[0])\n if destination!=function:block['calls'].add(destination)\n push=re.search(r'\\bpush\\s+\\{([^}]+)\\}',line)\n if push:block['assemblyStack']+=4*len(push[1].split(','))\n allocation=re.search(r'\\bsub\\s+sp,\\s*#(\\d+)',line)\n if allocation:block['assemblyStack']+=int(allocation[1])\n if re.search(r'\\bsub\\s+sp,\\s*r',line):issues.append(function+': register-sized stack allocation')\n# Closed target callback assignments are in motor_main/stm32_{adc,i2c,safe_gpio}.\n# Over-approximate every reachable callback within its production owner family.\nfor name,block in functions.items():\n if not block['indirect']:continue\n origin=' '.join(origins.get(name,[]))\n if 'stusb4500' in origin or name in ['hold_reset','late','read_checked','write_checked']:\n targets={'read_transfer','write_transfer','bus_time','motor_gpio_inhibit','motor_time_us'}\n elif 'motor_owner' in origin:targets={'read_transfer','write_transfer','bus_time','interrupt_pending','enter_critical','leave_critical'}\n elif 'stm32_safe_gpio' in origin:targets={'target_bsrr'}\n elif 'stm32_adc' in origin or 'stm32_i2c' in origin:targets={'target_write','motor_time_us'}\n else:issues.append(name+': indirect target family unresolved');targets=set()\n for target in targets:\n if target not in functions:issues.append(name+': missing callback '+target)\n block['calls'].update(targets)\nfor name,block in functions.items():\n block['frame']=frames.get(name,block['assemblyStack'])\n block['origin']=sorted(origins.get(name,[])) or ['linked assembly conservative push/allocation sum']\ndef bound(name,path):\n if name in path:raise RuntimeError('Recursive call graph: '+' -\u003e '.join(path+[name]))\n if name not in functions:raise RuntimeError('Unresolved call target '+name)\n block=functions[name];children=[bound(child,path+[name])for child in block['calls']]\n longest=max(children,key=lambda item:item['bytes'],default={'bytes':0,'path':[]})\n return {'bytes':block['frame']+longest['bytes'],'path':[name]+longest['path']}\ntry:\n main=bound('motor_main',[]);exti=bound('EXTI4_15_IRQHandler',[]);timer=bound('TIM3_IRQHandler',[])\n # Cortex-M exception frames8 words each +up to4-byte alignment, EXTI can be\n # interrupted by higher-priority TIM3. No floating-point hardware state.\n combined=main['bytes']+exti['bytes']+timer['bytes']+2*(32+4)\n if combined\u003e2048:issues.append('Bound exceeds reserved2KiB stack')\nexcept RuntimeError as error:\n issues.append(str(error));main=exti=timer=None;combined=None\nreport={'revision':'A22','elfSha256':hashlib.sha256(ELF.read_bytes()).hexdigest(),'method':'compiler static frames/direct and closed indirect call paths; linked library assembly conservative allocation sum','foreground':main,'exti':exti,'timer':timer,'combinedUpperScreenBytes':combined,'reservedBytes':2048,'issues':issues,'functions':{name:{**block,'calls':sorted(block['calls'])}for name,block in functions.items()},'limitations':['Callbacks must remain the closed production target set; configuration changes require reanalysis','Static screen is not stack high-water evidence on a physical MCU','Latency/watchdog/interrupt-masking duration still require target captures']}\n(ROOT/'evidence/firmware-stack-screen-A22.json').write_text(json.dumps(report,indent=2)+'\\n')\nprint(json.dumps({k:report[k]for k in ['foreground','exti','timer','combinedUpperScreenBytes','reservedBytes','issues']},indent=2))\nif issues:raise SystemExit(1)\n","content_mimetype":"application/octet-stream","created_at":"2026-10-05T10:14:06.711Z"}; window.SSR_PACKAGE_RELEASES = [{"package_release_id":"4e38bd4f-9d6c-4000-ac79-dfd5b9ac116d","package_id":"abd21ef2-d536-4123-aeef-4364fd8829f8","version":"0.0.1-a48-cloud-pipeline9-unrouted-c41d79a-305b1e7a","github_commit_sha":null,"is_locked":false,"is_latest":true,"ready_to_build":true,"is_pr_preview":false,"created_at":"2026-10-05T10:09:38.126Z","circuit_json_build_error":null,"circuit_json_build_error_last_updated_at":null,"has_transpiled":false,"transpilation_error":null,"transpilation_logs":null,"transpilation_in_progress":false,"transpilation_started_at":null,"transpilation_completed_at":null,"transpilation_is_stale":false,"transpilation_display_status":"pending","fs_sha":"md5-adf8e81e45b7617ba3e4096a3295fe65","circuit_json_build_logs":null,"circuit_json_build_in_progress":false,"circuit_json_build_started_at":null,"circuit_json_build_completed_at":null,"circuit_json_build_is_stale":false,"circuit_json_build_display_status":"pending","image_generation_error":null,"image_generation_error_last_updated_at":null,"image_generation_logs":null,"image_generation_in_progress":false,"image_generation_started_at":null,"image_generation_completed_at":null,"image_generation_is_stale":false,"image_generation_display_status":"pending","pcb_preview_image_url":"https://api.tscircuit.com/package_files/view?package_release_id=4e38bd4f-9d6c-4000-ac79-dfd5b9ac116d\u0026file_path=dist%2Findex%2Fpcb.svg","sch_preview_image_url":"https://api.tscircuit.com/package_files/view?package_release_id=4e38bd4f-9d6c-4000-ac79-dfd5b9ac116d\u0026file_path=dist%2Findex%2Fschematic.svg","cad_preview_image_url":"https://api.tscircuit.com/package_files/view?package_release_id=4e38bd4f-9d6c-4000-ac79-dfd5b9ac116d\u0026file_path=dist%2Findex%2F3d.png","package_release_website_url":null,"display_status":"pending","latest_package_build_id":"46f74e9f-af97-4c05-95f4-6c508aeab4a9","user_code_job_started_at":"2026-10-05T10:16:29.788Z","user_code_job_completed_at":"2026-10-05T10:31:46.471Z","user_code_job_error":null,"user_code_job_completed_logs":null,"user_code_job_log_stream_url":"https://usercode.tscircuit.com/user_code_jobs/view_log_stream?user_code_job_id=bba5097baa7333bd7409739fd624c9bbc6f7723e52cb57116c54ac16065d9f0b","ai_review_requested":false,"github_pr_number":null,"github_pr_title":null,"github_branch_name":null},{"package_release_id":"4db220c2-32aa-472e-8d24-06956e27586c","package_id":"abd21ef2-d536-4123-aeef-4364fd8829f8","version":"0.0.1-a45-48v-usb-unrouted-7a869ef-04bbbc95","github_commit_sha":null,"is_locked":false,"is_latest":false,"ready_to_build":true,"is_pr_preview":false,"created_at":"2026-10-05T08:33:49.623Z","circuit_json_build_error":null,"circuit_json_build_error_last_updated_at":null,"has_transpiled":false,"transpilation_error":null,"transpilation_logs":null,"transpilation_in_progress":false,"transpilation_started_at":null,"transpilation_completed_at":null,"transpilation_is_stale":false,"transpilation_display_status":"pending","fs_sha":"md5-323e4f1d80245846c5939c2354b5d386","circuit_json_build_logs":null,"circuit_json_build_in_progress":false,"circuit_json_build_started_at":null,"circuit_json_build_completed_at":null,"circuit_json_build_is_stale":false,"circuit_json_build_display_status":"pending","image_generation_error":null,"image_generation_error_last_updated_at":null,"image_generation_logs":null,"image_generation_in_progress":false,"image_generation_started_at":null,"image_generation_completed_at":null,"image_generation_is_stale":false,"image_generation_display_status":"pending","pcb_preview_image_url":"https://api.tscircuit.com/package_files/view?package_release_id=4db220c2-32aa-472e-8d24-06956e27586c\u0026file_path=dist%2Findex%2Fpcb.svg","sch_preview_image_url":"https://api.tscircuit.com/package_files/view?package_release_id=4db220c2-32aa-472e-8d24-06956e27586c\u0026file_path=dist%2Findex%2Fschematic.svg","cad_preview_image_url":"https://api.tscircuit.com/package_files/view?package_release_id=4db220c2-32aa-472e-8d24-06956e27586c\u0026file_path=dist%2Findex%2F3d.png","package_release_website_url":null,"display_status":"pending","latest_package_build_id":"be6d0414-827b-432b-b287-e3c1fe3a94ad","user_code_job_started_at":"2026-10-05T08:37:59.730Z","user_code_job_completed_at":"2026-10-05T08:53:07.661Z","user_code_job_error":null,"user_code_job_completed_logs":null,"user_code_job_log_stream_url":"https://usercode.tscircuit.com/user_code_jobs/view_log_stream?user_code_job_id=cfe208863c9b8f58c9feb6570e56fce538fd4d2ae67cb68d0f7780984143b00c","ai_review_requested":false,"github_pr_number":null,"github_pr_title":null,"github_branch_name":null},{"package_release_id":"22afe2b1-44d4-4057-b4d6-4897d53f8f72","package_id":"abd21ef2-d536-4123-aeef-4364fd8829f8","version":"0.0.1-a44-pad-adjusted-unrouted-9ebf605-d109812e","github_commit_sha":null,"is_locked":false,"is_latest":false,"ready_to_build":true,"is_pr_preview":false,"created_at":"2026-10-04T21:46:37.163Z","circuit_json_build_error":null,"circuit_json_build_error_last_updated_at":null,"has_transpiled":false,"transpilation_error":null,"transpilation_logs":null,"transpilation_in_progress":false,"transpilation_started_at":null,"transpilation_completed_at":null,"transpilation_is_stale":false,"transpilation_display_status":"pending","fs_sha":"md5-918f16a4857576750fa9170a51e0d751","circuit_json_build_logs":null,"circuit_json_build_in_progress":false,"circuit_json_build_started_at":null,"circuit_json_build_completed_at":null,"circuit_json_build_is_stale":false,"circuit_json_build_display_status":"pending","image_generation_error":null,"image_generation_error_last_updated_at":null,"image_generation_logs":null,"image_generation_in_progress":false,"image_generation_started_at":null,"image_generation_completed_at":null,"image_generation_is_stale":false,"image_generation_display_status":"pending","pcb_preview_image_url":"https://api.tscircuit.com/package_files/view?package_release_id=22afe2b1-44d4-4057-b4d6-4897d53f8f72\u0026file_path=dist%2Findex%2Fpcb.svg","sch_preview_image_url":"https://api.tscircuit.com/package_files/view?package_release_id=22afe2b1-44d4-4057-b4d6-4897d53f8f72\u0026file_path=dist%2Findex%2Fschematic.svg","cad_preview_image_url":"https://api.tscircuit.com/package_files/view?package_release_id=22afe2b1-44d4-4057-b4d6-4897d53f8f72\u0026file_path=dist%2Findex%2F3d.png","package_release_website_url":null,"display_status":"pending","latest_package_build_id":"df1139ca-8bf5-4036-b3b3-281f519406dd","user_code_job_started_at":"2026-10-04T21:50:31.861Z","user_code_job_completed_at":"2026-10-04T22:07:15.270Z","user_code_job_error":null,"user_code_job_completed_logs":null,"user_code_job_log_stream_url":"https://usercode.tscircuit.com/user_code_jobs/view_log_stream?user_code_job_id=8bafe839570283a9d3268add713468a516064274a7a8393e62ebfd4c9a74c252","ai_review_requested":false,"github_pr_number":null,"github_pr_title":null,"github_branch_name":null},{"package_release_id":"5eed5dba-eb97-4174-946f-7127b85db9e3","package_id":"abd21ef2-d536-4123-aeef-4364fd8829f8","version":"0.0.1-a43-unrouted-1c22640-9fcc6e41","github_commit_sha":null,"is_locked":false,"is_latest":false,"ready_to_build":true,"is_pr_preview":false,"created_at":"2026-10-04T20:25:28.120Z","circuit_json_build_error":null,"circuit_json_build_error_last_updated_at":null,"has_transpiled":false,"transpilation_error":null,"transpilation_logs":null,"transpilation_in_progress":false,"transpilation_started_at":null,"transpilation_completed_at":null,"transpilation_is_stale":false,"transpilation_display_status":"pending","fs_sha":"md5-f52c4c0ba14a2aaa562deb53b042ff6c","circuit_json_build_logs":null,"circuit_json_build_in_progress":false,"circuit_json_build_started_at":null,"circuit_json_build_completed_at":null,"circuit_json_build_is_stale":false,"circuit_json_build_display_status":"pending","image_generation_error":null,"image_generation_error_last_updated_at":null,"image_generation_logs":null,"image_generation_in_progress":false,"image_generation_started_at":null,"image_generation_completed_at":null,"image_generation_is_stale":false,"image_generation_display_status":"pending","pcb_preview_image_url":"https://api.tscircuit.com/package_files/view?package_release_id=5eed5dba-eb97-4174-946f-7127b85db9e3\u0026file_path=dist%2Findex%2Fpcb.svg","sch_preview_image_url":"https://api.tscircuit.com/package_files/view?package_release_id=5eed5dba-eb97-4174-946f-7127b85db9e3\u0026file_path=dist%2Findex%2Fschematic.svg","cad_preview_image_url":"https://api.tscircuit.com/package_files/view?package_release_id=5eed5dba-eb97-4174-946f-7127b85db9e3\u0026file_path=dist%2Findex%2F3d.png","package_release_website_url":null,"display_status":"pending","latest_package_build_id":"1646d2eb-91f4-481a-ba44-ea708d1fdab4","user_code_job_started_at":"2026-10-04T20:28:49.307Z","user_code_job_completed_at":"2026-10-04T20:45:40.491Z","user_code_job_error":null,"user_code_job_completed_logs":null,"user_code_job_log_stream_url":"https://usercode.tscircuit.com/user_code_jobs/view_log_stream?user_code_job_id=14a71938c4ed74834206f9653b8e0b2eec727266fd8c368d7e3451e800e2e179","ai_review_requested":false,"github_pr_number":null,"github_pr_title":null,"github_branch_name":null},{"package_release_id":"4e483d3d-e2df-41b6-916b-1a40f3e88574","package_id":"abd21ef2-d536-4123-aeef-4364fd8829f8","version":"0.0.1-a42-unrouted-3ce8ea0-59889506","github_commit_sha":null,"is_locked":false,"is_latest":false,"ready_to_build":true,"is_pr_preview":false,"created_at":"2026-10-04T17:45:30.871Z","circuit_json_build_error":null,"circuit_json_build_error_last_updated_at":null,"has_transpiled":false,"transpilation_error":null,"transpilation_logs":null,"transpilation_in_progress":false,"transpilation_started_at":null,"transpilation_completed_at":null,"transpilation_is_stale":false,"transpilation_display_status":"pending","fs_sha":"md5-0d1ff3fabb183d514a861a9c105adb20","circuit_json_build_logs":null,"circuit_json_build_in_progress":false,"circuit_json_build_started_at":null,"circuit_json_build_completed_at":null,"circuit_json_build_is_stale":false,"circuit_json_build_display_status":"pending","image_generation_error":null,"image_generation_error_last_updated_at":null,"image_generation_logs":null,"image_generation_in_progress":false,"image_generation_started_at":null,"image_generation_completed_at":null,"image_generation_is_stale":false,"image_generation_display_status":"pending","pcb_preview_image_url":"https://api.tscircuit.com/package_files/view?package_release_id=4e483d3d-e2df-41b6-916b-1a40f3e88574\u0026file_path=dist%2Findex%2Fpcb.svg","sch_preview_image_url":"https://api.tscircuit.com/package_files/view?package_release_id=4e483d3d-e2df-41b6-916b-1a40f3e88574\u0026file_path=dist%2Findex%2Fschematic.svg","cad_preview_image_url":"https://api.tscircuit.com/package_files/view?package_release_id=4e483d3d-e2df-41b6-916b-1a40f3e88574\u0026file_path=dist%2Findex%2F3d.png","package_release_website_url":null,"display_status":"pending","latest_package_build_id":"4da92512-7169-4cfd-b06d-f72c1fa8600a","user_code_job_started_at":"2026-10-04T17:49:42.572Z","user_code_job_completed_at":"2026-10-04T18:06:56.266Z","user_code_job_error":null,"user_code_job_completed_logs":null,"user_code_job_log_stream_url":"https://usercode.tscircuit.com/user_code_jobs/view_log_stream?user_code_job_id=3a4032e4b6581a993f46a31e643d85b9ca9ce8dd7a2ccc64666338ccd0de55c7","ai_review_requested":false,"github_pr_number":null,"github_pr_title":null,"github_branch_name":null},{"package_release_id":"e7fd171d-75fe-4f73-a02b-e299d615a5c0","package_id":"abd21ef2-d536-4123-aeef-4364fd8829f8","version":"0.0.1-a42-unrouted-ebc76f4-3eeb7168","github_commit_sha":null,"is_locked":false,"is_latest":false,"ready_to_build":false,"is_pr_preview":false,"created_at":"2026-10-04T17:31:10.869Z","circuit_json_build_error":null,"circuit_json_build_error_last_updated_at":null,"has_transpiled":false,"transpilation_error":null,"transpilation_logs":null,"transpilation_in_progress":false,"transpilation_started_at":null,"transpilation_completed_at":null,"transpilation_is_stale":false,"transpilation_display_status":"pending","fs_sha":"md5-404ed111cb6dd2ed5fff3b2b7475a49f","circuit_json_build_logs":null,"circuit_json_build_in_progress":false,"circuit_json_build_started_at":null,"circuit_json_build_completed_at":null,"circuit_json_build_is_stale":false,"circuit_json_build_display_status":"pending","image_generation_error":null,"image_generation_error_last_updated_at":null,"image_generation_logs":null,"image_generation_in_progress":false,"image_generation_started_at":null,"image_generation_completed_at":null,"image_generation_is_stale":false,"image_generation_display_status":"pending","pcb_preview_image_url":null,"sch_preview_image_url":null,"cad_preview_image_url":null,"package_release_website_url":null,"display_status":"pending","latest_package_build_id":null,"user_code_job_started_at":null,"user_code_job_completed_at":null,"user_code_job_error":null,"user_code_job_completed_logs":null,"user_code_job_log_stream_url":null,"ai_review_requested":false,"github_pr_number":null,"github_pr_title":null,"github_branch_name":null},{"package_release_id":"f00b4bc0-8aae-4eee-b5f4-47d999e7efd5","package_id":"abd21ef2-d536-4123-aeef-4364fd8829f8","version":"0.0.1-a40-native-phase-69ff9a9-98b3939f","github_commit_sha":null,"is_locked":false,"is_latest":false,"ready_to_build":false,"is_pr_preview":false,"created_at":"2026-10-04T14:59:38.630Z","circuit_json_build_error":null,"circuit_json_build_error_last_updated_at":null,"has_transpiled":false,"transpilation_error":null,"transpilation_logs":null,"transpilation_in_progress":false,"transpilation_started_at":null,"transpilation_completed_at":null,"transpilation_is_stale":false,"transpilation_display_status":"pending","fs_sha":"md5-1824828a47c4949db84d0ffb1a1acfbb","circuit_json_build_logs":null,"circuit_json_build_in_progress":false,"circuit_json_build_started_at":null,"circuit_json_build_completed_at":null,"circuit_json_build_is_stale":false,"circuit_json_build_display_status":"pending","image_generation_error":null,"image_generation_error_last_updated_at":null,"image_generation_logs":null,"image_generation_in_progress":false,"image_generation_started_at":null,"image_generation_completed_at":null,"image_generation_is_stale":false,"image_generation_display_status":"pending","pcb_preview_image_url":null,"sch_preview_image_url":null,"cad_preview_image_url":null,"package_release_website_url":null,"display_status":"pending","latest_package_build_id":null,"user_code_job_started_at":null,"user_code_job_completed_at":null,"user_code_job_error":null,"user_code_job_completed_logs":null,"user_code_job_log_stream_url":null,"ai_review_requested":false,"github_pr_number":null,"github_pr_title":null,"github_branch_name":null},{"package_release_id":"b16a82f9-da44-4ef3-b19e-80df9b24b2ce","package_id":"abd21ef2-d536-4123-aeef-4364fd8829f8","version":"0.0.1-a22-layout31-73ab2a5-c6b58e71","github_commit_sha":null,"is_locked":false,"is_latest":false,"ready_to_build":false,"is_pr_preview":false,"created_at":"2026-10-04T11:15:50.818Z","circuit_json_build_error":null,"circuit_json_build_error_last_updated_at":null,"has_transpiled":false,"transpilation_error":null,"transpilation_logs":null,"transpilation_in_progress":false,"transpilation_started_at":null,"transpilation_completed_at":null,"transpilation_is_stale":false,"transpilation_display_status":"pending","fs_sha":"md5-2f98dc145ff0a71a42262f4eaf738e26","circuit_json_build_logs":null,"circuit_json_build_in_progress":false,"circuit_json_build_started_at":null,"circuit_json_build_completed_at":null,"circuit_json_build_is_stale":false,"circuit_json_build_display_status":"pending","image_generation_error":null,"image_generation_error_last_updated_at":null,"image_generation_logs":null,"image_generation_in_progress":false,"image_generation_started_at":null,"image_generation_completed_at":null,"image_generation_is_stale":false,"image_generation_display_status":"pending","pcb_preview_image_url":null,"sch_preview_image_url":null,"cad_preview_image_url":null,"package_release_website_url":null,"display_status":"pending","latest_package_build_id":null,"user_code_job_started_at":null,"user_code_job_completed_at":null,"user_code_job_error":null,"user_code_job_completed_logs":null,"user_code_job_log_stream_url":null,"ai_review_requested":false,"github_pr_number":null,"github_pr_title":null,"github_branch_name":null},{"package_release_id":"b68aa7ed-7253-4d89-9fe6-cf7abdb8fcd2","package_id":"abd21ef2-d536-4123-aeef-4364fd8829f8","version":"0.0.1-a22-adc-source-5a015d5-verified-ffe2435d","github_commit_sha":null,"is_locked":false,"is_latest":false,"ready_to_build":true,"is_pr_preview":false,"created_at":"2026-10-04T10:30:01.423Z","circuit_json_build_error":null,"circuit_json_build_error_last_updated_at":null,"has_transpiled":false,"transpilation_error":null,"transpilation_logs":null,"transpilation_in_progress":false,"transpilation_started_at":null,"transpilation_completed_at":null,"transpilation_is_stale":false,"transpilation_display_status":"pending","fs_sha":"md5-79a066e5662c734afe342e6c16d46647","circuit_json_build_logs":null,"circuit_json_build_in_progress":false,"circuit_json_build_started_at":null,"circuit_json_build_completed_at":null,"circuit_json_build_is_stale":false,"circuit_json_build_display_status":"pending","image_generation_error":null,"image_generation_error_last_updated_at":null,"image_generation_logs":null,"image_generation_in_progress":false,"image_generation_started_at":null,"image_generation_completed_at":null,"image_generation_is_stale":false,"image_generation_display_status":"pending","pcb_preview_image_url":"https://api.tscircuit.com/package_files/view?package_release_id=b68aa7ed-7253-4d89-9fe6-cf7abdb8fcd2\u0026file_path=dist%2Findex%2Fpcb.svg","sch_preview_image_url":"https://api.tscircuit.com/package_files/view?package_release_id=b68aa7ed-7253-4d89-9fe6-cf7abdb8fcd2\u0026file_path=dist%2Findex%2Fschematic.svg","cad_preview_image_url":"https://api.tscircuit.com/package_files/view?package_release_id=b68aa7ed-7253-4d89-9fe6-cf7abdb8fcd2\u0026file_path=dist%2Findex%2F3d.png","package_release_website_url":null,"display_status":"pending","latest_package_build_id":"2e6a450d-64cc-4ec4-9dbd-f1ab032d1646","user_code_job_started_at":"2026-10-04T10:39:38.241Z","user_code_job_completed_at":"2026-10-04T10:54:05.347Z","user_code_job_error":null,"user_code_job_completed_logs":null,"user_code_job_log_stream_url":"https://usercode.tscircuit.com/user_code_jobs/view_log_stream?user_code_job_id=a89d6180ca26b402a935a2dca8ef9217b1977ad466de447a4a50cd179fff0e97","ai_review_requested":false,"github_pr_number":null,"github_pr_title":null,"github_branch_name":null},{"package_release_id":"73c0a7fb-aae1-4779-88f8-c62b2683177a","package_id":"abd21ef2-d536-4123-aeef-4364fd8829f8","version":"0.0.2-a22-adc-escapes-5a015d5","github_commit_sha":null,"is_locked":false,"is_latest":false,"ready_to_build":true,"is_pr_preview":false,"created_at":"2026-10-04T10:13:45.576Z","circuit_json_build_error":null,"circuit_json_build_error_last_updated_at":null,"has_transpiled":false,"transpilation_error":null,"transpilation_logs":null,"transpilation_in_progress":false,"transpilation_started_at":null,"transpilation_completed_at":null,"transpilation_is_stale":false,"transpilation_display_status":"pending","fs_sha":"md5-cd36ea0c9c064b809c5d895719b69f47","circuit_json_build_logs":null,"circuit_json_build_in_progress":false,"circuit_json_build_started_at":null,"circuit_json_build_completed_at":null,"circuit_json_build_is_stale":false,"circuit_json_build_display_status":"pending","image_generation_error":null,"image_generation_error_last_updated_at":null,"image_generation_logs":null,"image_generation_in_progress":false,"image_generation_started_at":null,"image_generation_completed_at":null,"image_generation_is_stale":false,"image_generation_display_status":"pending","pcb_preview_image_url":null,"sch_preview_image_url":null,"cad_preview_image_url":null,"package_release_website_url":null,"display_status":"pending","latest_package_build_id":"6099bad6-bf8e-4b41-8195-5a1dd58d15c0","user_code_job_started_at":"2026-10-04T10:24:54.521Z","user_code_job_completed_at":"2026-10-04T10:40:03.746Z","user_code_job_error":{"message":"Your code failed to build (exit code 1), see build logs for the error details","error_code":"user_code_build_error"},"user_code_job_completed_logs":null,"user_code_job_log_stream_url":"https://usercode.tscircuit.com/user_code_jobs/view_log_stream?user_code_job_id=157f45779318614963554e0d99e057b9286cb2c16f66053e928e98e2c980e7d8","ai_review_requested":false,"github_pr_number":null,"github_pr_title":null,"github_branch_name":null},{"package_release_id":"bd4384eb-5f90-4ff2-aa11-bc8d856019e0","package_id":"abd21ef2-d536-4123-aeef-4364fd8829f8","version":"0.0.1-a22-adc-escapes-5a015d5","github_commit_sha":null,"is_locked":false,"is_latest":false,"ready_to_build":false,"is_pr_preview":false,"created_at":"2026-10-04T10:03:52.420Z","circuit_json_build_error":null,"circuit_json_build_error_last_updated_at":null,"has_transpiled":false,"transpilation_error":null,"transpilation_logs":null,"transpilation_in_progress":false,"transpilation_started_at":null,"transpilation_completed_at":null,"transpilation_is_stale":false,"transpilation_display_status":"pending","fs_sha":"md5-ffc09a95a3160fb8a5d0018c4cd580e0","circuit_json_build_logs":null,"circuit_json_build_in_progress":false,"circuit_json_build_started_at":null,"circuit_json_build_completed_at":null,"circuit_json_build_is_stale":false,"circuit_json_build_display_status":"pending","image_generation_error":null,"image_generation_error_last_updated_at":null,"image_generation_logs":null,"image_generation_in_progress":false,"image_generation_started_at":null,"image_generation_completed_at":null,"image_generation_is_stale":false,"image_generation_display_status":"pending","pcb_preview_image_url":null,"sch_preview_image_url":null,"cad_preview_image_url":null,"package_release_website_url":null,"display_status":"pending","latest_package_build_id":null,"user_code_job_started_at":null,"user_code_job_completed_at":null,"user_code_job_error":null,"user_code_job_completed_logs":null,"user_code_job_log_stream_url":null,"ai_review_requested":false,"github_pr_number":null,"github_pr_title":null,"github_branch_name":null},{"package_release_id":"a4bc1819-1324-47af-b2d5-dfd5dc9e50e5","package_id":"abd21ef2-d536-4123-aeef-4364fd8829f8","version":"0.0.1-a22-cc-isolation-d734c6f","github_commit_sha":null,"is_locked":false,"is_latest":false,"ready_to_build":true,"is_pr_preview":false,"created_at":"2026-10-04T09:43:50.248Z","circuit_json_build_error":null,"circuit_json_build_error_last_updated_at":null,"has_transpiled":false,"transpilation_error":null,"transpilation_logs":null,"transpilation_in_progress":false,"transpilation_started_at":null,"transpilation_completed_at":null,"transpilation_is_stale":false,"transpilation_display_status":"pending","fs_sha":"md5-5e3c5f2e52ee2ee2ac34e27c537bc6d9","circuit_json_build_logs":null,"circuit_json_build_in_progress":false,"circuit_json_build_started_at":null,"circuit_json_build_completed_at":null,"circuit_json_build_is_stale":false,"circuit_json_build_display_status":"pending","image_generation_error":null,"image_generation_error_last_updated_at":null,"image_generation_logs":null,"image_generation_in_progress":false,"image_generation_started_at":null,"image_generation_completed_at":null,"image_generation_is_stale":false,"image_generation_display_status":"pending","pcb_preview_image_url":"https://api.tscircuit.com/package_files/view?package_release_id=a4bc1819-1324-47af-b2d5-dfd5dc9e50e5\u0026file_path=dist%2Findex%2Fpcb.svg","sch_preview_image_url":"https://api.tscircuit.com/package_files/view?package_release_id=a4bc1819-1324-47af-b2d5-dfd5dc9e50e5\u0026file_path=dist%2Findex%2Fschematic.svg","cad_preview_image_url":"https://api.tscircuit.com/package_files/view?package_release_id=a4bc1819-1324-47af-b2d5-dfd5dc9e50e5\u0026file_path=dist%2Findex%2F3d.png","package_release_website_url":null,"display_status":"pending","latest_package_build_id":"3d43f479-c4ec-426f-9d05-80e0a56e2e0c","user_code_job_started_at":"2026-10-04T09:48:30.947Z","user_code_job_completed_at":"2026-10-04T10:01:29.769Z","user_code_job_error":null,"user_code_job_completed_logs":null,"user_code_job_log_stream_url":"https://usercode.tscircuit.com/user_code_jobs/view_log_stream?user_code_job_id=19827f8e5655953b77a3b8ef72b86bfd541569ea73437ab93593905ef74f686d","ai_review_requested":false,"github_pr_number":null,"github_pr_title":null,"github_branch_name":null},{"package_release_id":"52c098da-0cbd-4c56-a0bd-5b8d3fbebfb9","package_id":"abd21ef2-d536-4123-aeef-4364fd8829f8","version":"0.0.1-0.0.1-a22-breakouts21-52f7feb","github_commit_sha":null,"is_locked":false,"is_latest":false,"ready_to_build":true,"is_pr_preview":false,"created_at":"2026-10-04T08:57:04.574Z","circuit_json_build_error":null,"circuit_json_build_error_last_updated_at":null,"has_transpiled":false,"transpilation_error":null,"transpilation_logs":null,"transpilation_in_progress":false,"transpilation_started_at":null,"transpilation_completed_at":null,"transpilation_is_stale":false,"transpilation_display_status":"pending","fs_sha":"md5-cbd545f398e7ee46c10c82f8eb457da8","circuit_json_build_logs":null,"circuit_json_build_in_progress":false,"circuit_json_build_started_at":null,"circuit_json_build_completed_at":null,"circuit_json_build_is_stale":false,"circuit_json_build_display_status":"pending","image_generation_error":null,"image_generation_error_last_updated_at":null,"image_generation_logs":null,"image_generation_in_progress":false,"image_generation_started_at":null,"image_generation_completed_at":null,"image_generation_is_stale":false,"image_generation_display_status":"pending","pcb_preview_image_url":"https://api.tscircuit.com/package_files/view?package_release_id=52c098da-0cbd-4c56-a0bd-5b8d3fbebfb9\u0026file_path=dist%2Findex%2Fpcb.svg","sch_preview_image_url":"https://api.tscircuit.com/package_files/view?package_release_id=52c098da-0cbd-4c56-a0bd-5b8d3fbebfb9\u0026file_path=dist%2Findex%2Fschematic.svg","cad_preview_image_url":"https://api.tscircuit.com/package_files/view?package_release_id=52c098da-0cbd-4c56-a0bd-5b8d3fbebfb9\u0026file_path=dist%2Findex%2F3d.png","package_release_website_url":null,"display_status":"pending","latest_package_build_id":"efd8eb50-3cf1-4eaf-a472-4f2363713a92","user_code_job_started_at":"2026-10-04T09:01:08.548Z","user_code_job_completed_at":"2026-10-04T09:12:29.698Z","user_code_job_error":null,"user_code_job_completed_logs":null,"user_code_job_log_stream_url":"https://usercode.tscircuit.com/user_code_jobs/view_log_stream?user_code_job_id=e43c1ec9a34fd9d4b9c6b272fca565b4fe1c4a75d7cff5692709b74ac1595997","ai_review_requested":false,"github_pr_number":null,"github_pr_title":null,"github_branch_name":null},{"package_release_id":"e4ce612a-5a77-4590-b66d-861b4a080176","package_id":"abd21ef2-d536-4123-aeef-4364fd8829f8","version":"0.0.1-a22-placement16-350f03c","github_commit_sha":null,"is_locked":false,"is_latest":false,"ready_to_build":true,"is_pr_preview":false,"created_at":"2026-10-04T08:05:48.151Z","circuit_json_build_error":null,"circuit_json_build_error_last_updated_at":null,"has_transpiled":false,"transpilation_error":null,"transpilation_logs":null,"transpilation_in_progress":false,"transpilation_started_at":null,"transpilation_completed_at":null,"transpilation_is_stale":false,"transpilation_display_status":"pending","fs_sha":"md5-40b6a9774ab2de8c418ad2d0f0294060","circuit_json_build_logs":null,"circuit_json_build_in_progress":false,"circuit_json_build_started_at":null,"circuit_json_build_completed_at":null,"circuit_json_build_is_stale":false,"circuit_json_build_display_status":"pending","image_generation_error":null,"image_generation_error_last_updated_at":null,"image_generation_logs":null,"image_generation_in_progress":false,"image_generation_started_at":null,"image_generation_completed_at":null,"image_generation_is_stale":false,"image_generation_display_status":"pending","pcb_preview_image_url":"https://api.tscircuit.com/package_files/view?package_release_id=e4ce612a-5a77-4590-b66d-861b4a080176\u0026file_path=dist%2Findex%2Fpcb.svg","sch_preview_image_url":"https://api.tscircuit.com/package_files/view?package_release_id=e4ce612a-5a77-4590-b66d-861b4a080176\u0026file_path=dist%2Findex%2Fschematic.svg","cad_preview_image_url":"https://api.tscircuit.com/package_files/view?package_release_id=e4ce612a-5a77-4590-b66d-861b4a080176\u0026file_path=dist%2Findex%2F3d.png","package_release_website_url":null,"display_status":"pending","latest_package_build_id":"38ea29b1-f156-4f2c-bc2d-c136c475ebb7","user_code_job_started_at":"2026-10-04T08:09:02.088Z","user_code_job_completed_at":"2026-10-04T08:19:51.889Z","user_code_job_error":null,"user_code_job_completed_logs":null,"user_code_job_log_stream_url":"https://usercode.tscircuit.com/user_code_jobs/view_log_stream?user_code_job_id=2a0d725ca0c78ef7a701ff13c39c4c99d3ec595e13ec3d8490b5459bc53f6a0f","ai_review_requested":false,"github_pr_number":null,"github_pr_title":null,"github_branch_name":null},{"package_release_id":"f0108446-2c12-4edf-95fa-125acbdb61e8","package_id":"abd21ef2-d536-4123-aeef-4364fd8829f8","version":"0.0.1-a22-rotation-d78470b-compressed","github_commit_sha":null,"is_locked":false,"is_latest":false,"ready_to_build":true,"is_pr_preview":false,"created_at":"2026-10-04T07:55:46.381Z","circuit_json_build_error":null,"circuit_json_build_error_last_updated_at":null,"has_transpiled":false,"transpilation_error":null,"transpilation_logs":null,"transpilation_in_progress":false,"transpilation_started_at":null,"transpilation_completed_at":null,"transpilation_is_stale":false,"transpilation_display_status":"pending","fs_sha":"md5-bc1202f3cd269737531ba81fa52f3860","circuit_json_build_logs":null,"circuit_json_build_in_progress":false,"circuit_json_build_started_at":null,"circuit_json_build_completed_at":null,"circuit_json_build_is_stale":false,"circuit_json_build_display_status":"pending","image_generation_error":null,"image_generation_error_last_updated_at":null,"image_generation_logs":null,"image_generation_in_progress":false,"image_generation_started_at":null,"image_generation_completed_at":null,"image_generation_is_stale":false,"image_generation_display_status":"pending","pcb_preview_image_url":"https://api.tscircuit.com/package_files/view?package_release_id=f0108446-2c12-4edf-95fa-125acbdb61e8\u0026file_path=dist%2Findex%2Fpcb.svg","sch_preview_image_url":"https://api.tscircuit.com/package_files/view?package_release_id=f0108446-2c12-4edf-95fa-125acbdb61e8\u0026file_path=dist%2Findex%2Fschematic.svg","cad_preview_image_url":"https://api.tscircuit.com/package_files/view?package_release_id=f0108446-2c12-4edf-95fa-125acbdb61e8\u0026file_path=dist%2Findex%2F3d.png","package_release_website_url":null,"display_status":"pending","latest_package_build_id":"65295c01-2e4c-4c0f-90cc-efe6f6a15670","user_code_job_started_at":"2026-10-04T07:59:17.274Z","user_code_job_completed_at":"2026-10-04T08:12:08.306Z","user_code_job_error":null,"user_code_job_completed_logs":null,"user_code_job_log_stream_url":"https://usercode.tscircuit.com/user_code_jobs/view_log_stream?user_code_job_id=67ea0e9658f0a6cb901d363d58499c5c442a24f009bbfe05fb73ceb1f3929c14","ai_review_requested":false,"github_pr_number":null,"github_pr_title":null,"github_branch_name":null},{"package_release_id":"8b2f8461-7167-4734-9e4b-93b1ca033374","package_id":"abd21ef2-d536-4123-aeef-4364fd8829f8","version":"0.0.1-a22-rotation-d78470b-source","github_commit_sha":null,"is_locked":false,"is_latest":false,"ready_to_build":false,"is_pr_preview":false,"created_at":"2026-10-04T07:49:20.981Z","circuit_json_build_error":null,"circuit_json_build_error_last_updated_at":null,"has_transpiled":false,"transpilation_error":null,"transpilation_logs":null,"transpilation_in_progress":false,"transpilation_started_at":null,"transpilation_completed_at":null,"transpilation_is_stale":false,"transpilation_display_status":"pending","fs_sha":"md5-60662c127ce15728faf6dbaebcb59c92","circuit_json_build_logs":null,"circuit_json_build_in_progress":false,"circuit_json_build_started_at":null,"circuit_json_build_completed_at":null,"circuit_json_build_is_stale":false,"circuit_json_build_display_status":"pending","image_generation_error":null,"image_generation_error_last_updated_at":null,"image_generation_logs":null,"image_generation_in_progress":false,"image_generation_started_at":null,"image_generation_completed_at":null,"image_generation_is_stale":false,"image_generation_display_status":"pending","pcb_preview_image_url":null,"sch_preview_image_url":null,"cad_preview_image_url":null,"package_release_website_url":null,"display_status":"pending","latest_package_build_id":null,"user_code_job_started_at":null,"user_code_job_completed_at":null,"user_code_job_error":null,"user_code_job_completed_logs":null,"user_code_job_log_stream_url":null,"ai_review_requested":false,"github_pr_number":null,"github_pr_title":null,"github_branch_name":null},{"package_release_id":"dee5e0ab-15b5-4586-a173-85a1e765293f","package_id":"abd21ef2-d536-4123-aeef-4364fd8829f8","version":"0.0.1-a22-router-d8caeec-source","github_commit_sha":null,"is_locked":false,"is_latest":false,"ready_to_build":true,"is_pr_preview":false,"created_at":"2026-10-04T07:44:25.106Z","circuit_json_build_error":null,"circuit_json_build_error_last_updated_at":null,"has_transpiled":false,"transpilation_error":null,"transpilation_logs":null,"transpilation_in_progress":false,"transpilation_started_at":null,"transpilation_completed_at":null,"transpilation_is_stale":false,"transpilation_display_status":"pending","fs_sha":"md5-16901d5a0baebc2139fdce4c95b38391","circuit_json_build_logs":null,"circuit_json_build_in_progress":false,"circuit_json_build_started_at":null,"circuit_json_build_completed_at":null,"circuit_json_build_is_stale":false,"circuit_json_build_display_status":"pending","image_generation_error":null,"image_generation_error_last_updated_at":null,"image_generation_logs":null,"image_generation_in_progress":false,"image_generation_started_at":null,"image_generation_completed_at":null,"image_generation_is_stale":false,"image_generation_display_status":"pending","pcb_preview_image_url":"https://api.tscircuit.com/package_files/view?package_release_id=dee5e0ab-15b5-4586-a173-85a1e765293f\u0026file_path=dist%2Findex%2Fpcb.svg","sch_preview_image_url":"https://api.tscircuit.com/package_files/view?package_release_id=dee5e0ab-15b5-4586-a173-85a1e765293f\u0026file_path=dist%2Findex%2Fschematic.svg","cad_preview_image_url":"https://api.tscircuit.com/package_files/view?package_release_id=dee5e0ab-15b5-4586-a173-85a1e765293f\u0026file_path=dist%2Findex%2F3d.png","package_release_website_url":null,"display_status":"pending","latest_package_build_id":"757dba6c-9d96-454d-a798-f04a73e64a00","user_code_job_started_at":"2026-10-04T07:48:43.005Z","user_code_job_completed_at":"2026-10-04T08:04:38.101Z","user_code_job_error":null,"user_code_job_completed_logs":null,"user_code_job_log_stream_url":"https://usercode.tscircuit.com/user_code_jobs/view_log_stream?user_code_job_id=ac2897b0d90ec76e554a2905285770f85ffaff2c9951fdb6e2f5fcab266f07b5","ai_review_requested":false,"github_pr_number":null,"github_pr_title":null,"github_branch_name":null},{"package_release_id":"ce78a332-3488-4ed9-9109-58878c2ccd86","package_id":"abd21ef2-d536-4123-aeef-4364fd8829f8","version":"0.0.1-a22-router-d8caeec","github_commit_sha":null,"is_locked":false,"is_latest":false,"ready_to_build":false,"is_pr_preview":false,"created_at":"2026-10-04T07:14:34.097Z","circuit_json_build_error":null,"circuit_json_build_error_last_updated_at":null,"has_transpiled":false,"transpilation_error":null,"transpilation_logs":null,"transpilation_in_progress":false,"transpilation_started_at":null,"transpilation_completed_at":null,"transpilation_is_stale":false,"transpilation_display_status":"pending","fs_sha":"md5-582eb815b3d82e656f81c504caa09120","circuit_json_build_logs":null,"circuit_json_build_in_progress":false,"circuit_json_build_started_at":null,"circuit_json_build_completed_at":null,"circuit_json_build_is_stale":false,"circuit_json_build_display_status":"pending","image_generation_error":null,"image_generation_error_last_updated_at":null,"image_generation_logs":null,"image_generation_in_progress":false,"image_generation_started_at":null,"image_generation_completed_at":null,"image_generation_is_stale":false,"image_generation_display_status":"pending","pcb_preview_image_url":null,"sch_preview_image_url":null,"cad_preview_image_url":null,"package_release_website_url":null,"display_status":"pending","latest_package_build_id":null,"user_code_job_started_at":null,"user_code_job_completed_at":null,"user_code_job_error":null,"user_code_job_completed_logs":null,"user_code_job_log_stream_url":null,"ai_review_requested":false,"github_pr_number":null,"github_pr_title":null,"github_branch_name":null},{"package_release_id":"7529f3ee-0996-4dec-b2ce-7f622a56483a","package_id":"abd21ef2-d536-4123-aeef-4364fd8829f8","version":"0.0.1-a22-placement-c265655","github_commit_sha":null,"is_locked":false,"is_latest":false,"ready_to_build":true,"is_pr_preview":false,"created_at":"2026-10-04T03:55:37.331Z","circuit_json_build_error":null,"circuit_json_build_error_last_updated_at":null,"has_transpiled":false,"transpilation_error":null,"transpilation_logs":null,"transpilation_in_progress":false,"transpilation_started_at":null,"transpilation_completed_at":null,"transpilation_is_stale":false,"transpilation_display_status":"pending","fs_sha":"md5-6740e5ddf5db332e91cc47c63171af25","circuit_json_build_logs":null,"circuit_json_build_in_progress":false,"circuit_json_build_started_at":null,"circuit_json_build_completed_at":null,"circuit_json_build_is_stale":false,"circuit_json_build_display_status":"pending","image_generation_error":null,"image_generation_error_last_updated_at":null,"image_generation_logs":null,"image_generation_in_progress":false,"image_generation_started_at":null,"image_generation_completed_at":null,"image_generation_is_stale":false,"image_generation_display_status":"pending","pcb_preview_image_url":"https://api.tscircuit.com/package_files/view?package_release_id=7529f3ee-0996-4dec-b2ce-7f622a56483a\u0026file_path=dist%2Findex%2Fpcb.svg","sch_preview_image_url":"https://api.tscircuit.com/package_files/view?package_release_id=7529f3ee-0996-4dec-b2ce-7f622a56483a\u0026file_path=dist%2Findex%2Fschematic.svg","cad_preview_image_url":"https://api.tscircuit.com/package_files/view?package_release_id=7529f3ee-0996-4dec-b2ce-7f622a56483a\u0026file_path=dist%2Findex%2F3d.png","package_release_website_url":null,"display_status":"pending","latest_package_build_id":"b79d0b1a-9839-4fa8-baff-179353db45b7","user_code_job_started_at":"2026-10-04T03:59:57.010Z","user_code_job_completed_at":"2026-10-04T04:11:22.982Z","user_code_job_error":null,"user_code_job_completed_logs":null,"user_code_job_log_stream_url":"https://usercode.tscircuit.com/user_code_jobs/view_log_stream?user_code_job_id=e113c2219c53d529b3975eed923e80ff172d3ebc8b88cb1ec094708ae08fefed","ai_review_requested":false,"github_pr_number":null,"github_pr_title":null,"github_branch_name":null}]; window.SSR_PACKAGE_BUILDS = []; window.SSR_PACKAGE_ROUTE = {"author":"AnasSarkiz","packageName":"usb-c-pd-brushed-motor","packageNameWithScope":"AnasSarkiz/usb-c-pd-brushed-motor","version":null,"isLegacyRoute":false,"kind":"file","filePath":"scripts/review-firmware-stack.py"};