ldcon 0.2.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (778) hide show
  1. ldcon-0.2.0/.secrets.baseline +358 -0
  2. ldcon-0.2.0/LICENSE +21 -0
  3. ldcon-0.2.0/MANIFEST.in +8 -0
  4. ldcon-0.2.0/PKG-INFO +85 -0
  5. ldcon-0.2.0/README.md +45 -0
  6. ldcon-0.2.0/docs/publishing.html +33 -0
  7. ldcon-0.2.0/package-lock.json +543 -0
  8. ldcon-0.2.0/package.json +1 -0
  9. ldcon-0.2.0/pyproject.toml +55 -0
  10. ldcon-0.2.0/scripts/check_dist.py +28 -0
  11. ldcon-0.2.0/scripts/check_secrets.py +19 -0
  12. ldcon-0.2.0/scripts/check_tag.py +12 -0
  13. ldcon-0.2.0/scripts/install_wheel.py +11 -0
  14. ldcon-0.2.0/setup.cfg +4 -0
  15. ldcon-0.2.0/src/ldcon/__init__.py +302 -0
  16. ldcon-0.2.0/src/ldcon/_moved.py +49 -0
  17. ldcon-0.2.0/src/ldcon/agent_tools.py +4 -0
  18. ldcon-0.2.0/src/ldcon/agents/__init__.py +1 -0
  19. ldcon-0.2.0/src/ldcon/agents/adjustment_guidance.py +73 -0
  20. ldcon-0.2.0/src/ldcon/agents/adjustment_quality.py +399 -0
  21. ldcon-0.2.0/src/ldcon/agents/agent_adapters.py +709 -0
  22. ldcon-0.2.0/src/ldcon/agents/agent_background.py +307 -0
  23. ldcon-0.2.0/src/ldcon/agents/agent_bundle.py +75 -0
  24. ldcon-0.2.0/src/ldcon/agents/agent_cards.py +171 -0
  25. ldcon-0.2.0/src/ldcon/agents/agent_config_access.py +22 -0
  26. ldcon-0.2.0/src/ldcon/agents/agent_configuration.py +224 -0
  27. ldcon-0.2.0/src/ldcon/agents/agent_configuration_policy.py +67 -0
  28. ldcon-0.2.0/src/ldcon/agents/agent_connect.py +93 -0
  29. ldcon-0.2.0/src/ldcon/agents/agent_device_parameters.py +41 -0
  30. ldcon-0.2.0/src/ldcon/agents/agent_execution.py +77 -0
  31. ldcon-0.2.0/src/ldcon/agents/agent_history.py +112 -0
  32. ldcon-0.2.0/src/ldcon/agents/agent_inbox_watch.py +121 -0
  33. ldcon-0.2.0/src/ldcon/agents/agent_interactive.py +386 -0
  34. ldcon-0.2.0/src/ldcon/agents/agent_interactive_hooks.py +381 -0
  35. ldcon-0.2.0/src/ldcon/agents/agent_language.py +48 -0
  36. ldcon-0.2.0/src/ldcon/agents/agent_log_context.py +308 -0
  37. ldcon-0.2.0/src/ldcon/agents/agent_log_read.py +250 -0
  38. ldcon-0.2.0/src/ldcon/agents/agent_log_watch.py +27 -0
  39. ldcon-0.2.0/src/ldcon/agents/agent_metrics.py +111 -0
  40. ldcon-0.2.0/src/ldcon/agents/agent_monitor.py +272 -0
  41. ldcon-0.2.0/src/ldcon/agents/agent_opencode_http.py +270 -0
  42. ldcon-0.2.0/src/ldcon/agents/agent_opencode_mcp.py +64 -0
  43. ldcon-0.2.0/src/ldcon/agents/agent_owner_status.py +216 -0
  44. ldcon-0.2.0/src/ldcon/agents/agent_profiles.py +186 -0
  45. ldcon-0.2.0/src/ldcon/agents/agent_providers.py +53 -0
  46. ldcon-0.2.0/src/ldcon/agents/agent_repairs.py +105 -0
  47. ldcon-0.2.0/src/ldcon/agents/agent_routing.py +90 -0
  48. ldcon-0.2.0/src/ldcon/agents/agent_runtime.py +70 -0
  49. ldcon-0.2.0/src/ldcon/agents/agent_sandbox.py +141 -0
  50. ldcon-0.2.0/src/ldcon/agents/agent_startup_notice.py +142 -0
  51. ldcon-0.2.0/src/ldcon/agents/agent_task.py +336 -0
  52. ldcon-0.2.0/src/ldcon/agents/agent_tools.py +488 -0
  53. ldcon-0.2.0/src/ldcon/agents/agent_window.py +70 -0
  54. ldcon-0.2.0/src/ldcon/agents/agent_workspace.py +340 -0
  55. ldcon-0.2.0/src/ldcon/agents/card_fallback.py +284 -0
  56. ldcon-0.2.0/src/ldcon/agents/dlc_pi_adjustment.py +250 -0
  57. ldcon-0.2.0/src/ldcon/agents/dlc_pi_plan.py +24 -0
  58. ldcon-0.2.0/src/ldcon/agents/dlc_pi_response_plan.py +26 -0
  59. ldcon-0.2.0/src/ldcon/agents/failure_policy.py +473 -0
  60. ldcon-0.2.0/src/ldcon/agents/fallback_service.py +146 -0
  61. ldcon-0.2.0/src/ldcon/agents/fallback_targets.py +96 -0
  62. ldcon-0.2.0/src/ldcon/agents/gateway_role.py +31 -0
  63. ldcon-0.2.0/src/ldcon/agents/manual_adjustment_grant.py +66 -0
  64. ldcon-0.2.0/src/ldcon/agents/measurement_grant.py +95 -0
  65. ldcon-0.2.0/src/ldcon/agents/monitor_quality_binding.py +33 -0
  66. ldcon-0.2.0/src/ldcon/agents/notification_policy.py +346 -0
  67. ldcon-0.2.0/src/ldcon/agents/operating_mode_client.py +99 -0
  68. ldcon-0.2.0/src/ldcon/agents/report_pdf.py +105 -0
  69. ldcon-0.2.0/src/ldcon/agents/resident_adjustment.py +572 -0
  70. ldcon-0.2.0/src/ldcon/agents/resident_agent.py +438 -0
  71. ldcon-0.2.0/src/ldcon/agents/resident_quality_apply.py +233 -0
  72. ldcon-0.2.0/src/ldcon/agents/task_decisions.py +218 -0
  73. ldcon-0.2.0/src/ldcon/agents/teams_card.py +100 -0
  74. ldcon-0.2.0/src/ldcon/agents/teams_destinations.py +157 -0
  75. ldcon-0.2.0/src/ldcon/cld_owner.py +4 -0
  76. ldcon-0.2.0/src/ldcon/cli.py +19 -0
  77. ldcon-0.2.0/src/ldcon/core/__init__.py +1 -0
  78. ldcon-0.2.0/src/ldcon/core/adjustment_plan.py +47 -0
  79. ldcon-0.2.0/src/ldcon/core/adjustment_registry.py +100 -0
  80. ldcon-0.2.0/src/ldcon/core/agent_authority.py +903 -0
  81. ldcon-0.2.0/src/ldcon/core/card_admission.py +15 -0
  82. ldcon-0.2.0/src/ldcon/core/card_definition.py +14 -0
  83. ldcon-0.2.0/src/ldcon/core/card_reporting.py +238 -0
  84. ldcon-0.2.0/src/ldcon/core/configuration.py +357 -0
  85. ldcon-0.2.0/src/ldcon/core/configuration_transaction.py +225 -0
  86. ldcon-0.2.0/src/ldcon/core/contracts.py +86 -0
  87. ldcon-0.2.0/src/ldcon/core/current_settings.py +86 -0
  88. ldcon-0.2.0/src/ldcon/core/deck_yaml.py +45 -0
  89. ldcon-0.2.0/src/ldcon/core/device_conditions.py +133 -0
  90. ldcon-0.2.0/src/ldcon/core/execution_context.py +3 -0
  91. ldcon-0.2.0/src/ldcon/core/instrument_client.py +190 -0
  92. ldcon-0.2.0/src/ldcon/core/interface_cards.py +520 -0
  93. ldcon-0.2.0/src/ldcon/core/interface_schema.py +640 -0
  94. ldcon-0.2.0/src/ldcon/core/laser_assets.py +238 -0
  95. ldcon-0.2.0/src/ldcon/core/metric_quantities.py +38 -0
  96. ldcon-0.2.0/src/ldcon/core/modulation.py +107 -0
  97. ldcon-0.2.0/src/ldcon/core/operation_registry.py +195 -0
  98. ldcon-0.2.0/src/ldcon/core/paths.py +26 -0
  99. ldcon-0.2.0/src/ldcon/core/period_context.py +118 -0
  100. ldcon-0.2.0/src/ldcon/core/records.py +4 -0
  101. ldcon-0.2.0/src/ldcon/core/result_reservations.py +469 -0
  102. ldcon-0.2.0/src/ldcon/core/site_bindings.py +25 -0
  103. ldcon-0.2.0/src/ldcon/core/state_layout.py +70 -0
  104. ldcon-0.2.0/src/ldcon/core/target_policy.py +79 -0
  105. ldcon-0.2.0/src/ldcon/core/telegraf.py +106 -0
  106. ldcon-0.2.0/src/ldcon/core/telemetry.py +130 -0
  107. ldcon-0.2.0/src/ldcon/core/temperature_settings.py +12 -0
  108. ldcon-0.2.0/src/ldcon/dashboard_metrics.py +4 -0
  109. ldcon-0.2.0/src/ldcon/device_registry.py +4 -0
  110. ldcon-0.2.0/src/ldcon/drivers/__init__.py +1 -0
  111. ldcon-0.2.0/src/ldcon/drivers/cld1015.py +296 -0
  112. ldcon-0.2.0/src/ldcon/drivers/cld1015_config.py +31 -0
  113. ldcon-0.2.0/src/ldcon/drivers/dlcpro.py +177 -0
  114. ldcon-0.2.0/src/ldcon/drivers/dlcpro_analog.py +33 -0
  115. ldcon-0.2.0/src/ldcon/drivers/dlcpro_console.py +133 -0
  116. ldcon-0.2.0/src/ldcon/drivers/dlcpro_priority.py +46 -0
  117. ldcon-0.2.0/src/ldcon/drivers/ecdl.py +334 -0
  118. ldcon-0.2.0/src/ldcon/drivers/esp32_servo.py +187 -0
  119. ldcon-0.2.0/src/ldcon/drivers/fizeau.py +114 -0
  120. ldcon-0.2.0/src/ldcon/drivers/frequency_sweep.py +69 -0
  121. ldcon-0.2.0/src/ldcon/drivers/influx_wavelength.py +70 -0
  122. ldcon-0.2.0/src/ldcon/drivers/metric_sources.py +82 -0
  123. ldcon-0.2.0/src/ldcon/drivers/native_dither_telemetry.py +50 -0
  124. ldcon-0.2.0/src/ldcon/drivers/rigol_scope.py +126 -0
  125. ldcon-0.2.0/src/ldcon/drivers/siglent.py +418 -0
  126. ldcon-0.2.0/src/ldcon/drivers/staircase.py +155 -0
  127. ldcon-0.2.0/src/ldcon/drivers/wsu_udp.py +164 -0
  128. ldcon-0.2.0/src/ldcon/esp32_time_telemetry.py +4 -0
  129. ldcon-0.2.0/src/ldcon/example_config.py +41 -0
  130. ldcon-0.2.0/src/ldcon/fallback_service.py +4 -0
  131. ldcon-0.2.0/src/ldcon/instrument_owner.py +4 -0
  132. ldcon-0.2.0/src/ldcon/instrument_service.py +4 -0
  133. ldcon-0.2.0/src/ldcon/interface_worker.py +4 -0
  134. ldcon-0.2.0/src/ldcon/job_service.py +4 -0
  135. ldcon-0.2.0/src/ldcon/jobs/__init__.py +1 -0
  136. ldcon-0.2.0/src/ldcon/jobs/adaptive_pid.py +234 -0
  137. ldcon-0.2.0/src/ldcon/jobs/adaptive_window_session.py +922 -0
  138. ldcon-0.2.0/src/ldcon/jobs/adjustment_continuation.py +284 -0
  139. ldcon-0.2.0/src/ldcon/jobs/axis_frequency.py +219 -0
  140. ldcon-0.2.0/src/ldcon/jobs/axis_frequency_report.py +86 -0
  141. ldcon-0.2.0/src/ldcon/jobs/background_parameter_session.py +142 -0
  142. ldcon-0.2.0/src/ldcon/jobs/background_pid_session.py +447 -0
  143. ldcon-0.2.0/src/ldcon/jobs/branch_maps.py +71 -0
  144. ldcon-0.2.0/src/ldcon/jobs/branch_target_migration.py +33 -0
  145. ldcon-0.2.0/src/ldcon/jobs/card_runtime.py +157 -0
  146. ldcon-0.2.0/src/ldcon/jobs/change_measure.py +293 -0
  147. ldcon-0.2.0/src/ldcon/jobs/change_measure_adapter.py +360 -0
  148. ldcon-0.2.0/src/ldcon/jobs/change_measure_dlc.py +94 -0
  149. ldcon-0.2.0/src/ldcon/jobs/change_measure_parameters.py +222 -0
  150. ldcon-0.2.0/src/ldcon/jobs/change_measure_target.py +135 -0
  151. ldcon-0.2.0/src/ldcon/jobs/current_cards.py +159 -0
  152. ldcon-0.2.0/src/ldcon/jobs/current_devices.py +71 -0
  153. ldcon-0.2.0/src/ldcon/jobs/dashboard_api.py +61 -0
  154. ldcon-0.2.0/src/ldcon/jobs/device_parameters.py +426 -0
  155. ldcon-0.2.0/src/ldcon/jobs/dlc_pi_measurement.py +151 -0
  156. ldcon-0.2.0/src/ldcon/jobs/dlcpro_awg_analysis.py +77 -0
  157. ldcon-0.2.0/src/ldcon/jobs/dlcpro_awg_card.py +116 -0
  158. ldcon-0.2.0/src/ldcon/jobs/dlcpro_cards.py +240 -0
  159. ldcon-0.2.0/src/ldcon/jobs/ecdl_branch_hop.py +175 -0
  160. ldcon-0.2.0/src/ldcon/jobs/ecdl_branch_recovery.py +176 -0
  161. ldcon-0.2.0/src/ldcon/jobs/ecdl_devices.py +306 -0
  162. ldcon-0.2.0/src/ldcon/jobs/ecdl_locked_sweep_proxy.py +526 -0
  163. ldcon-0.2.0/src/ldcon/jobs/ecdl_mapped_recovery.py +6 -0
  164. ldcon-0.2.0/src/ldcon/jobs/ecdl_mode_map.py +469 -0
  165. ldcon-0.2.0/src/ldcon/jobs/ecdl_mode_recovery.py +20 -0
  166. ldcon-0.2.0/src/ldcon/jobs/ecdl_online.py +158 -0
  167. ldcon-0.2.0/src/ldcon/jobs/ecdl_operating_point.py +403 -0
  168. ldcon-0.2.0/src/ldcon/jobs/ecdl_pi_commission.py +161 -0
  169. ldcon-0.2.0/src/ldcon/jobs/ecdl_recovery.py +25 -0
  170. ldcon-0.2.0/src/ldcon/jobs/ecdl_recovery_plan.py +90 -0
  171. ldcon-0.2.0/src/ldcon/jobs/ecdl_recovery_test.py +59 -0
  172. ldcon-0.2.0/src/ldcon/jobs/ecdl_relock.py +7 -0
  173. ldcon-0.2.0/src/ldcon/jobs/ecdl_response_study.py +369 -0
  174. ldcon-0.2.0/src/ldcon/jobs/ecdl_steady.py +343 -0
  175. ldcon-0.2.0/src/ldcon/jobs/ecdl_thermal_context.py +242 -0
  176. ldcon-0.2.0/src/ldcon/jobs/ecdl_window_center.py +734 -0
  177. ldcon-0.2.0/src/ldcon/jobs/emission_card.py +102 -0
  178. ldcon-0.2.0/src/ldcon/jobs/fringe_sweep_reference.py +89 -0
  179. ldcon-0.2.0/src/ldcon/jobs/interface_devices.py +122 -0
  180. ldcon-0.2.0/src/ldcon/jobs/interface_worker.py +471 -0
  181. ldcon-0.2.0/src/ldcon/jobs/job_service.py +125 -0
  182. ldcon-0.2.0/src/ldcon/jobs/laser_live.py +270 -0
  183. ldcon-0.2.0/src/ldcon/jobs/learned_settling.py +450 -0
  184. ldcon-0.2.0/src/ldcon/jobs/lock_target.py +461 -0
  185. ldcon-0.2.0/src/ldcon/jobs/locked_triangle.py +36 -0
  186. ldcon-0.2.0/src/ldcon/jobs/measurement_acquisition.py +51 -0
  187. ldcon-0.2.0/src/ldcon/jobs/measurement_analysis.py +59 -0
  188. ldcon-0.2.0/src/ldcon/jobs/measurement_execution.py +40 -0
  189. ldcon-0.2.0/src/ldcon/jobs/measurement_notice.py +78 -0
  190. ldcon-0.2.0/src/ldcon/jobs/measurement_presets.py +52 -0
  191. ldcon-0.2.0/src/ldcon/jobs/measurement_report.py +76 -0
  192. ldcon-0.2.0/src/ldcon/jobs/measurement_statistics.py +22 -0
  193. ldcon-0.2.0/src/ldcon/jobs/metric_cards.py +34 -0
  194. ldcon-0.2.0/src/ldcon/jobs/metric_interface.py +100 -0
  195. ldcon-0.2.0/src/ldcon/jobs/modulation_sweep.py +274 -0
  196. ldcon-0.2.0/src/ldcon/jobs/native_background_session.py +91 -0
  197. ldcon-0.2.0/src/ldcon/jobs/native_current_acquire.py +143 -0
  198. ldcon-0.2.0/src/ldcon/jobs/native_current_card.py +328 -0
  199. ldcon-0.2.0/src/ldcon/jobs/native_current_online.py +129 -0
  200. ldcon-0.2.0/src/ldcon/jobs/native_ff_proxy.py +1361 -0
  201. ldcon-0.2.0/src/ldcon/jobs/native_ff_sweep.py +802 -0
  202. ldcon-0.2.0/src/ldcon/jobs/online_pid.py +178 -0
  203. ldcon-0.2.0/src/ldcon/jobs/operating_point.py +1399 -0
  204. ldcon-0.2.0/src/ldcon/jobs/operating_point_proxy.py +236 -0
  205. ldcon-0.2.0/src/ldcon/jobs/operation_execution.py +126 -0
  206. ldcon-0.2.0/src/ldcon/jobs/operation_history.py +419 -0
  207. ldcon-0.2.0/src/ldcon/jobs/optical_broker.py +23 -0
  208. ldcon-0.2.0/src/ldcon/jobs/pi_algorithms.py +30 -0
  209. ldcon-0.2.0/src/ldcon/jobs/pi_response.py +239 -0
  210. ldcon-0.2.0/src/ldcon/jobs/progress.py +63 -0
  211. ldcon-0.2.0/src/ldcon/jobs/quality_baseline.py +411 -0
  212. ldcon-0.2.0/src/ldcon/jobs/recovery_decisions.py +131 -0
  213. ldcon-0.2.0/src/ldcon/jobs/recovery_history.py +152 -0
  214. ldcon-0.2.0/src/ldcon/jobs/recovery_procedure.py +285 -0
  215. ldcon-0.2.0/src/ldcon/jobs/recovery_reference.py +123 -0
  216. ldcon-0.2.0/src/ldcon/jobs/recovery_stationary.py +138 -0
  217. ldcon-0.2.0/src/ldcon/jobs/response_algorithms.py +47 -0
  218. ldcon-0.2.0/src/ldcon/jobs/response_comparison.py +62 -0
  219. ldcon-0.2.0/src/ldcon/jobs/response_record.py +90 -0
  220. ldcon-0.2.0/src/ldcon/jobs/runtime_parameters.py +434 -0
  221. ldcon-0.2.0/src/ldcon/jobs/settling_profile.py +140 -0
  222. ldcon-0.2.0/src/ldcon/jobs/shot_analysis.py +1300 -0
  223. ldcon-0.2.0/src/ldcon/jobs/simulation.py +127 -0
  224. ldcon-0.2.0/src/ldcon/jobs/slow_control.py +208 -0
  225. ldcon-0.2.0/src/ldcon/jobs/slow_current.py +88 -0
  226. ldcon-0.2.0/src/ldcon/jobs/study_adoption.py +122 -0
  227. ldcon-0.2.0/src/ldcon/jobs/study_execution.py +182 -0
  228. ldcon-0.2.0/src/ldcon/jobs/sweep_ff_analysis.py +320 -0
  229. ldcon-0.2.0/src/ldcon/jobs/sweep_ff_optimization.py +202 -0
  230. ldcon-0.2.0/src/ldcon/jobs/sweep_ff_plan.py +166 -0
  231. ldcon-0.2.0/src/ldcon/jobs/sweep_ff_report.py +254 -0
  232. ldcon-0.2.0/src/ldcon/jobs/sweep_ff_transport.py +326 -0
  233. ldcon-0.2.0/src/ldcon/jobs/sweep_tracking.py +424 -0
  234. ldcon-0.2.0/src/ldcon/jobs/sweep_verdict.py +288 -0
  235. ldcon-0.2.0/src/ldcon/jobs/target_response.py +638 -0
  236. ldcon-0.2.0/src/ldcon/jobs/target_response_analysis.py +65 -0
  237. ldcon-0.2.0/src/ldcon/jobs/target_response_control.py +215 -0
  238. ldcon-0.2.0/src/ldcon/jobs/target_response_decisions.py +152 -0
  239. ldcon-0.2.0/src/ldcon/jobs/target_response_experiment.py +110 -0
  240. ldcon-0.2.0/src/ldcon/jobs/target_response_feedforward.py +130 -0
  241. ldcon-0.2.0/src/ldcon/jobs/target_response_search.py +225 -0
  242. ldcon-0.2.0/src/ldcon/jobs/target_response_shift.py +475 -0
  243. ldcon-0.2.0/src/ldcon/jobs/target_response_thermal.py +113 -0
  244. ldcon-0.2.0/src/ldcon/jobs/target_response_thermal_experiment.py +120 -0
  245. ldcon-0.2.0/src/ldcon/jobs/target_sequence.py +166 -0
  246. ldcon-0.2.0/src/ldcon/jobs/temperature_identification.py +86 -0
  247. ldcon-0.2.0/src/ldcon/jobs/wavelength_history.py +17 -0
  248. ldcon-0.2.0/src/ldcon/jobs/window_actions.py +641 -0
  249. ldcon-0.2.0/src/ldcon/jobs/window_center.py +784 -0
  250. ldcon-0.2.0/src/ldcon/jobs/window_control.py +130 -0
  251. ldcon-0.2.0/src/ldcon/jobs/window_decisions.py +105 -0
  252. ldcon-0.2.0/src/ldcon/jobs/window_sampling.py +66 -0
  253. ldcon-0.2.0/src/ldcon/jobs/workflow_artifacts.py +73 -0
  254. ldcon-0.2.0/src/ldcon/migration/__init__.py +810 -0
  255. ldcon-0.2.0/src/ldcon/migration/migration_decks.py +239 -0
  256. ldcon-0.2.0/src/ldcon/migration/migration_readiness.py +397 -0
  257. ldcon-0.2.0/src/ldcon/migration/migration_relocation.py +283 -0
  258. ldcon-0.2.0/src/ldcon/monitor_owner.py +4 -0
  259. ldcon-0.2.0/src/ldcon/owner_telemetry.py +4 -0
  260. ldcon-0.2.0/src/ldcon/owners/__init__.py +1 -0
  261. ldcon-0.2.0/src/ldcon/owners/adc_log_threshold.py +209 -0
  262. ldcon-0.2.0/src/ldcon/owners/background_grants.py +44 -0
  263. ldcon-0.2.0/src/ldcon/owners/cld_instrument_owner.py +96 -0
  264. ldcon-0.2.0/src/ldcon/owners/cld_owner.py +706 -0
  265. ldcon-0.2.0/src/ldcon/owners/cld_projection.py +194 -0
  266. ldcon-0.2.0/src/ldcon/owners/cld_system_owner.py +276 -0
  267. ldcon-0.2.0/src/ldcon/owners/current_owner.py +68 -0
  268. ldcon-0.2.0/src/ldcon/owners/device_registry.py +229 -0
  269. ldcon-0.2.0/src/ldcon/owners/dlcpro_awg_plan.py +115 -0
  270. ldcon-0.2.0/src/ldcon/owners/dlcpro_awg_port.py +98 -0
  271. ldcon-0.2.0/src/ldcon/owners/dlcpro_awg_protocol.py +190 -0
  272. ldcon-0.2.0/src/ldcon/owners/dlcpro_awg_return.py +63 -0
  273. ldcon-0.2.0/src/ldcon/owners/dlcpro_awg_sweep.py +437 -0
  274. ldcon-0.2.0/src/ldcon/owners/dlcpro_awg_timing.py +35 -0
  275. ldcon-0.2.0/src/ldcon/owners/dlcpro_awg_tracking.py +175 -0
  276. ldcon-0.2.0/src/ldcon/owners/dlcpro_awg_tracking_guard.py +87 -0
  277. ldcon-0.2.0/src/ldcon/owners/dlcpro_awg_tracking_report.py +49 -0
  278. ldcon-0.2.0/src/ldcon/owners/dlcpro_awg_zero.py +82 -0
  279. ldcon-0.2.0/src/ldcon/owners/dlcpro_deployment.py +66 -0
  280. ldcon-0.2.0/src/ldcon/owners/dlcpro_ff.py +64 -0
  281. ldcon-0.2.0/src/ldcon/owners/dlcpro_ff_adjustment.py +159 -0
  282. ldcon-0.2.0/src/ldcon/owners/dlcpro_ff_delta_adjustment.py +194 -0
  283. ldcon-0.2.0/src/ldcon/owners/dlcpro_frequency_window.py +61 -0
  284. ldcon-0.2.0/src/ldcon/owners/dlcpro_observation.py +62 -0
  285. ldcon-0.2.0/src/ldcon/owners/dlcpro_owner.py +830 -0
  286. ldcon-0.2.0/src/ldcon/owners/dlcpro_pi_protocol.py +44 -0
  287. ldcon-0.2.0/src/ldcon/owners/dlcpro_pi_trial.py +161 -0
  288. ldcon-0.2.0/src/ldcon/owners/dlcpro_readback.py +50 -0
  289. ldcon-0.2.0/src/ldcon/owners/dlcpro_service.py +203 -0
  290. ldcon-0.2.0/src/ldcon/owners/dlcpro_target_changes.py +330 -0
  291. ldcon-0.2.0/src/ldcon/owners/dlcpro_target_step.py +44 -0
  292. ldcon-0.2.0/src/ldcon/owners/dlcpro_target_store.py +75 -0
  293. ldcon-0.2.0/src/ldcon/owners/dlcpro_telemetry.py +72 -0
  294. ldcon-0.2.0/src/ldcon/owners/ecdl_background_parameters.py +248 -0
  295. ldcon-0.2.0/src/ldcon/owners/ecdl_background_pid.py +184 -0
  296. ldcon-0.2.0/src/ldcon/owners/ecdl_hot_control.py +255 -0
  297. ldcon-0.2.0/src/ldcon/owners/ecdl_independent_pid.py +95 -0
  298. ldcon-0.2.0/src/ldcon/owners/ecdl_locked_study.py +122 -0
  299. ldcon-0.2.0/src/ldcon/owners/ecdl_locked_sweep.py +1875 -0
  300. ldcon-0.2.0/src/ldcon/owners/ecdl_native_pid.py +181 -0
  301. ldcon-0.2.0/src/ldcon/owners/ecdl_optical.py +37 -0
  302. ldcon-0.2.0/src/ldcon/owners/ecdl_owner.py +1058 -0
  303. ldcon-0.2.0/src/ldcon/owners/ecdl_policy_reload.py +494 -0
  304. ldcon-0.2.0/src/ldcon/owners/ecdl_prelock.py +612 -0
  305. ldcon-0.2.0/src/ldcon/owners/ecdl_projection.py +636 -0
  306. ldcon-0.2.0/src/ldcon/owners/ecdl_steady_owner.py +1859 -0
  307. ldcon-0.2.0/src/ldcon/owners/ecdl_steady_policy.py +212 -0
  308. ldcon-0.2.0/src/ldcon/owners/ecdl_target_ff.py +214 -0
  309. ldcon-0.2.0/src/ldcon/owners/ecdl_target_settling.py +163 -0
  310. ldcon-0.2.0/src/ldcon/owners/ecdl_tec_pair.py +88 -0
  311. ldcon-0.2.0/src/ldcon/owners/ecdl_thermal_study.py +251 -0
  312. ldcon-0.2.0/src/ldcon/owners/emission.py +365 -0
  313. ldcon-0.2.0/src/ldcon/owners/emission_adapters.py +268 -0
  314. ldcon-0.2.0/src/ldcon/owners/esp32_native_client.py +335 -0
  315. ldcon-0.2.0/src/ldcon/owners/esp32_native_owner.py +2166 -0
  316. ldcon-0.2.0/src/ldcon/owners/esp32_time_telemetry.py +253 -0
  317. ldcon-0.2.0/src/ldcon/owners/esp32_udp_gate.py +136 -0
  318. ldcon-0.2.0/src/ldcon/owners/external_sweep_guard.py +44 -0
  319. ldcon-0.2.0/src/ldcon/owners/flexible_native_trial.py +172 -0
  320. ldcon-0.2.0/src/ldcon/owners/fringe_peaks.py +92 -0
  321. ldcon-0.2.0/src/ldcon/owners/full_data_log.py +133 -0
  322. ldcon-0.2.0/src/ldcon/owners/instrument_identity.py +125 -0
  323. ldcon-0.2.0/src/ldcon/owners/instrument_owner.py +1041 -0
  324. ldcon-0.2.0/src/ldcon/owners/instrument_projection.py +104 -0
  325. ldcon-0.2.0/src/ldcon/owners/instrument_service.py +638 -0
  326. ldcon-0.2.0/src/ldcon/owners/migration_physical_lock.py +162 -0
  327. ldcon-0.2.0/src/ldcon/owners/monitor_owner.py +322 -0
  328. ldcon-0.2.0/src/ldcon/owners/native_assembly.py +37 -0
  329. ldcon-0.2.0/src/ldcon/owners/native_assembly_host.py +260 -0
  330. ldcon-0.2.0/src/ldcon/owners/native_background.py +233 -0
  331. ldcon-0.2.0/src/ldcon/owners/native_current_tuning.py +251 -0
  332. ldcon-0.2.0/src/ldcon/owners/native_ff_proof.py +433 -0
  333. ldcon-0.2.0/src/ldcon/owners/native_instrument_owner.py +161 -0
  334. ldcon-0.2.0/src/ldcon/owners/native_modulation_limits.py +45 -0
  335. ldcon-0.2.0/src/ldcon/owners/native_policy_reload.py +186 -0
  336. ldcon-0.2.0/src/ldcon/owners/native_policy_safety.py +213 -0
  337. ldcon-0.2.0/src/ldcon/owners/native_policy_update.py +473 -0
  338. ldcon-0.2.0/src/ldcon/owners/native_system_owner.py +420 -0
  339. ldcon-0.2.0/src/ldcon/owners/operating_mode_owner.py +128 -0
  340. ldcon-0.2.0/src/ldcon/owners/owner_projection.py +530 -0
  341. ldcon-0.2.0/src/ldcon/owners/owner_telemetry.py +166 -0
  342. ldcon-0.2.0/src/ldcon/owners/pi_handover.py +154 -0
  343. ldcon-0.2.0/src/ldcon/owners/projection_transport.py +143 -0
  344. ldcon-0.2.0/src/ldcon/owners/remote_instruments.py +323 -0
  345. ldcon-0.2.0/src/ldcon/owners/sdg_client.py +122 -0
  346. ldcon-0.2.0/src/ldcon/owners/sdg_owner.py +468 -0
  347. ldcon-0.2.0/src/ldcon/owners/tec_rate.py +29 -0
  348. ldcon-0.2.0/src/ldcon/owners/wsu_udp_monitor.py +113 -0
  349. ldcon-0.2.0/src/ldcon/report_pdf.py +4 -0
  350. ldcon-0.2.0/src/ldcon/resources/agent-model-options.json +142 -0
  351. ldcon-0.2.0/src/ldcon/resources/agent_contract/adjustment.txt +45 -0
  352. ldcon-0.2.0/src/ldcon/resources/agent_contract/common.txt +42 -0
  353. ldcon-0.2.0/src/ldcon/resources/agent_contract/diagnosis.txt +11 -0
  354. ldcon-0.2.0/src/ldcon/resources/agent_contract/research.txt +20 -0
  355. ldcon-0.2.0/src/ldcon/resources/agent_contract/response_optimization.txt +13 -0
  356. ldcon-0.2.0/src/ldcon/resources/examples/README.html +10 -0
  357. ldcon-0.2.0/src/ldcon/resources/examples/assignments/sr1092.yaml +100 -0
  358. ldcon-0.2.0/src/ldcon/resources/examples/assignments/sr422.yaml +677 -0
  359. ldcon-0.2.0/src/ldcon/resources/examples/assignments/thf685.yaml +7 -0
  360. ldcon-0.2.0/src/ldcon/resources/examples/interface-decks/dfb-dbr-ldc-tec.yaml +430 -0
  361. ldcon-0.2.0/src/ldcon/resources/examples/interface-decks/ecdl-dlcpro.yaml +288 -0
  362. ldcon-0.2.0/src/ldcon/resources/examples/interface-decks/ecdl-pzt-ldc-tec.yaml +698 -0
  363. ldcon-0.2.0/src/ldcon/resources/examples/lasers/sr1092.yaml +267 -0
  364. ldcon-0.2.0/src/ldcon/resources/examples/lasers/sr422.yaml +403 -0
  365. ldcon-0.2.0/src/ldcon/resources/examples/lasers/thf685.yaml +158 -0
  366. ldcon-0.2.0/src/ldcon/resources/report_template/ldconreport.cls +42 -0
  367. ldcon-0.2.0/src/ldcon/resources/report_template/report.tex +47 -0
  368. ldcon-0.2.0/src/ldcon/web/__init__.py +1 -0
  369. ldcon-0.2.0/src/ldcon/web/agent_approval_api.py +126 -0
  370. ldcon-0.2.0/src/ldcon/web/agent_settings_api.py +54 -0
  371. ldcon-0.2.0/src/ldcon/web/agent_task_api.py +211 -0
  372. ldcon-0.2.0/src/ldcon/web/control_readback.py +63 -0
  373. ldcon-0.2.0/src/ldcon/web/dashboard_activity.py +109 -0
  374. ldcon-0.2.0/src/ldcon/web/dashboard_controls_revision.py +29 -0
  375. ldcon-0.2.0/src/ldcon/web/dashboard_metrics.py +146 -0
  376. ldcon-0.2.0/src/ldcon/web/dashboard_snapshot.py +163 -0
  377. ldcon-0.2.0/src/ldcon/web/dashboard_state.py +104 -0
  378. ldcon-0.2.0/src/ldcon/web/dashboard_wavelength.py +150 -0
  379. ldcon-0.2.0/src/ldcon/web/device_parameters_api.py +52 -0
  380. ldcon-0.2.0/src/ldcon/web/dither_quality.py +46 -0
  381. ldcon-0.2.0/src/ldcon/web/dlcpro_target_api.py +91 -0
  382. ldcon-0.2.0/src/ldcon/web/dlcpro_target_query.py +23 -0
  383. ldcon-0.2.0/src/ldcon/web/failure_api.py +62 -0
  384. ldcon-0.2.0/src/ldcon/web/gateway_lan.py +208 -0
  385. ldcon-0.2.0/src/ldcon/web/grafana_activity.py +84 -0
  386. ldcon-0.2.0/src/ldcon/web/grafana_dashboard.py +492 -0
  387. ldcon-0.2.0/src/ldcon/web/grafana_dlcpro.py +158 -0
  388. ldcon-0.2.0/src/ldcon/web/grafana_quality.py +167 -0
  389. ldcon-0.2.0/src/ldcon/web/interface_projection.py +27 -0
  390. ldcon-0.2.0/src/ldcon/web/job_registry.py +68 -0
  391. ldcon-0.2.0/src/ldcon/web/job_report.py +122 -0
  392. ldcon-0.2.0/src/ldcon/web/laser_operations.py +445 -0
  393. ldcon-0.2.0/src/ldcon/web/lock_target_api.py +554 -0
  394. ldcon-0.2.0/src/ldcon/web/lock_target_queue.py +212 -0
  395. ldcon-0.2.0/src/ldcon/web/log_archive.py +191 -0
  396. ldcon-0.2.0/src/ldcon/web/metric_query_profiles.py +378 -0
  397. ldcon-0.2.0/src/ldcon/web/online_position.py +26 -0
  398. ldcon-0.2.0/src/ldcon/web/operating_mode_api.py +72 -0
  399. ldcon-0.2.0/src/ldcon/web/operation_api.py +34 -0
  400. ldcon-0.2.0/src/ldcon/web/operation_observation.py +57 -0
  401. ldcon-0.2.0/src/ldcon/web/operations_settings.py +92 -0
  402. ldcon-0.2.0/src/ldcon/web/quality_threshold_metrics.py +64 -0
  403. ldcon-0.2.0/src/ldcon/web/shot_analysis_api.py +136 -0
  404. ldcon-0.2.0/src/ldcon/web/sweep_api.py +1186 -0
  405. ldcon-0.2.0/src/ldcon/web/sweep_guard.py +45 -0
  406. ldcon-0.2.0/src/ldcon/web/target_reference_panel.py +38 -0
  407. ldcon-0.2.0/src/ldcon/web/teams_destinations_api.py +81 -0
  408. ldcon-0.2.0/src/ldcon/web/web_fleet.py +482 -0
  409. ldcon-0.2.0/src/ldcon/web/web_runtime.py +811 -0
  410. ldcon-0.2.0/src/ldcon/web/web_server.py +402 -0
  411. ldcon-0.2.0/src/ldcon/web/window_api.py +28 -0
  412. ldcon-0.2.0/src/ldcon/web_assets/agent-settings.css +4 -0
  413. ldcon-0.2.0/src/ldcon/web_assets/agent-settings.html +53 -0
  414. ldcon-0.2.0/src/ldcon/web_assets/agent-settings.js +270 -0
  415. ldcon-0.2.0/src/ldcon/web_assets/app.css +9 -0
  416. ldcon-0.2.0/src/ldcon/web_assets/app.js +802 -0
  417. ldcon-0.2.0/src/ldcon/web_assets/card-browser.js +160 -0
  418. ldcon-0.2.0/src/ldcon/web_assets/card-guide.js +9 -0
  419. ldcon-0.2.0/src/ldcon/web_assets/cards/acquire.metrics.html +82 -0
  420. ldcon-0.2.0/src/ldcon/web_assets/cards/agent.history_review.html +13 -0
  421. ldcon-0.2.0/src/ldcon/web_assets/cards/agent.log_watch.html +1 -0
  422. ldcon-0.2.0/src/ldcon/web_assets/cards/agent.monitor.html +13 -0
  423. ldcon-0.2.0/src/ldcon/web_assets/cards/agent.request.html +1 -0
  424. ldcon-0.2.0/src/ldcon/web_assets/cards/agent.resident.html +1 -0
  425. ldcon-0.2.0/src/ldcon/web_assets/cards/agent.task.html +17 -0
  426. ldcon-0.2.0/src/ldcon/web_assets/cards/commission.ecdl_pi.html +1 -0
  427. ldcon-0.2.0/src/ldcon/web_assets/cards/identify.axis_frequency.html +1 -0
  428. ldcon-0.2.0/src/ldcon/web_assets/cards/identify.current_response.html +1 -0
  429. ldcon-0.2.0/src/ldcon/web_assets/cards/laser.emission.html +8 -0
  430. ldcon-0.2.0/src/ldcon/web_assets/cards/measure.batch.html +1 -0
  431. ldcon-0.2.0/src/ldcon/web_assets/cards/measure.change.html +1 -0
  432. ldcon-0.2.0/src/ldcon/web_assets/cards/measure.target_response.html +1 -0
  433. ldcon-0.2.0/src/ldcon/web_assets/cards/monitor.wavelength.html +1 -0
  434. ldcon-0.2.0/src/ldcon/web_assets/cards/notify.teams.html +1 -0
  435. ldcon-0.2.0/src/ldcon/web_assets/cards/optimize.settling_criteria.html +1 -0
  436. ldcon-0.2.0/src/ldcon/web_assets/cards/optimize.target_feedforward.html +1 -0
  437. ldcon-0.2.0/src/ldcon/web_assets/cards/optimize.target_step.html +1 -0
  438. ldcon-0.2.0/src/ldcon/web_assets/cards/optimize.target_thermal.html +1 -0
  439. ldcon-0.2.0/src/ldcon/web_assets/cards/plan.ecdl_recovery.html +14 -0
  440. ldcon-0.2.0/src/ldcon/web_assets/cards/prepare.ecdl_recovery.html +18 -0
  441. ldcon-0.2.0/src/ldcon/web_assets/cards/recover.ecdl_mode_hop.html +12 -0
  442. ldcon-0.2.0/src/ldcon/web_assets/cards/report.grafana_dashboard.html +22 -0
  443. ldcon-0.2.0/src/ldcon/web_assets/cards/servo.current_pid.html +1 -0
  444. ldcon-0.2.0/src/ldcon/web_assets/cards/servo.dlcpro_frequency.html +1 -0
  445. ldcon-0.2.0/src/ldcon/web_assets/cards/servo.ecdl_steady_lock.html +11 -0
  446. ldcon-0.2.0/src/ldcon/web_assets/cards/servo.native_current.html +1 -0
  447. ldcon-0.2.0/src/ldcon/web_assets/cards/study.ecdl_current_response.html +1 -0
  448. ldcon-0.2.0/src/ldcon/web_assets/cards/study.ecdl_locked_current_map.html +1 -0
  449. ldcon-0.2.0/src/ldcon/web_assets/cards/study.ecdl_mode_map.html +6 -0
  450. ldcon-0.2.0/src/ldcon/web_assets/cards/study.ecdl_thermal_context.html +5 -0
  451. ldcon-0.2.0/src/ldcon/web_assets/cards/study.target_response.html +1 -0
  452. ldcon-0.2.0/src/ldcon/web_assets/cards/sweep.current_modulation.html +1 -0
  453. ldcon-0.2.0/src/ldcon/web_assets/cards/sweep.dlcpro_frequency.html +1 -0
  454. ldcon-0.2.0/src/ldcon/web_assets/cards/sweep.servo_modulation.html +1 -0
  455. ldcon-0.2.0/src/ldcon/web_assets/cards/test.ecdl_recovery.html +4 -0
  456. ldcon-0.2.0/src/ldcon/web_assets/cards/tune.ecdl_initial_point.html +1 -0
  457. ldcon-0.2.0/src/ldcon/web_assets/cards/tune.ecdl_operating_point.html +13 -0
  458. ldcon-0.2.0/src/ldcon/web_assets/cards/tune.ecdl_window_center.html +7 -0
  459. ldcon-0.2.0/src/ldcon/web_assets/cards/tune.native_current.html +1 -0
  460. ldcon-0.2.0/src/ldcon/web_assets/cards/tune.pid_coordinate_search.html +1 -0
  461. ldcon-0.2.0/src/ldcon/web_assets/cards/tune.pid_factor_reduction.html +1 -0
  462. ldcon-0.2.0/src/ldcon/web_assets/cards/tune.pid_online.html +1 -0
  463. ldcon-0.2.0/src/ldcon/web_assets/cards/tune.temperature_once.html +18 -0
  464. ldcon-0.2.0/src/ldcon/web_assets/committing-input.js +35 -0
  465. ldcon-0.2.0/src/ldcon/web_assets/configuration-editor.js +194 -0
  466. ldcon-0.2.0/src/ldcon/web_assets/dashboard-state.js +39 -0
  467. ldcon-0.2.0/src/ldcon/web_assets/failures.html +1 -0
  468. ldcon-0.2.0/src/ldcon/web_assets/failures.js +19 -0
  469. ldcon-0.2.0/src/ldcon/web_assets/fallback.css +3 -0
  470. ldcon-0.2.0/src/ldcon/web_assets/fallback.html +1 -0
  471. ldcon-0.2.0/src/ldcon/web_assets/fallback.js +21 -0
  472. ldcon-0.2.0/src/ldcon/web_assets/fleet-settings.js +20 -0
  473. ldcon-0.2.0/src/ldcon/web_assets/fleet.css +9 -0
  474. ldcon-0.2.0/src/ldcon/web_assets/fleet.html +8 -0
  475. ldcon-0.2.0/src/ldcon/web_assets/fleet.js +130 -0
  476. ldcon-0.2.0/src/ldcon/web_assets/gateway-presentation.js +27 -0
  477. ldcon-0.2.0/src/ldcon/web_assets/grafana-help.js +31 -0
  478. ldcon-0.2.0/src/ldcon/web_assets/help.html +22 -0
  479. ldcon-0.2.0/src/ldcon/web_assets/i18n.js +279 -0
  480. ldcon-0.2.0/src/ldcon/web_assets/index.html +14 -0
  481. ldcon-0.2.0/src/ldcon/web_assets/laser-workspace.js +279 -0
  482. ldcon-0.2.0/src/ldcon/web_assets/modulation.html +1 -0
  483. ldcon-0.2.0/src/ldcon/web_assets/modulation.js +14 -0
  484. ldcon-0.2.0/src/ldcon/web_assets/reservations.html +16 -0
  485. ldcon-0.2.0/src/ldcon/web_assets/reservations.js +77 -0
  486. ldcon-0.2.0/src/ldcon/web_assets/teams-settings.js +91 -0
  487. ldcon-0.2.0/src/ldcon/web_assets/window-actions.js +37 -0
  488. ldcon-0.2.0/src/ldcon/web_assets/workspace.css +99 -0
  489. ldcon-0.2.0/src/ldcon/web_fleet.py +4 -0
  490. ldcon-0.2.0/src/ldcon/web_server.py +4 -0
  491. ldcon-0.2.0/src/ldcon.egg-info/PKG-INFO +85 -0
  492. ldcon-0.2.0/src/ldcon.egg-info/SOURCES.txt +776 -0
  493. ldcon-0.2.0/src/ldcon.egg-info/dependency_links.txt +1 -0
  494. ldcon-0.2.0/src/ldcon.egg-info/entry_points.txt +5 -0
  495. ldcon-0.2.0/src/ldcon.egg-info/requires.txt +21 -0
  496. ldcon-0.2.0/src/ldcon.egg-info/top_level.txt +1 -0
  497. ldcon-0.2.0/tests/__init__.py +0 -0
  498. ldcon-0.2.0/tests/conftest.py +42 -0
  499. ldcon-0.2.0/tests/dashboard_fixture.cjs +19 -0
  500. ldcon-0.2.0/tests/fixtures/dlcpro-fw19.json +65 -0
  501. ldcon-0.2.0/tests/fixtures/effective-settings/golden-sr1092.json +4796 -0
  502. ldcon-0.2.0/tests/fixtures/effective-settings/golden-sr422.json +7432 -0
  503. ldcon-0.2.0/tests/fixtures/effective-settings/var/device-owners/cld1015-M01343851/config.json +89 -0
  504. ldcon-0.2.0/tests/fixtures/effective-settings/var/device-owners/esp32servocon-sr1092/config.json +134 -0
  505. ldcon-0.2.0/tests/fixtures/effective-settings/var/device-owners/scope-sr422-sr1092/config.json +11 -0
  506. ldcon-0.2.0/tests/fixtures/effective-settings/var/device-owners/sr422/config.json +90 -0
  507. ldcon-0.2.0/tests/fixtures/effective-settings/var/instrument-owners/bk4054b-51524H117/config.json +77 -0
  508. ldcon-0.2.0/tests/fixtures/effective-settings/var/instrument-owners/sdg2042x-SDG2XFBCA00839/config.json +93 -0
  509. ldcon-0.2.0/tests/fixtures/effective-settings/var/instrument-owners/sdg2042x-SDG2XFBCA00845/config.json +100 -0
  510. ldcon-0.2.0/tests/fixtures/effective-settings/var/lasers/sr1092/config/assignments/sr1092.yaml +99 -0
  511. ldcon-0.2.0/tests/fixtures/effective-settings/var/lasers/sr1092/config/interface-decks/dfb-dbr-ldc-tec.yaml +229 -0
  512. ldcon-0.2.0/tests/fixtures/effective-settings/var/lasers/sr1092/config/lasers/sr1092.yaml +250 -0
  513. ldcon-0.2.0/tests/fixtures/effective-settings/var/lasers/sr1092/laser-layout.json +1 -0
  514. ldcon-0.2.0/tests/fixtures/effective-settings/var/lasers/sr422/config/assignments/sr422.yaml +431 -0
  515. ldcon-0.2.0/tests/fixtures/effective-settings/var/lasers/sr422/config/interface-decks/ecdl-pzt-ldc-tec.yaml +309 -0
  516. ldcon-0.2.0/tests/fixtures/effective-settings/var/lasers/sr422/config/lasers/sr422.yaml +351 -0
  517. ldcon-0.2.0/tests/fixtures/effective-settings/var/lasers/sr422/laser-layout.json +1 -0
  518. ldcon-0.2.0/tests/fixtures/entry-startup/assembly-definition.yaml +247 -0
  519. ldcon-0.2.0/tests/fixtures/entry-startup/sr1092-broker.yaml +100 -0
  520. ldcon-0.2.0/tests/fixtures/pi-handover-v1.json +263 -0
  521. ldcon-0.2.0/tests/legacy_mapped_recovery_fixture.py +209 -0
  522. ldcon-0.2.0/tests/legacy_rearm_trim_fixture.py +150 -0
  523. ldcon-0.2.0/tests/legacy_recovery_executor_fixture.py +118 -0
  524. ldcon-0.2.0/tests/legacy_recovery_plan_fixture.py +127 -0
  525. ldcon-0.2.0/tests/legacy_recovery_test_fixture.py +349 -0
  526. ldcon-0.2.0/tests/measurement_fixtures.py +17 -0
  527. ldcon-0.2.0/tests/recovery_legacy_fixtures.py +24 -0
  528. ldcon-0.2.0/tests/support/examples/dlcpro/assignment.yaml +6 -0
  529. ldcon-0.2.0/tests/support/examples/dlcpro/deck.yaml +197 -0
  530. ldcon-0.2.0/tests/support/examples/dlcpro/existing-ecdl-calibration.yaml +36 -0
  531. ldcon-0.2.0/tests/support/examples/dlcpro/laser.offline.yaml +102 -0
  532. ldcon-0.2.0/tests/support/examples/dlcpro/owner.offline.json +46 -0
  533. ldcon-0.2.0/tests/support/examples/dlcpro/pi-agent-cards.yaml +141 -0
  534. ldcon-0.2.0/tests/support/examples/dlcpro/thf685/laser.yaml +107 -0
  535. ldcon-0.2.0/tests/support/examples/dlcpro/thf685/owner.json +36 -0
  536. ldcon-0.2.0/tests/support/examples/measurement-decks/dfb-dbr-ldc-tec.yaml +266 -0
  537. ldcon-0.2.0/tests/support/examples/measurement-decks/ecdl-pzt-ldc-tec.yaml +422 -0
  538. ldcon-0.2.0/tests/support/jobs/examples/interface-config/assignments/sr1092.yaml +6 -0
  539. ldcon-0.2.0/tests/support/jobs/examples/interface-config/assignments/sr422.yaml +11 -0
  540. ldcon-0.2.0/tests/support/jobs/examples/interface-config/interface-decks/dfb-dbr-ldc-tec.yaml +207 -0
  541. ldcon-0.2.0/tests/support/jobs/examples/interface-config/interface-decks/ecdl-pzt-ldc-tec.yaml +361 -0
  542. ldcon-0.2.0/tests/support/jobs/examples/interface-config/lasers/sr1092.yaml +94 -0
  543. ldcon-0.2.0/tests/support/jobs/examples/interface-config/lasers/sr422.yaml +113 -0
  544. ldcon-0.2.0/tests/support/jobs/tests/fixtures/live-20261022/assignments/sr1092.yaml +91 -0
  545. ldcon-0.2.0/tests/support/jobs/tests/fixtures/live-20261022/assignments/sr422.yaml +258 -0
  546. ldcon-0.2.0/tests/support/jobs/tests/fixtures/live-20261022/interface-decks/dfb-dbr-ldc-tec.yaml +152 -0
  547. ldcon-0.2.0/tests/support/jobs/tests/fixtures/live-20261022/interface-decks/ecdl-pzt-ldc-tec.yaml +145 -0
  548. ldcon-0.2.0/tests/support/jobs/tests/fixtures/live-20261022/lasers/sr1092.yaml +233 -0
  549. ldcon-0.2.0/tests/support/jobs/tests/fixtures/live-20261022/lasers/sr422.yaml +319 -0
  550. ldcon-0.2.0/tests/support/jobs/tests/test_esp32_native_current.py +588 -0
  551. ldcon-0.2.0/tests/support/jobs/tests/test_lock_target.py +247 -0
  552. ldcon-0.2.0/tests/support/jobs/tests/test_native_ff_owner.py +359 -0
  553. ldcon-0.2.0/tests/support/jobs/tests/test_native_live_moves.py +90 -0
  554. ldcon-0.2.0/tests/support/ops/effective_settings.py +425 -0
  555. ldcon-0.2.0/tests/support/ops/inspect_dlcpro.py +49 -0
  556. ldcon-0.2.0/tests/support/ops/prepare_pi_handover.py +130 -0
  557. ldcon-0.2.0/tests/support/ops/trim_owner_config.py +118 -0
  558. ldcon-0.2.0/tests/support/ops/update_pi_handover.py +400 -0
  559. ldcon-0.2.0/tests/support/owner/tests/fake_projection.py +10 -0
  560. ldcon-0.2.0/tests/support/owner/tests/fake_rig.py +347 -0
  561. ldcon-0.2.0/tests/support/owner/tests/locked_sweep_settings.yaml +40 -0
  562. ldcon-0.2.0/tests/support/owner/tests/test_background_pid_owner.py +128 -0
  563. ldcon-0.2.0/tests/support/owner/tests/test_locked_sweep_owner.py +546 -0
  564. ldcon-0.2.0/tests/support/scripts/monitor_configuration.py +25 -0
  565. ldcon-0.2.0/tests/support/scripts/test_live_background_handoff.py +27 -0
  566. ldcon-0.2.0/tests/support/tests/test_ecdl_acquisition_gate_fixes.py +272 -0
  567. ldcon-0.2.0/tests/support/tests/test_learned_settling.py +326 -0
  568. ldcon-0.2.0/tests/support/web/examples/interface-config/assignments/sr1092.yaml +12 -0
  569. ldcon-0.2.0/tests/support/web/examples/interface-config/assignments/sr422.yaml +11 -0
  570. ldcon-0.2.0/tests/support/web/examples/interface-config/interface-decks/dfb-dbr-ldc-tec.yaml +207 -0
  571. ldcon-0.2.0/tests/support/web/examples/interface-config/interface-decks/ecdl-pzt-ldc-tec.yaml +361 -0
  572. ldcon-0.2.0/tests/support/web/examples/interface-config/lasers/sr1092.yaml +94 -0
  573. ldcon-0.2.0/tests/support/web/examples/interface-config/lasers/sr422.yaml +113 -0
  574. ldcon-0.2.0/tests/support/web/tests/fixtures/live-20261022/assignments/sr1092.yaml +91 -0
  575. ldcon-0.2.0/tests/support/web/tests/fixtures/live-20261022/assignments/sr422.yaml +258 -0
  576. ldcon-0.2.0/tests/support/web/tests/fixtures/live-20261022/interface-decks/dfb-dbr-ldc-tec.yaml +152 -0
  577. ldcon-0.2.0/tests/support/web/tests/fixtures/live-20261022/interface-decks/ecdl-pzt-ldc-tec.yaml +145 -0
  578. ldcon-0.2.0/tests/support/web/tests/fixtures/live-20261022/lasers/sr1092.yaml +233 -0
  579. ldcon-0.2.0/tests/support/web/tests/fixtures/live-20261022/lasers/sr422.yaml +319 -0
  580. ldcon-0.2.0/tests/test_adaptive_window_session.py +485 -0
  581. ldcon-0.2.0/tests/test_adjustment_continuation.py +320 -0
  582. ldcon-0.2.0/tests/test_adjustment_guidance.py +69 -0
  583. ldcon-0.2.0/tests/test_adjustment_guidance_web.cjs +43 -0
  584. ldcon-0.2.0/tests/test_adjustment_quality.py +138 -0
  585. ldcon-0.2.0/tests/test_adopt_after_prewrite_reject_20261028.py +253 -0
  586. ldcon-0.2.0/tests/test_agent_background_gateway.py +346 -0
  587. ldcon-0.2.0/tests/test_agent_difficulty_routing.py +92 -0
  588. ldcon-0.2.0/tests/test_agent_host_integration.py +135 -0
  589. ldcon-0.2.0/tests/test_agent_model_negotiation.py +379 -0
  590. ldcon-0.2.0/tests/test_agent_monitor_history.py +256 -0
  591. ldcon-0.2.0/tests/test_agent_providers.py +323 -0
  592. ldcon-0.2.0/tests/test_agent_routing_layout.cjs +38 -0
  593. ldcon-0.2.0/tests/test_agent_settings_api.py +177 -0
  594. ldcon-0.2.0/tests/test_agent_settings_ui.cjs +126 -0
  595. ldcon-0.2.0/tests/test_agent_task_tool_arguments.py +68 -0
  596. ldcon-0.2.0/tests/test_agent_tasks.py +435 -0
  597. ldcon-0.2.0/tests/test_approval_layout_owner.py +64 -0
  598. ldcon-0.2.0/tests/test_background_foreground_native_matrix.py +102 -0
  599. ldcon-0.2.0/tests/test_background_start_observation.py +46 -0
  600. ldcon-0.2.0/tests/test_background_window_session.py +338 -0
  601. ldcon-0.2.0/tests/test_card_browser_assets.py +67 -0
  602. ldcon-0.2.0/tests/test_card_browser_ui.cjs +89 -0
  603. ldcon-0.2.0/tests/test_card_readiness.cjs +22 -0
  604. ldcon-0.2.0/tests/test_card_start_reasons.cjs +35 -0
  605. ldcon-0.2.0/tests/test_change_measure.py +201 -0
  606. ldcon-0.2.0/tests/test_change_measure_adapter.py +167 -0
  607. ldcon-0.2.0/tests/test_change_measure_dlc.py +189 -0
  608. ldcon-0.2.0/tests/test_change_measure_target.py +128 -0
  609. ldcon-0.2.0/tests/test_claude_interactive_metadata.py +88 -0
  610. ldcon-0.2.0/tests/test_claude_profile_transport.py +305 -0
  611. ldcon-0.2.0/tests/test_cld_system_boundary.py +305 -0
  612. ldcon-0.2.0/tests/test_committing_input.cjs +26 -0
  613. ldcon-0.2.0/tests/test_config_two_layer_step34.py +588 -0
  614. ldcon-0.2.0/tests/test_configuration_numeric_roundtrip.py +58 -0
  615. ldcon-0.2.0/tests/test_configuration_review_refresh.cjs +44 -0
  616. ldcon-0.2.0/tests/test_controller_status_projection.py +31 -0
  617. ldcon-0.2.0/tests/test_dashboard_activity.py +68 -0
  618. ldcon-0.2.0/tests/test_dashboard_polish.py +70 -0
  619. ldcon-0.2.0/tests/test_dashboard_workspace.cjs +93 -0
  620. ldcon-0.2.0/tests/test_decision_progress_prefix.py +21 -0
  621. ldcon-0.2.0/tests/test_display_state_consistency.cjs +38 -0
  622. ldcon-0.2.0/tests/test_dither_pause_20261027.py +502 -0
  623. ldcon-0.2.0/tests/test_dither_quality_review_20261028.py +231 -0
  624. ldcon-0.2.0/tests/test_dither_review_aggregation_20261028.py +97 -0
  625. ldcon-0.2.0/tests/test_dlc_pi_adjustment.py +151 -0
  626. ldcon-0.2.0/tests/test_dlc_pi_target_steps.py +86 -0
  627. ldcon-0.2.0/tests/test_dlc_response_policy.py +37 -0
  628. ldcon-0.2.0/tests/test_dlc_trace_state.py +33 -0
  629. ldcon-0.2.0/tests/test_dlcpro_adc_authority.py +82 -0
  630. ldcon-0.2.0/tests/test_dlcpro_awg.py +223 -0
  631. ldcon-0.2.0/tests/test_dlcpro_awg_async.py +174 -0
  632. ldcon-0.2.0/tests/test_dlcpro_awg_card.py +116 -0
  633. ldcon-0.2.0/tests/test_dlcpro_awg_enable.py +44 -0
  634. ldcon-0.2.0/tests/test_dlcpro_awg_identity.py +35 -0
  635. ldcon-0.2.0/tests/test_dlcpro_awg_protocol.py +94 -0
  636. ldcon-0.2.0/tests/test_dlcpro_awg_return.py +66 -0
  637. ldcon-0.2.0/tests/test_dlcpro_awg_tracking.py +200 -0
  638. ldcon-0.2.0/tests/test_dlcpro_awg_tracking_failures.py +218 -0
  639. ldcon-0.2.0/tests/test_dlcpro_awg_tracking_guard.py +114 -0
  640. ldcon-0.2.0/tests/test_dlcpro_awg_zero.py +173 -0
  641. ldcon-0.2.0/tests/test_dlcpro_console.py +203 -0
  642. ldcon-0.2.0/tests/test_dlcpro_fast_servo.py +130 -0
  643. ldcon-0.2.0/tests/test_dlcpro_ff_adjustment.py +240 -0
  644. ldcon-0.2.0/tests/test_dlcpro_ff_delta_adjustment.py +188 -0
  645. ldcon-0.2.0/tests/test_dlcpro_frequency_window.py +101 -0
  646. ldcon-0.2.0/tests/test_dlcpro_grafana.py +147 -0
  647. ldcon-0.2.0/tests/test_dlcpro_lock_input_window.py +109 -0
  648. ldcon-0.2.0/tests/test_dlcpro_native_scan_frequency.py +215 -0
  649. ldcon-0.2.0/tests/test_dlcpro_offline.py +488 -0
  650. ldcon-0.2.0/tests/test_dlcpro_pi_trial.py +97 -0
  651. ldcon-0.2.0/tests/test_dlcpro_target_api.py +489 -0
  652. ldcon-0.2.0/tests/test_dlcpro_target_api_fleet.py +102 -0
  653. ldcon-0.2.0/tests/test_dlcpro_target_api_routing.py +90 -0
  654. ldcon-0.2.0/tests/test_dlcpro_telemetry.py +86 -0
  655. ldcon-0.2.0/tests/test_dlcpro_tracking_io_budget.py +58 -0
  656. ldcon-0.2.0/tests/test_dlcpro_tracking_timing_io.py +165 -0
  657. ldcon-0.2.0/tests/test_dlcpro_udp.py +225 -0
  658. ldcon-0.2.0/tests/test_ecdl_branch_hop.py +158 -0
  659. ldcon-0.2.0/tests/test_ecdl_independent_pid.py +261 -0
  660. ldcon-0.2.0/tests/test_ecdl_ldc_target_ff.py +243 -0
  661. ldcon-0.2.0/tests/test_ecdl_owner_readopt.py +513 -0
  662. ldcon-0.2.0/tests/test_ecdl_owner_startup_adoption.py +227 -0
  663. ldcon-0.2.0/tests/test_ecdl_ready_target.py +47 -0
  664. ldcon-0.2.0/tests/test_ecdl_rearm_trim.py +308 -0
  665. ldcon-0.2.0/tests/test_ecdl_recovery_card.py +318 -0
  666. ldcon-0.2.0/tests/test_ecdl_settings_adopt.py +350 -0
  667. ldcon-0.2.0/tests/test_ecdl_target_settling.py +187 -0
  668. ldcon-0.2.0/tests/test_ecdl_tec_alignment_approach.py +480 -0
  669. ldcon-0.2.0/tests/test_effective_settings.py +205 -0
  670. ldcon-0.2.0/tests/test_emission.py +267 -0
  671. ldcon-0.2.0/tests/test_emission_native.py +34 -0
  672. ldcon-0.2.0/tests/test_entry_startup.py +760 -0
  673. ldcon-0.2.0/tests/test_failure_review.cjs +36 -0
  674. ldcon-0.2.0/tests/test_fleet_pdf_reports.py +60 -0
  675. ldcon-0.2.0/tests/test_gateway_defaults_ui.cjs +30 -0
  676. ldcon-0.2.0/tests/test_gateway_lan.py +119 -0
  677. ldcon-0.2.0/tests/test_gateway_notifications.py +100 -0
  678. ldcon-0.2.0/tests/test_gateway_presentation.cjs +33 -0
  679. ldcon-0.2.0/tests/test_gateway_presentation.py +15 -0
  680. ldcon-0.2.0/tests/test_http_request_ids.cjs +56 -0
  681. ldcon-0.2.0/tests/test_job_report.py +68 -0
  682. ldcon-0.2.0/tests/test_legacy_broker_projection.py +62 -0
  683. ldcon-0.2.0/tests/test_live_control_bulk.cjs +69 -0
  684. ldcon-0.2.0/tests/test_lock_target_correlation.py +177 -0
  685. ldcon-0.2.0/tests/test_measurement_acquisition.py +32 -0
  686. ldcon-0.2.0/tests/test_measurement_execution_integration.py +141 -0
  687. ldcon-0.2.0/tests/test_measurement_parameter_transactions.py +293 -0
  688. ldcon-0.2.0/tests/test_measurement_plan_authority.py +135 -0
  689. ldcon-0.2.0/tests/test_measurement_presets.py +61 -0
  690. ldcon-0.2.0/tests/test_midpoint_pilot.py +72 -0
  691. ldcon-0.2.0/tests/test_monitor_readback.py +102 -0
  692. ldcon-0.2.0/tests/test_moved_modules.py +120 -0
  693. ldcon-0.2.0/tests/test_native_assembly_adoption.py +294 -0
  694. ldcon-0.2.0/tests/test_native_background.py +631 -0
  695. ldcon-0.2.0/tests/test_native_integral_hotload.py +259 -0
  696. ldcon-0.2.0/tests/test_native_modulation_limits.py +314 -0
  697. ldcon-0.2.0/tests/test_native_owner_readopt.py +372 -0
  698. ldcon-0.2.0/tests/test_native_post_retarget_recentre.py +139 -0
  699. ldcon-0.2.0/tests/test_native_system_boundary.py +182 -0
  700. ldcon-0.2.0/tests/test_native_target_policy_update.py +143 -0
  701. ldcon-0.2.0/tests/test_notification_policy.py +345 -0
  702. ldcon-0.2.0/tests/test_opencode_mcp_lifetime.py +80 -0
  703. ldcon-0.2.0/tests/test_opencode_notification_queue.py +110 -0
  704. ldcon-0.2.0/tests/test_opencode_shared.py +116 -0
  705. ldcon-0.2.0/tests/test_operating_guidance_fleet.py +42 -0
  706. ldcon-0.2.0/tests/test_operating_mode_owner.py +234 -0
  707. ldcon-0.2.0/tests/test_operating_mode_routes.py +125 -0
  708. ldcon-0.2.0/tests/test_operating_point_latency.py +420 -0
  709. ldcon-0.2.0/tests/test_operating_point_readback_failure.py +13 -0
  710. ldcon-0.2.0/tests/test_operation_execution.py +88 -0
  711. ldcon-0.2.0/tests/test_operation_gateway.py +233 -0
  712. ldcon-0.2.0/tests/test_operation_history.py +343 -0
  713. ldcon-0.2.0/tests/test_operation_observation.py +48 -0
  714. ldcon-0.2.0/tests/test_operation_record_delivery.py +48 -0
  715. ldcon-0.2.0/tests/test_owner_projection.py +194 -0
  716. ldcon-0.2.0/tests/test_package_boundary.py +49 -0
  717. ldcon-0.2.0/tests/test_parameter_workspace.cjs +40 -0
  718. ldcon-0.2.0/tests/test_pi_algorithm_identity.py +47 -0
  719. ldcon-0.2.0/tests/test_pi_public_retirement.py +42 -0
  720. ldcon-0.2.0/tests/test_pi_release_update.py +207 -0
  721. ldcon-0.2.0/tests/test_pi_response_workflow.py +131 -0
  722. ldcon-0.2.0/tests/test_pi_trial_envelope_20261028.py +256 -0
  723. ldcon-0.2.0/tests/test_preflight_reference_resolution.py +28 -0
  724. ldcon-0.2.0/tests/test_projection_transport.py +163 -0
  725. ldcon-0.2.0/tests/test_public_examples.py +32 -0
  726. ldcon-0.2.0/tests/test_quality_baseline.py +407 -0
  727. ldcon-0.2.0/tests/test_quality_baseline_hooks.py +121 -0
  728. ldcon-0.2.0/tests/test_quality_report_only.py +218 -0
  729. ldcon-0.2.0/tests/test_quality_threshold_layout.py +35 -0
  730. ldcon-0.2.0/tests/test_recovery_decisions.py +87 -0
  731. ldcon-0.2.0/tests/test_recovery_explicit_policy.py +66 -0
  732. ldcon-0.2.0/tests/test_recovery_history.py +81 -0
  733. ldcon-0.2.0/tests/test_recovery_reference_v2.py +245 -0
  734. ldcon-0.2.0/tests/test_recovery_without_map_lookup.py +25 -0
  735. ldcon-0.2.0/tests/test_refresh_layout.cjs +83 -0
  736. ldcon-0.2.0/tests/test_report_policy.py +46 -0
  737. ldcon-0.2.0/tests/test_resident_adjustment.py +649 -0
  738. ldcon-0.2.0/tests/test_resident_adjustment_web.cjs +51 -0
  739. ldcon-0.2.0/tests/test_resident_quality_apply.py +145 -0
  740. ldcon-0.2.0/tests/test_response_algorithm_integration.py +118 -0
  741. ldcon-0.2.0/tests/test_response_comparison.py +35 -0
  742. ldcon-0.2.0/tests/test_rollout_site_boundaries.py +64 -0
  743. ldcon-0.2.0/tests/test_settling_profile_consumer.py +70 -0
  744. ldcon-0.2.0/tests/test_single_laser_layout.py +118 -0
  745. ldcon-0.2.0/tests/test_stationary_unlimited_recovery.py +47 -0
  746. ldcon-0.2.0/tests/test_steady_planner_hold_only.py +85 -0
  747. ldcon-0.2.0/tests/test_steady_recovery_retirement.py +41 -0
  748. ldcon-0.2.0/tests/test_study_adoption.py +83 -0
  749. ldcon-0.2.0/tests/test_study_execution.py +152 -0
  750. ldcon-0.2.0/tests/test_study_history_display.py +27 -0
  751. ldcon-0.2.0/tests/test_sweep_admission.py +37 -0
  752. ldcon-0.2.0/tests/test_sweep_ff_analysis.py +310 -0
  753. ldcon-0.2.0/tests/test_sweep_ff_optimization.py +218 -0
  754. ldcon-0.2.0/tests/test_sweep_ff_report.py +97 -0
  755. ldcon-0.2.0/tests/test_sweep_ff_transport.py +377 -0
  756. ldcon-0.2.0/tests/test_target_cancel_ui.cjs +37 -0
  757. ldcon-0.2.0/tests/test_target_feedforward.py +106 -0
  758. ldcon-0.2.0/tests/test_target_ff_completion.py +120 -0
  759. ldcon-0.2.0/tests/test_target_response.py +259 -0
  760. ldcon-0.2.0/tests/test_target_response_control.py +206 -0
  761. ldcon-0.2.0/tests/test_target_response_experiment.py +81 -0
  762. ldcon-0.2.0/tests/test_target_response_feedforward.py +75 -0
  763. ldcon-0.2.0/tests/test_target_response_search.py +168 -0
  764. ldcon-0.2.0/tests/test_target_response_shift.py +321 -0
  765. ldcon-0.2.0/tests/test_target_response_web.cjs +71 -0
  766. ldcon-0.2.0/tests/test_target_sequence.py +235 -0
  767. ldcon-0.2.0/tests/test_target_step_authority.py +118 -0
  768. ldcon-0.2.0/tests/test_target_text_formats.py +40 -0
  769. ldcon-0.2.0/tests/test_task_decisions.py +172 -0
  770. ldcon-0.2.0/tests/test_task_profile_ui.cjs +17 -0
  771. ldcon-0.2.0/tests/test_teams_destinations.py +168 -0
  772. ldcon-0.2.0/tests/test_teams_settings_ui.cjs +35 -0
  773. ldcon-0.2.0/tests/test_unified_quality.py +133 -0
  774. ldcon-0.2.0/tests/test_window_hop_boundary_20261027.py +345 -0
  775. ldcon-0.2.0/tests/test_window_observable_selection.py +68 -0
  776. ldcon-0.2.0/tests/test_workspace_inventory.py +25 -0
  777. ldcon-0.2.0/tests/test_workspace_selector.cjs +42 -0
  778. ldcon-0.2.0/tests/test_wsu_udp_monitor.py +84 -0
@@ -0,0 +1,358 @@
1
+ {
2
+ "filters_used": [
3
+ {
4
+ "path": "detect_secrets.filters.allowlist.is_line_allowlisted"
5
+ },
6
+ {
7
+ "path": "detect_secrets.filters.heuristic.is_indirect_reference"
8
+ },
9
+ {
10
+ "path": "detect_secrets.filters.heuristic.is_likely_id_string"
11
+ },
12
+ {
13
+ "path": "detect_secrets.filters.heuristic.is_lock_file"
14
+ },
15
+ {
16
+ "path": "detect_secrets.filters.heuristic.is_not_alphanumeric_string"
17
+ },
18
+ {
19
+ "path": "detect_secrets.filters.heuristic.is_potential_uuid"
20
+ },
21
+ {
22
+ "path": "detect_secrets.filters.heuristic.is_prefixed_with_dollar_sign"
23
+ },
24
+ {
25
+ "path": "detect_secrets.filters.heuristic.is_sequential_string"
26
+ },
27
+ {
28
+ "path": "detect_secrets.filters.heuristic.is_swagger_file"
29
+ },
30
+ {
31
+ "path": "detect_secrets.filters.heuristic.is_templated_secret"
32
+ }
33
+ ],
34
+ "generated_at": "2026-10-30T16:34:58Z",
35
+ "plugins_used": [
36
+ {
37
+ "name": "ArtifactoryDetector"
38
+ },
39
+ {
40
+ "name": "AWSKeyDetector"
41
+ },
42
+ {
43
+ "name": "AzureStorageKeyDetector"
44
+ },
45
+ {
46
+ "limit": 4.5,
47
+ "name": "Base64HighEntropyString"
48
+ },
49
+ {
50
+ "name": "BasicAuthDetector"
51
+ },
52
+ {
53
+ "name": "CloudantDetector"
54
+ },
55
+ {
56
+ "name": "DiscordBotTokenDetector"
57
+ },
58
+ {
59
+ "name": "GitHubTokenDetector"
60
+ },
61
+ {
62
+ "name": "GitLabTokenDetector"
63
+ },
64
+ {
65
+ "limit": 3.0,
66
+ "name": "HexHighEntropyString"
67
+ },
68
+ {
69
+ "name": "IbmCloudIamDetector"
70
+ },
71
+ {
72
+ "name": "IbmCosHmacDetector"
73
+ },
74
+ {
75
+ "name": "IPPublicDetector"
76
+ },
77
+ {
78
+ "name": "JwtTokenDetector"
79
+ },
80
+ {
81
+ "keyword_exclude": "",
82
+ "name": "KeywordDetector"
83
+ },
84
+ {
85
+ "name": "MailchimpDetector"
86
+ },
87
+ {
88
+ "name": "NpmDetector"
89
+ },
90
+ {
91
+ "name": "OpenAIDetector"
92
+ },
93
+ {
94
+ "name": "PrivateKeyDetector"
95
+ },
96
+ {
97
+ "name": "PypiTokenDetector"
98
+ },
99
+ {
100
+ "name": "SendGridDetector"
101
+ },
102
+ {
103
+ "name": "SlackDetector"
104
+ },
105
+ {
106
+ "name": "SoftlayerDetector"
107
+ },
108
+ {
109
+ "name": "SquareOAuthDetector"
110
+ },
111
+ {
112
+ "name": "StripeDetector"
113
+ },
114
+ {
115
+ "name": "TelegramBotTokenDetector"
116
+ },
117
+ {
118
+ "name": "TwilioKeyDetector"
119
+ }
120
+ ],
121
+ "results": {
122
+ "src/ldcon/migration/__init__.py": [
123
+ {
124
+ "filename": "src/ldcon/migration/__init__.py",
125
+ "hashed_secret": "938da42e6007a48a3a886cdf1071a42e5675bdf8",
126
+ "is_secret": false,
127
+ "is_verified": false,
128
+ "line_number": 451,
129
+ "type": "Base64 High Entropy String"
130
+ }
131
+ ],
132
+ "src/ldcon/resources/examples/lasers/sr422.yaml": [
133
+ {
134
+ "filename": "src/ldcon/resources/examples/lasers/sr422.yaml",
135
+ "hashed_secret": "dd56b8a612b3ae6be44f7ac7f46f66c70356546d",
136
+ "is_secret": false,
137
+ "is_verified": false,
138
+ "line_number": 184,
139
+ "type": "Hex High Entropy String"
140
+ }
141
+ ],
142
+ "src/ldcon/web_assets/teams-settings.js": [
143
+ {
144
+ "filename": "src/ldcon/web_assets/teams-settings.js",
145
+ "hashed_secret": "f9ac14b63a75faf57d8db6f919bfabb2502d273c",
146
+ "is_secret": false,
147
+ "is_verified": false,
148
+ "line_number": 49,
149
+ "type": "Secret Keyword"
150
+ }
151
+ ],
152
+ "tests/fixtures/effective-settings/golden-sr1092.json": [
153
+ {
154
+ "filename": "tests/fixtures/effective-settings/golden-sr1092.json",
155
+ "hashed_secret": "e2335e1e55b1adaa5bdae940f521458717720544",
156
+ "is_secret": false,
157
+ "is_verified": false,
158
+ "line_number": 4370,
159
+ "type": "Base64 High Entropy String"
160
+ }
161
+ ],
162
+ "tests/fixtures/effective-settings/golden-sr422.json": [
163
+ {
164
+ "filename": "tests/fixtures/effective-settings/golden-sr422.json",
165
+ "hashed_secret": "dd56b8a612b3ae6be44f7ac7f46f66c70356546d",
166
+ "is_secret": false,
167
+ "is_verified": false,
168
+ "line_number": 5210,
169
+ "type": "Hex High Entropy String"
170
+ },
171
+ {
172
+ "filename": "tests/fixtures/effective-settings/golden-sr422.json",
173
+ "hashed_secret": "83b5a8d244dbd7135f02aa108370fdaacab5242a",
174
+ "is_secret": false,
175
+ "is_verified": false,
176
+ "line_number": 6182,
177
+ "type": "Base64 High Entropy String"
178
+ },
179
+ {
180
+ "filename": "tests/fixtures/effective-settings/golden-sr422.json",
181
+ "hashed_secret": "e2335e1e55b1adaa5bdae940f521458717720544",
182
+ "is_secret": false,
183
+ "is_verified": false,
184
+ "line_number": 6598,
185
+ "type": "Base64 High Entropy String"
186
+ },
187
+ {
188
+ "filename": "tests/fixtures/effective-settings/golden-sr422.json",
189
+ "hashed_secret": "ad7f3310fd8f3945564996bc2e7d930002d7e3c8",
190
+ "is_secret": false,
191
+ "is_verified": false,
192
+ "line_number": 6992,
193
+ "type": "Base64 High Entropy String"
194
+ }
195
+ ],
196
+ "tests/fixtures/effective-settings/var/instrument-owners/bk4054b-51524H117/config.json": [
197
+ {
198
+ "filename": "tests/fixtures/effective-settings/var/instrument-owners/bk4054b-51524H117/config.json",
199
+ "hashed_secret": "83b5a8d244dbd7135f02aa108370fdaacab5242a",
200
+ "is_secret": false,
201
+ "is_verified": false,
202
+ "line_number": 51,
203
+ "type": "Base64 High Entropy String"
204
+ }
205
+ ],
206
+ "tests/fixtures/effective-settings/var/instrument-owners/sdg2042x-SDG2XFBCA00839/config.json": [
207
+ {
208
+ "filename": "tests/fixtures/effective-settings/var/instrument-owners/sdg2042x-SDG2XFBCA00839/config.json",
209
+ "hashed_secret": "e2335e1e55b1adaa5bdae940f521458717720544",
210
+ "is_secret": false,
211
+ "is_verified": false,
212
+ "line_number": 52,
213
+ "type": "Base64 High Entropy String"
214
+ }
215
+ ],
216
+ "tests/fixtures/effective-settings/var/instrument-owners/sdg2042x-SDG2XFBCA00845/config.json": [
217
+ {
218
+ "filename": "tests/fixtures/effective-settings/var/instrument-owners/sdg2042x-SDG2XFBCA00845/config.json",
219
+ "hashed_secret": "ad7f3310fd8f3945564996bc2e7d930002d7e3c8",
220
+ "is_secret": false,
221
+ "is_verified": false,
222
+ "line_number": 28,
223
+ "type": "Base64 High Entropy String"
224
+ }
225
+ ],
226
+ "tests/fixtures/effective-settings/var/lasers/sr422/config/lasers/sr422.yaml": [
227
+ {
228
+ "filename": "tests/fixtures/effective-settings/var/lasers/sr422/config/lasers/sr422.yaml",
229
+ "hashed_secret": "dd56b8a612b3ae6be44f7ac7f46f66c70356546d",
230
+ "is_secret": false,
231
+ "is_verified": false,
232
+ "line_number": 182,
233
+ "type": "Hex High Entropy String"
234
+ }
235
+ ],
236
+ "tests/support/jobs/tests/fixtures/live-20261022/lasers/sr422.yaml": [
237
+ {
238
+ "filename": "tests/support/jobs/tests/fixtures/live-20261022/lasers/sr422.yaml",
239
+ "hashed_secret": "dd56b8a612b3ae6be44f7ac7f46f66c70356546d",
240
+ "is_secret": false,
241
+ "is_verified": false,
242
+ "line_number": 189,
243
+ "type": "Hex High Entropy String"
244
+ }
245
+ ],
246
+ "tests/support/web/tests/fixtures/live-20261022/lasers/sr422.yaml": [
247
+ {
248
+ "filename": "tests/support/web/tests/fixtures/live-20261022/lasers/sr422.yaml",
249
+ "hashed_secret": "dd56b8a612b3ae6be44f7ac7f46f66c70356546d",
250
+ "is_secret": false,
251
+ "is_verified": false,
252
+ "line_number": 189,
253
+ "type": "Hex High Entropy String"
254
+ }
255
+ ],
256
+ "tests/test_claude_interactive_metadata.py": [
257
+ {
258
+ "filename": "tests/test_claude_interactive_metadata.py",
259
+ "hashed_secret": "fef9c12334500ee6f0af52e652542960af9c50cf",
260
+ "is_secret": false,
261
+ "is_verified": false,
262
+ "line_number": 73,
263
+ "type": "Secret Keyword"
264
+ }
265
+ ],
266
+ "tests/test_cld_system_boundary.py": [
267
+ {
268
+ "filename": "tests/test_cld_system_boundary.py",
269
+ "hashed_secret": "39c8d5f0563bf54769c131c67fe42a75cb315868",
270
+ "is_secret": false,
271
+ "is_verified": false,
272
+ "line_number": 24,
273
+ "type": "Base64 High Entropy String"
274
+ }
275
+ ],
276
+ "tests/test_config_two_layer_step34.py": [
277
+ {
278
+ "filename": "tests/test_config_two_layer_step34.py",
279
+ "hashed_secret": "fa570984cbeb1a32527a3a8ac1dbb4e50b6914d7",
280
+ "is_secret": false,
281
+ "is_verified": false,
282
+ "line_number": 518,
283
+ "type": "Base64 High Entropy String"
284
+ }
285
+ ],
286
+ "tests/test_gateway_lan.py": [
287
+ {
288
+ "filename": "tests/test_gateway_lan.py",
289
+ "hashed_secret": "b0b7ba4666a92774e0d1afe02f2e20982b307a35",
290
+ "is_secret": false,
291
+ "is_verified": false,
292
+ "line_number": 11,
293
+ "type": "Secret Keyword"
294
+ }
295
+ ],
296
+ "tests/test_operating_mode_routes.py": [
297
+ {
298
+ "filename": "tests/test_operating_mode_routes.py",
299
+ "hashed_secret": "40eb928cb00d19373ee235f171a5a76340e2d7c7",
300
+ "is_secret": false,
301
+ "is_verified": false,
302
+ "line_number": 79,
303
+ "type": "Secret Keyword"
304
+ }
305
+ ],
306
+ "tests/test_operation_history.py": [
307
+ {
308
+ "filename": "tests/test_operation_history.py",
309
+ "hashed_secret": "9a894c353739de9a0e85a2515b31777390ddda95",
310
+ "is_secret": false,
311
+ "is_verified": false,
312
+ "line_number": 16,
313
+ "type": "Secret Keyword"
314
+ },
315
+ {
316
+ "filename": "tests/test_operation_history.py",
317
+ "hashed_secret": "6c688927eafd673c7d9194b46b2b88e096e6c9f7",
318
+ "is_secret": false,
319
+ "is_verified": false,
320
+ "line_number": 56,
321
+ "type": "Hex High Entropy String"
322
+ },
323
+ {
324
+ "filename": "tests/test_operation_history.py",
325
+ "hashed_secret": "e4f91dd323bac5bfc4f60a6e433787671dc2421d",
326
+ "is_secret": false,
327
+ "is_verified": false,
328
+ "line_number": 104,
329
+ "type": "Hex High Entropy String"
330
+ },
331
+ {
332
+ "filename": "tests/test_operation_history.py",
333
+ "hashed_secret": "ff998abc1ce6d8f01a675fa197368e44c8916e9c",
334
+ "is_secret": false,
335
+ "is_verified": false,
336
+ "line_number": 108,
337
+ "type": "Hex High Entropy String"
338
+ },
339
+ {
340
+ "filename": "tests/test_operation_history.py",
341
+ "hashed_secret": "20f75c3aa3bbadf7a207aae154388b1b8060c7ad",
342
+ "is_secret": false,
343
+ "is_verified": false,
344
+ "line_number": 129,
345
+ "type": "Hex High Entropy String"
346
+ },
347
+ {
348
+ "filename": "tests/test_operation_history.py",
349
+ "hashed_secret": "99d72c7fc3e2e145870beab37c0b70e343ea9c3b",
350
+ "is_secret": false,
351
+ "is_verified": false,
352
+ "line_number": 209,
353
+ "type": "Secret Keyword"
354
+ }
355
+ ]
356
+ },
357
+ "version": "1.5.0"
358
+ }
ldcon-0.2.0/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 FanHarvard contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,8 @@
1
+ include LICENSE README.md
2
+ recursive-include docs *.html
3
+ recursive-include scripts *.py
4
+ recursive-include tests *.py *.cjs *.json *.yaml
5
+ recursive-include examples *.json
6
+ global-exclude __pycache__ *.py[cod] .env .pypirc *.pem *.key
7
+ include package.json package-lock.json
8
+ include .secrets.baseline
ldcon-0.2.0/PKG-INFO ADDED
@@ -0,0 +1,85 @@
1
+ Metadata-Version: 2.4
2
+ Name: ldcon
3
+ Version: 0.2.0
4
+ Summary: Laser operations, physical owners and fleet presentation
5
+ Author: FanHarvard contributors
6
+ License-Expression: MIT
7
+ Project-URL: Homepage, https://github.com/FanHarvard/ldcon
8
+ Project-URL: Repository, https://github.com/FanHarvard/ldcon
9
+ Project-URL: Issues, https://github.com/FanHarvard/ldcon/issues
10
+ Classifier: Development Status :: 3 - Alpha
11
+ Classifier: Programming Language :: Python :: 3
12
+ Classifier: Programming Language :: Python :: 3 :: Only
13
+ Classifier: Programming Language :: Python :: 3.10
14
+ Classifier: Programming Language :: Python :: 3.11
15
+ Classifier: Programming Language :: Python :: 3.12
16
+ Classifier: Programming Language :: Python :: 3.13
17
+ Classifier: Operating System :: POSIX :: Linux
18
+ Classifier: Topic :: Scientific/Engineering
19
+ Requires-Python: >=3.10
20
+ Description-Content-Type: text/markdown
21
+ License-File: LICENSE
22
+ Requires-Dist: experiment-core==0.1.0
23
+ Requires-Dist: numpy>=1.24
24
+ Requires-Dist: PyYAML<7,>=6
25
+ Provides-Extra: agents
26
+ Requires-Dist: fanharvard-agentbridge==0.1.0; extra == "agents"
27
+ Provides-Extra: instruments
28
+ Requires-Dist: pyvisa>=1.15; extra == "instruments"
29
+ Requires-Dist: pyvisa-py>=0.8; extra == "instruments"
30
+ Requires-Dist: pyusb>=1.2; extra == "instruments"
31
+ Requires-Dist: websocket-client<2,>=1.8; extra == "instruments"
32
+ Provides-Extra: web
33
+ Requires-Dist: fastapi<1,>=0.115; extra == "web"
34
+ Requires-Dist: uvicorn<1,>=0.30; extra == "web"
35
+ Requires-Dist: httpx<1,>=0.27; extra == "web"
36
+ Requires-Dist: websockets<18,>=15; extra == "web"
37
+ Provides-Extra: analysis
38
+ Requires-Dist: scipy>=1.10; extra == "analysis"
39
+ Dynamic: license-file
40
+
41
+ # LDCon
42
+
43
+ **Still in active development.**
44
+
45
+ Laser locking, characterization and a Web dashboard. **ECDL and DFB/DBR control
46
+ are implemented**, including ESP32-based native PI and TOPTICA DLCpro adapters.
47
+
48
+ ```sh
49
+ pip install "ldcon[web,instruments,analysis]"
50
+ ldcon-simulate --mode deterministic
51
+ ldcon-examples ./my-lab
52
+ ```
53
+
54
+ Python 3.10+ on Linux. `experiment-core` installs automatically. Optional agent
55
+ messaging: `pip install "ldcon[agents]"` (installs `fanharvard-agentbridge`).
56
+ Provider CLIs and their authentication are separate.
57
+
58
+ **Agents** monitor results, diagnose problems and run bounded characterization,
59
+ parameter tuning and recovery through registered control cards. **Humans** choose
60
+ the experiment, target, hardware configuration and physical safety limits, and
61
+ authorize safety-relevant changes. The fast feedback loop runs on the controller;
62
+ the agent is not the real-time servo.
63
+
64
+ **Locking and quality:** wavemeter feedback drives PI control of ECDL piezo or
65
+ DFB/DBR current; slower temperature/current corrections and feedforward are
66
+ available where configured. Quality is reported using frequency error/stability,
67
+ mode hops, position-independent fringe secondary peaks/width and dither response.
68
+ Missing data remains unknown; quality labels are distinct from physical safety.
69
+
70
+ | Configuration | Hardware |
71
+ | --- | --- |
72
+ | ECDL / ESP32 | Wavemeter and data feed, ESP32 servo DAC/firmware, piezo driver, current/TEC controllers and supported AWGs (e.g. Siglent SDG) |
73
+ | DFB/DBR | Wavemeter, current/TEC controller (e.g. Thorlabs CLD1015); ESP32 DAC and modulation input for native current PI |
74
+ | ECDL / DLCpro | TOPTICA DLCpro, wavemeter feedback; AWG/trigger connections for configured feedforward scans |
75
+ | Spectral quality / studies | Fringe image source for secondary-peak analysis; scope/telemetry and AWG where required by the selected measurement |
76
+
77
+ Tests use simulations, fake instruments and loopback services to cover control
78
+ contracts, owner exclusivity, uncertain writes, cancellation/recovery, tuning,
79
+ sweeps, configuration, quality reporting and Web behavior. They do not certify
80
+ a new physical setup. See [test suite](tests/).
81
+
82
+ [Bundled examples](src/ldcon/resources/examples/) include Sr422, Sr1092 and ThF685
83
+ laser definitions, decks and assignments, with output disabled and placeholder
84
+ connections. Installation starts no hardware or service and includes no credentials.
85
+ [Publishing](docs/publishing.html) · [MIT license](LICENSE)
ldcon-0.2.0/README.md ADDED
@@ -0,0 +1,45 @@
1
+ # LDCon
2
+
3
+ **Still in active development.**
4
+
5
+ Laser locking, characterization and a Web dashboard. **ECDL and DFB/DBR control
6
+ are implemented**, including ESP32-based native PI and TOPTICA DLCpro adapters.
7
+
8
+ ```sh
9
+ pip install "ldcon[web,instruments,analysis]"
10
+ ldcon-simulate --mode deterministic
11
+ ldcon-examples ./my-lab
12
+ ```
13
+
14
+ Python 3.10+ on Linux. `experiment-core` installs automatically. Optional agent
15
+ messaging: `pip install "ldcon[agents]"` (installs `fanharvard-agentbridge`).
16
+ Provider CLIs and their authentication are separate.
17
+
18
+ **Agents** monitor results, diagnose problems and run bounded characterization,
19
+ parameter tuning and recovery through registered control cards. **Humans** choose
20
+ the experiment, target, hardware configuration and physical safety limits, and
21
+ authorize safety-relevant changes. The fast feedback loop runs on the controller;
22
+ the agent is not the real-time servo.
23
+
24
+ **Locking and quality:** wavemeter feedback drives PI control of ECDL piezo or
25
+ DFB/DBR current; slower temperature/current corrections and feedforward are
26
+ available where configured. Quality is reported using frequency error/stability,
27
+ mode hops, position-independent fringe secondary peaks/width and dither response.
28
+ Missing data remains unknown; quality labels are distinct from physical safety.
29
+
30
+ | Configuration | Hardware |
31
+ | --- | --- |
32
+ | ECDL / ESP32 | Wavemeter and data feed, ESP32 servo DAC/firmware, piezo driver, current/TEC controllers and supported AWGs (e.g. Siglent SDG) |
33
+ | DFB/DBR | Wavemeter, current/TEC controller (e.g. Thorlabs CLD1015); ESP32 DAC and modulation input for native current PI |
34
+ | ECDL / DLCpro | TOPTICA DLCpro, wavemeter feedback; AWG/trigger connections for configured feedforward scans |
35
+ | Spectral quality / studies | Fringe image source for secondary-peak analysis; scope/telemetry and AWG where required by the selected measurement |
36
+
37
+ Tests use simulations, fake instruments and loopback services to cover control
38
+ contracts, owner exclusivity, uncertain writes, cancellation/recovery, tuning,
39
+ sweeps, configuration, quality reporting and Web behavior. They do not certify
40
+ a new physical setup. See [test suite](tests/).
41
+
42
+ [Bundled examples](src/ldcon/resources/examples/) include Sr422, Sr1092 and ThF685
43
+ laser definitions, decks and assignments, with output disabled and placeholder
44
+ connections. Installation starts no hardware or service and includes no credentials.
45
+ [Publishing](docs/publishing.html) · [MIT license](LICENSE)
@@ -0,0 +1,33 @@
1
+ <!doctype html><html lang="en"><meta charset="utf-8">
2
+ <meta name="viewport" content="width=device-width,initial-scale=1"><title>Publishing ldcon</title>
3
+ <style>body{font:16px/1.7 system-ui;max-width:900px;margin:3rem auto;padding:0 1rem}pre{background:#f2f4f6;padding:1rem;overflow:auto}code{font-size:.9em}</style>
4
+ <h1>Publishing ldcon</h1><p>Public repository: <a href="https://github.com/FanHarvard/ldcon">FanHarvard/ldcon</a>.
5
+ Initial version: 0.2.0. No production service is activated by publication.</p>
6
+ <h2>One-time PyPI setup</h2><p>A PyPI account owner creates a pending publisher at
7
+ <a href="https://pypi.org/manage/account/publishing/">PyPI publishing settings</a> with:</p>
8
+ <table><tr><th>Project name</th><td>ldcon</td></tr><tr><th>Owner</th><td>FanHarvard</td></tr>
9
+ <tr><th>Repository</th><td>ldcon</td></tr><tr><th>Workflow</th><td>release.yml</td></tr>
10
+ <tr><th>Environment</th><td>pypi</td></tr></table>
11
+ <p>Use the repository's <code>pypi</code> environment to restrict release access. Authentication uses
12
+ GitHub OIDC and PyPI Trusted Publishing; no long-lived PyPI API token belongs in this repository.
13
+ See the <a href="https://docs.pypi.org/trusted-publishers/creating-a-project-through-oidc/">official PyPI setup</a>.</p>
14
+ <h2>Release</h2><p>Publish experiment-core before LDCon. LDCon pins the verified compatible core version.
15
+ Update package metadata and the LDCon CI core tag together for a future version.</p>
16
+ <pre>python -m build
17
+ python -m twine check --strict dist/*
18
+ python scripts/check_dist.py dist
19
+ python scripts/check_secrets.py
20
+ python -m pytest -q
21
+ git tag v0.2.0
22
+ git push origin v0.2.0</pre>
23
+ <p>Create a GitHub Release for the tag to run <code>release.yml</code>, or dispatch that workflow at
24
+ the tag. The workflow checks the tag against package metadata, builds and audits distributions,
25
+ tests the wheel, and publishes through the dedicated environment. Do not reuse an uploaded PyPI version.
26
+ The CI workflow also checks Python 3.10, 3.12 and 3.13.</p>
27
+ <h2>Public/private boundary</h2><p>Public: source, tests, documentation, MIT license and reviewed examples.
28
+ Private: credentials, .env/.pypirc files, runtime databases, job logs, agent conversations,
29
+ approval receipts, local deployment history and live service configuration. New public repositories
30
+ start from a reviewed snapshot; the internal Git history is not uploaded.</p>
31
+ <p>The secret scanner compares findings against individually reviewed non-secret fixtures and code
32
+ literals in <code>.secrets.baseline</code>. New findings fail CI. This complements artifact inspection;
33
+ it is not a proof that arbitrary future data is safe to publish.</p></html>