orca-auto 6.0.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 (238) hide show
  1. orca_auto-6.0.0/LICENSE +21 -0
  2. orca_auto-6.0.0/MANIFEST.in +1 -0
  3. orca_auto-6.0.0/PKG-INFO +124 -0
  4. orca_auto-6.0.0/README.md +63 -0
  5. orca_auto-6.0.0/pyproject.toml +335 -0
  6. orca_auto-6.0.0/setup.cfg +4 -0
  7. orca_auto-6.0.0/src/orca_auto/__init__.py +11 -0
  8. orca_auto-6.0.0/src/orca_auto/_process_evidence.py +60 -0
  9. orca_auto-6.0.0/src/orca_auto/_version.py +45 -0
  10. orca_auto-6.0.0/src/orca_auto/activity/__init__.py +115 -0
  11. orca_auto-6.0.0/src/orca_auto/activity/_cancel.py +140 -0
  12. orca_auto-6.0.0/src/orca_auto/activity/_clear.py +142 -0
  13. orca_auto-6.0.0/src/orca_auto/activity/_collectors.py +104 -0
  14. orca_auto-6.0.0/src/orca_auto/activity/_list.py +65 -0
  15. orca_auto-6.0.0/src/orca_auto/activity/_orca.py +305 -0
  16. orca_auto-6.0.0/src/orca_auto/activity/_queue_records.py +244 -0
  17. orca_auto-6.0.0/src/orca_auto/activity/_sources.py +129 -0
  18. orca_auto-6.0.0/src/orca_auto/activity_labels.py +221 -0
  19. orca_auto-6.0.0/src/orca_auto/activity_rendering.py +171 -0
  20. orca_auto-6.0.0/src/orca_auto/activity_view.py +296 -0
  21. orca_auto-6.0.0/src/orca_auto/cli.py +90 -0
  22. orca_auto-6.0.0/src/orca_auto/cli_handlers.py +355 -0
  23. orca_auto-6.0.0/src/orca_auto/cli_parsers.py +476 -0
  24. orca_auto-6.0.0/src/orca_auto/cli_queue.py +527 -0
  25. orca_auto-6.0.0/src/orca_auto/cli_systemd_apply.py +147 -0
  26. orca_auto-6.0.0/src/orca_auto/cli_systemd_freshness.py +724 -0
  27. orca_auto-6.0.0/src/orca_auto/cli_systemd_restart.py +256 -0
  28. orca_auto-6.0.0/src/orca_auto/cli_systemd_restart_guard.py +219 -0
  29. orca_auto-6.0.0/src/orca_auto/cli_systemd_status.py +202 -0
  30. orca_auto-6.0.0/src/orca_auto/cli_systemd_units.py +212 -0
  31. orca_auto-6.0.0/src/orca_auto/cli_worker_supervision.py +273 -0
  32. orca_auto-6.0.0/src/orca_auto/cli_workers.py +323 -0
  33. orca_auto-6.0.0/src/orca_auto/core/__init__.py +1 -0
  34. orca_auto-6.0.0/src/orca_auto/core/activity.py +154 -0
  35. orca_auto-6.0.0/src/orca_auto/core/activity_icons.py +41 -0
  36. orca_auto-6.0.0/src/orca_auto/core/admission/__init__.py +73 -0
  37. orca_auto-6.0.0/src/orca_auto/core/admission/engine_process.py +486 -0
  38. orca_auto-6.0.0/src/orca_auto/core/admission/persistence.py +87 -0
  39. orca_auto-6.0.0/src/orca_auto/core/admission/records.py +159 -0
  40. orca_auto-6.0.0/src/orca_auto/core/admission/store.py +838 -0
  41. orca_auto-6.0.0/src/orca_auto/core/app_ids.py +20 -0
  42. orca_auto-6.0.0/src/orca_auto/core/artifacts.py +44 -0
  43. orca_auto-6.0.0/src/orca_auto/core/commands/__init__.py +1 -0
  44. orca_auto-6.0.0/src/orca_auto/core/commands/queue.py +155 -0
  45. orca_auto-6.0.0/src/orca_auto/core/commands/run_dir.py +332 -0
  46. orca_auto-6.0.0/src/orca_auto/core/commands/worker_options.py +21 -0
  47. orca_auto-6.0.0/src/orca_auto/core/config/__init__.py +22 -0
  48. orca_auto-6.0.0/src/orca_auto/core/config/bounded_yaml.py +140 -0
  49. orca_auto-6.0.0/src/orca_auto/core/config/discovery.py +73 -0
  50. orca_auto-6.0.0/src/orca_auto/core/config/engines.py +305 -0
  51. orca_auto-6.0.0/src/orca_auto/core/config/files.py +386 -0
  52. orca_auto-6.0.0/src/orca_auto/core/config/schema.py +342 -0
  53. orca_auto-6.0.0/src/orca_auto/core/config/scratch.py +46 -0
  54. orca_auto-6.0.0/src/orca_auto/core/engine_catalog.py +179 -0
  55. orca_auto-6.0.0/src/orca_auto/core/engine_process.py +421 -0
  56. orca_auto-6.0.0/src/orca_auto/core/engine_runner.py +457 -0
  57. orca_auto-6.0.0/src/orca_auto/core/engine_runtime.py +57 -0
  58. orca_auto-6.0.0/src/orca_auto/core/engine_scratch.py +1513 -0
  59. orca_auto-6.0.0/src/orca_auto/core/engines/__init__.py +50 -0
  60. orca_auto-6.0.0/src/orca_auto/core/engines/artifacts.py +173 -0
  61. orca_auto-6.0.0/src/orca_auto/core/engines/command_result.py +67 -0
  62. orca_auto-6.0.0/src/orca_auto/core/engines/definition_builder.py +164 -0
  63. orca_auto-6.0.0/src/orca_auto/core/engines/definitions.py +82 -0
  64. orca_auto-6.0.0/src/orca_auto/core/engines/identity.py +59 -0
  65. orca_auto-6.0.0/src/orca_auto/core/engines/queue_worker.py +205 -0
  66. orca_auto-6.0.0/src/orca_auto/core/engines/registry.py +22 -0
  67. orca_auto-6.0.0/src/orca_auto/core/engines/worker_child.py +109 -0
  68. orca_auto-6.0.0/src/orca_auto/core/extensions.py +50 -0
  69. orca_auto-6.0.0/src/orca_auto/core/geometry_limits.py +9 -0
  70. orca_auto-6.0.0/src/orca_auto/core/indexing/__init__.py +25 -0
  71. orca_auto-6.0.0/src/orca_auto/core/indexing/engine_artifacts.py +323 -0
  72. orca_auto-6.0.0/src/orca_auto/core/indexing/engine_job_locations.py +129 -0
  73. orca_auto-6.0.0/src/orca_auto/core/indexing/engine_records.py +156 -0
  74. orca_auto-6.0.0/src/orca_auto/core/indexing/engines.py +16 -0
  75. orca_auto-6.0.0/src/orca_auto/core/indexing/location.py +17 -0
  76. orca_auto-6.0.0/src/orca_auto/core/indexing/roots.py +168 -0
  77. orca_auto-6.0.0/src/orca_auto/core/indexing/store.py +260 -0
  78. orca_auto-6.0.0/src/orca_auto/core/machine_observation.py +296 -0
  79. orca_auto-6.0.0/src/orca_auto/core/messaging/__init__.py +73 -0
  80. orca_auto-6.0.0/src/orca_auto/core/messaging/channel.py +33 -0
  81. orca_auto-6.0.0/src/orca_auto/core/messaging/config_io.py +61 -0
  82. orca_auto-6.0.0/src/orca_auto/core/messaging/discord_bot.py +155 -0
  83. orca_auto-6.0.0/src/orca_auto/core/messaging/discord_http.py +120 -0
  84. orca_auto-6.0.0/src/orca_auto/core/messaging/registry.py +50 -0
  85. orca_auto-6.0.0/src/orca_auto/core/messaging/render_discord.py +241 -0
  86. orca_auto-6.0.0/src/orca_auto/core/messaging/richtext.py +139 -0
  87. orca_auto-6.0.0/src/orca_auto/core/notifications/__init__.py +2 -0
  88. orca_auto-6.0.0/src/orca_auto/core/notifications/engines.py +278 -0
  89. orca_auto-6.0.0/src/orca_auto/core/paths/__init__.py +55 -0
  90. orca_auto-6.0.0/src/orca_auto/core/paths/reserved.py +149 -0
  91. orca_auto-6.0.0/src/orca_auto/core/paths/validation.py +251 -0
  92. orca_auto-6.0.0/src/orca_auto/core/paths/workflow.py +327 -0
  93. orca_auto-6.0.0/src/orca_auto/core/queue/__init__.py +78 -0
  94. orca_auto-6.0.0/src/orca_auto/core/queue/cancellable.py +269 -0
  95. orca_auto-6.0.0/src/orca_auto/core/queue/child/__init__.py +1 -0
  96. orca_auto-6.0.0/src/orca_auto/core/queue/child/execution.py +101 -0
  97. orca_auto-6.0.0/src/orca_auto/core/queue/child/process.py +220 -0
  98. orca_auto-6.0.0/src/orca_auto/core/queue/dependencies.py +71 -0
  99. orca_auto-6.0.0/src/orca_auto/core/queue/engine/__init__.py +1 -0
  100. orca_auto-6.0.0/src/orca_auto/core/queue/engine/admission.py +139 -0
  101. orca_auto-6.0.0/src/orca_auto/core/queue/engine/artifacts.py +670 -0
  102. orca_auto-6.0.0/src/orca_auto/core/queue/engine/child.py +184 -0
  103. orca_auto-6.0.0/src/orca_auto/core/queue/engine/execution.py +123 -0
  104. orca_auto-6.0.0/src/orca_auto/core/queue/engine/input_snapshot.py +762 -0
  105. orca_auto-6.0.0/src/orca_auto/core/queue/engine/lifecycle.py +47 -0
  106. orca_auto-6.0.0/src/orca_auto/core/queue/engine/runtime.py +389 -0
  107. orca_auto-6.0.0/src/orca_auto/core/queue/engine/snapshot_intent.py +720 -0
  108. orca_auto-6.0.0/src/orca_auto/core/queue/engine/worker_execution.py +348 -0
  109. orca_auto-6.0.0/src/orca_auto/core/queue/enqueue_publication.py +783 -0
  110. orca_auto-6.0.0/src/orca_auto/core/queue/execution.py +184 -0
  111. orca_auto-6.0.0/src/orca_auto/core/queue/generation.py +134 -0
  112. orca_auto-6.0.0/src/orca_auto/core/queue/lifecycle/__init__.py +75 -0
  113. orca_auto-6.0.0/src/orca_auto/core/queue/lifecycle/hooks.py +80 -0
  114. orca_auto-6.0.0/src/orca_auto/core/queue/lifecycle/reconcile.py +136 -0
  115. orca_auto-6.0.0/src/orca_auto/core/queue/lifecycle/shutdown.py +250 -0
  116. orca_auto-6.0.0/src/orca_auto/core/queue/lifecycle/terminal.py +261 -0
  117. orca_auto-6.0.0/src/orca_auto/core/queue/metadata.py +105 -0
  118. orca_auto-6.0.0/src/orca_auto/core/queue/persistence.py +178 -0
  119. orca_auto-6.0.0/src/orca_auto/core/queue/priority.py +25 -0
  120. orca_auto-6.0.0/src/orca_auto/core/queue/processes.py +327 -0
  121. orca_auto-6.0.0/src/orca_auto/core/queue/publication.py +150 -0
  122. orca_auto-6.0.0/src/orca_auto/core/queue/resource_requests.py +37 -0
  123. orca_auto-6.0.0/src/orca_auto/core/queue/store.py +1016 -0
  124. orca_auto-6.0.0/src/orca_auto/core/queue/terminal_sync.py +156 -0
  125. orca_auto-6.0.0/src/orca_auto/core/queue/types.py +30 -0
  126. orca_auto-6.0.0/src/orca_auto/core/queue/worker/__init__.py +90 -0
  127. orca_auto-6.0.0/src/orca_auto/core/queue/worker/admission.py +302 -0
  128. orca_auto-6.0.0/src/orca_auto/core/queue/worker/execution_dependencies.py +93 -0
  129. orca_auto-6.0.0/src/orca_auto/core/queue/worker/loop.py +222 -0
  130. orca_auto-6.0.0/src/orca_auto/core/queue/worker/models.py +49 -0
  131. orca_auto-6.0.0/src/orca_auto/core/queue/worker/process.py +509 -0
  132. orca_auto-6.0.0/src/orca_auto/core/state/__init__.py +1 -0
  133. orca_auto-6.0.0/src/orca_auto/core/state/engine.py +315 -0
  134. orca_auto-6.0.0/src/orca_auto/core/statuses.py +142 -0
  135. orca_auto-6.0.0/src/orca_auto/core/terminal.py +162 -0
  136. orca_auto-6.0.0/src/orca_auto/core/utils/__init__.py +51 -0
  137. orca_auto-6.0.0/src/orca_auto/core/utils/coercion.py +118 -0
  138. orca_auto-6.0.0/src/orca_auto/core/utils/lock.py +130 -0
  139. orca_auto-6.0.0/src/orca_auto/core/utils/persistence.py +192 -0
  140. orca_auto-6.0.0/src/orca_auto/core/utils/process.py +297 -0
  141. orca_auto-6.0.0/src/orca_auto/core/utils/process_tracking.py +80 -0
  142. orca_auto-6.0.0/src/orca_auto/core/workflow_identity.py +12 -0
  143. orca_auto-6.0.0/src/orca_auto/orca/__init__.py +1 -0
  144. orca_auto-6.0.0/src/orca_auto/orca/admission_env.py +11 -0
  145. orca_auto-6.0.0/src/orca_auto/orca/attempt/__init__.py +1 -0
  146. orca_auto-6.0.0/src/orca_auto/orca/attempt/engine.py +452 -0
  147. orca_auto-6.0.0/src/orca_auto/orca/attempt/notifications.py +59 -0
  148. orca_auto-6.0.0/src/orca_auto/orca/attempt/reporting.py +262 -0
  149. orca_auto-6.0.0/src/orca_auto/orca/attempt/resume.py +95 -0
  150. orca_auto-6.0.0/src/orca_auto/orca/cli_logging.py +44 -0
  151. orca_auto-6.0.0/src/orca_auto/orca/commands/__init__.py +0 -0
  152. orca_auto-6.0.0/src/orca_auto/orca/commands/init.py +369 -0
  153. orca_auto-6.0.0/src/orca_auto/orca/commands/queue.py +53 -0
  154. orca_auto-6.0.0/src/orca_auto/orca/commands/run_inp.py +92 -0
  155. orca_auto-6.0.0/src/orca_auto/orca/completion_rules.py +41 -0
  156. orca_auto-6.0.0/src/orca_auto/orca/config.py +184 -0
  157. orca_auto-6.0.0/src/orca_auto/orca/config_validation.py +44 -0
  158. orca_auto-6.0.0/src/orca_auto/orca/direct_cancel.py +211 -0
  159. orca_auto-6.0.0/src/orca_auto/orca/engine.py +37 -0
  160. orca_auto-6.0.0/src/orca_auto/orca/evidence.py +161 -0
  161. orca_auto-6.0.0/src/orca_auto/orca/execution.py +496 -0
  162. orca_auto-6.0.0/src/orca_auto/orca/execution_binding.py +1857 -0
  163. orca_auto-6.0.0/src/orca_auto/orca/frequencies.py +298 -0
  164. orca_auto-6.0.0/src/orca_auto/orca/inp_rewriter.py +120 -0
  165. orca_auto-6.0.0/src/orca_auto/orca/input_artifacts.py +81 -0
  166. orca_auto-6.0.0/src/orca_auto/orca/input_blocks.py +725 -0
  167. orca_auto-6.0.0/src/orca_auto/orca/input_references.py +291 -0
  168. orca_auto-6.0.0/src/orca_auto/orca/job_locations/__init__.py +31 -0
  169. orca_auto-6.0.0/src/orca_auto/orca/job_locations/_artifacts.py +126 -0
  170. orca_auto-6.0.0/src/orca_auto/orca/job_locations/_contract_context.py +170 -0
  171. orca_auto-6.0.0/src/orca_auto/orca/job_locations/_contract_payload.py +592 -0
  172. orca_auto-6.0.0/src/orca_auto/orca/job_locations/_generation.py +148 -0
  173. orca_auto-6.0.0/src/orca_auto/orca/job_locations/_models.py +73 -0
  174. orca_auto-6.0.0/src/orca_auto/orca/job_locations/_records.py +363 -0
  175. orca_auto-6.0.0/src/orca_auto/orca/job_locations/_runtime_context.py +753 -0
  176. orca_auto-6.0.0/src/orca_auto/orca/job_locations/_tracking.py +37 -0
  177. orca_auto-6.0.0/src/orca_auto/orca/job_locations/_utils.py +276 -0
  178. orca_auto-6.0.0/src/orca_auto/orca/job_type.py +29 -0
  179. orca_auto-6.0.0/src/orca_auto/orca/launch_gate.py +88 -0
  180. orca_auto-6.0.0/src/orca_auto/orca/molecule_key.py +156 -0
  181. orca_auto-6.0.0/src/orca_auto/orca/notifications.py +172 -0
  182. orca_auto-6.0.0/src/orca_auto/orca/orca_chemistry.py +114 -0
  183. orca_auto-6.0.0/src/orca_auto/orca/orca_opt_progress.py +73 -0
  184. orca_auto-6.0.0/src/orca_auto/orca/orca_runner.py +531 -0
  185. orca_auto-6.0.0/src/orca_auto/orca/out_analyzer.py +384 -0
  186. orca_auto-6.0.0/src/orca_auto/orca/output_status.py +82 -0
  187. orca_auto-6.0.0/src/orca_auto/orca/parser/__init__.py +270 -0
  188. orca_auto-6.0.0/src/orca_auto/orca/parser/extractors.py +173 -0
  189. orca_auto-6.0.0/src/orca_auto/orca/parser/io.py +33 -0
  190. orca_auto-6.0.0/src/orca_auto/orca/parser/patterns.py +175 -0
  191. orca_auto-6.0.0/src/orca_auto/orca/queue/__init__.py +1 -0
  192. orca_auto-6.0.0/src/orca_auto/orca/queue/adapter.py +794 -0
  193. orca_auto-6.0.0/src/orca_auto/orca/queue/cancellation.py +96 -0
  194. orca_auto-6.0.0/src/orca_auto/orca/queue/entries.py +154 -0
  195. orca_auto-6.0.0/src/orca_auto/orca/queue/orphans.py +285 -0
  196. orca_auto-6.0.0/src/orca_auto/orca/queue/publication_repair.py +204 -0
  197. orca_auto-6.0.0/src/orca_auto/orca/queue/replay.py +1372 -0
  198. orca_auto-6.0.0/src/orca_auto/orca/queue/terminal_replay.py +194 -0
  199. orca_auto-6.0.0/src/orca_auto/orca/queue/worker.py +311 -0
  200. orca_auto-6.0.0/src/orca_auto/orca/queue/worker_runtime.py +85 -0
  201. orca_auto-6.0.0/src/orca_auto/orca/queue/worker_tracking.py +243 -0
  202. orca_auto-6.0.0/src/orca_auto/orca/relaxed_scan.py +251 -0
  203. orca_auto-6.0.0/src/orca_auto/orca/report/__init__.py +60 -0
  204. orca_auto-6.0.0/src/orca_auto/orca/report/attempts.py +137 -0
  205. orca_auto-6.0.0/src/orca_auto/orca/report/composer.py +281 -0
  206. orca_auto-6.0.0/src/orca_auto/orca/report/frequencies.py +50 -0
  207. orca_auto-6.0.0/src/orca_auto/orca/report/interaction_energy.py +322 -0
  208. orca_auto-6.0.0/src/orca_auto/orca/report/irc.py +775 -0
  209. orca_auto-6.0.0/src/orca_auto/orca/report/neb.py +760 -0
  210. orca_auto-6.0.0/src/orca_auto/orca/report/opt.py +299 -0
  211. orca_auto-6.0.0/src/orca_auto/orca/report/render.py +307 -0
  212. orca_auto-6.0.0/src/orca_auto/orca/report/rmsd.py +366 -0
  213. orca_auto-6.0.0/src/orca_auto/orca/report/scan.py +304 -0
  214. orca_auto-6.0.0/src/orca_auto/orca/report/settings.py +52 -0
  215. orca_auto-6.0.0/src/orca_auto/orca/report/si.py +176 -0
  216. orca_auto-6.0.0/src/orca_auto/orca/report/sp.py +243 -0
  217. orca_auto-6.0.0/src/orca_auto/orca/resource_directives.py +239 -0
  218. orca_auto-6.0.0/src/orca_auto/orca/run_cleanup.py +275 -0
  219. orca_auto-6.0.0/src/orca_auto/orca/run_context.py +241 -0
  220. orca_auto-6.0.0/src/orca_auto/orca/run_lock.py +37 -0
  221. orca_auto-6.0.0/src/orca_auto/orca/run_snapshot.py +328 -0
  222. orca_auto-6.0.0/src/orca_auto/orca/scratch.py +41 -0
  223. orca_auto-6.0.0/src/orca_auto/orca/state.py +550 -0
  224. orca_auto-6.0.0/src/orca_auto/orca/state_machine.py +99 -0
  225. orca_auto-6.0.0/src/orca_auto/orca/state_reading.py +442 -0
  226. orca_auto-6.0.0/src/orca_auto/orca/statuses.py +25 -0
  227. orca_auto-6.0.0/src/orca_auto/orca/submission.py +640 -0
  228. orca_auto-6.0.0/src/orca_auto/orca/types.py +90 -0
  229. orca_auto-6.0.0/src/orca_auto/orca/worker_execution.py +806 -0
  230. orca_auto-6.0.0/src/orca_auto/py.typed +1 -0
  231. orca_auto-6.0.0/src/orca_auto/systemd_plan.py +515 -0
  232. orca_auto-6.0.0/src/orca_auto/terminal_table.py +206 -0
  233. orca_auto-6.0.0/src/orca_auto.egg-info/PKG-INFO +124 -0
  234. orca_auto-6.0.0/src/orca_auto.egg-info/SOURCES.txt +236 -0
  235. orca_auto-6.0.0/src/orca_auto.egg-info/dependency_links.txt +1 -0
  236. orca_auto-6.0.0/src/orca_auto.egg-info/entry_points.txt +2 -0
  237. orca_auto-6.0.0/src/orca_auto.egg-info/requires.txt +15 -0
  238. orca_auto-6.0.0/src/orca_auto.egg-info/top_level.txt +1 -0
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Daehyup Sohn
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 @@
1
+ prune extensions
@@ -0,0 +1,124 @@
1
+ Metadata-Version: 2.4
2
+ Name: orca_auto
3
+ Version: 6.0.0
4
+ Summary: ORCA_auto core: durable ORCA queues and supervised execution
5
+ Author: Daehyup Sohn
6
+ License: MIT License
7
+
8
+ Copyright (c) 2026 Daehyup Sohn
9
+
10
+ Permission is hereby granted, free of charge, to any person obtaining a copy
11
+ of this software and associated documentation files (the "Software"), to deal
12
+ in the Software without restriction, including without limitation the rights
13
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
14
+ copies of the Software, and to permit persons to whom the Software is
15
+ furnished to do so, subject to the following conditions:
16
+
17
+ The above copyright notice and this permission notice shall be included in all
18
+ copies or substantial portions of the Software.
19
+
20
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
21
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
22
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
23
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
24
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
25
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
26
+ SOFTWARE.
27
+
28
+ Project-URL: Homepage, https://github.com/dhsohn/orca_auto
29
+ Project-URL: Repository, https://github.com/dhsohn/orca_auto
30
+ Project-URL: Issues, https://github.com/dhsohn/orca_auto/issues
31
+ Project-URL: Documentation, https://github.com/dhsohn/orca_auto/blob/v6.0.0/docs/INSTALLATION.md
32
+ Project-URL: Changelog, https://github.com/dhsohn/orca_auto/blob/v6.0.0/CHANGELOG.md
33
+ Keywords: orca,dft,computational-chemistry,workflow-automation,cli
34
+ Classifier: Development Status :: 5 - Production/Stable
35
+ Classifier: Environment :: Console
36
+ Classifier: Intended Audience :: Science/Research
37
+ Classifier: License :: OSI Approved :: MIT License
38
+ Classifier: Operating System :: POSIX :: Linux
39
+ Classifier: Programming Language :: Python :: 3
40
+ Classifier: Programming Language :: Python :: 3.11
41
+ Classifier: Programming Language :: Python :: 3.12
42
+ Classifier: Programming Language :: Python :: 3.13
43
+ Classifier: Topic :: Scientific/Engineering :: Chemistry
44
+ Requires-Python: >=3.11
45
+ Description-Content-Type: text/markdown
46
+ License-File: LICENSE
47
+ Requires-Dist: PyYAML>=6.0.1
48
+ Provides-Extra: workflows
49
+ Requires-Dist: orca_auto_workflows==6.0.0; extra == "workflows"
50
+ Provides-Extra: dev
51
+ Requires-Dist: build>=1.2.2; extra == "dev"
52
+ Requires-Dist: setuptools>=68.0; extra == "dev"
53
+ Requires-Dist: wheel>=0.45.1; extra == "dev"
54
+ Requires-Dist: import-linter>=2.12; extra == "dev"
55
+ Requires-Dist: mypy>=1.19.1; extra == "dev"
56
+ Requires-Dist: pytest>=9.0; extra == "dev"
57
+ Requires-Dist: pytest-cov>=7.0.0; extra == "dev"
58
+ Requires-Dist: ruff>=0.15.5; extra == "dev"
59
+ Requires-Dist: types-PyYAML>=6.0.12; extra == "dev"
60
+ Dynamic: license-file
61
+
62
+ <p align="center">
63
+ <img src="https://raw.githubusercontent.com/dhsohn/orca_auto/v6.0.0/docs/images/banner.svg" alt="ORCA_auto — Submit durably. Execute reliably. Recover explicitly." width="680">
64
+ </p>
65
+
66
+ <p align="center">
67
+ <a href="https://github.com/dhsohn/orca_auto/actions/workflows/ci.yml"><img src="https://github.com/dhsohn/orca_auto/actions/workflows/ci.yml/badge.svg" alt="CI"></a>
68
+ <a href="https://github.com/dhsohn/orca_auto/releases/latest"><img src="https://img.shields.io/github/v/release/dhsohn/orca_auto" alt="Release"></a>
69
+ <a href="https://www.python.org/"><img src="https://img.shields.io/badge/python-3.11%2B-blue.svg" alt="Python 3.11+"></a>
70
+ <a href="https://github.com/dhsohn/orca_auto/blob/v6.0.0/LICENSE"><img src="https://img.shields.io/badge/License-MIT-blue.svg" alt="License: MIT"></a>
71
+ </p>
72
+
73
+ <p align="center"><b>English</b> · <a href="https://github.com/dhsohn/orca_auto/blob/v6.0.0/README.ko.md">한국어</a></p>
74
+
75
+ ORCA_auto is a **queue-first runner for ORCA** on Linux/WSL.
76
+ Submit calculations to a durable queue, follow their progress, and inspect
77
+ recorded results and recovery decisions. Input design and chemical judgment
78
+ stay with you.
79
+
80
+ ## Features
81
+
82
+ - **Submit and close the terminal.** A successful submission saves the job to
83
+ disk; a supervised worker handles execution.
84
+ - **See what happened.** Check queue status from the CLI and inspect saved
85
+ calculation reports and failure reasons.
86
+ - **Recover with evidence.** Worker or host interruptions follow verified
87
+ recovery paths. Failed ORCA calculations are not automatically retried.
88
+
89
+ ## Get started
90
+
91
+ Python **3.11+**, Linux/WSL2, and a separately installed ORCA engine are
92
+ required. Supervised workers use `systemd`.
93
+
94
+ ```bash
95
+ python -m pip install orca_auto==6.0.0
96
+ ```
97
+
98
+ - **[Installation details](https://github.com/dhsohn/orca_auto/blob/v6.0.0/docs/INSTALLATION.md)** — install Core from PyPI in a fresh environment.
99
+ - **[Set up workers and submit your first job](https://github.com/dhsohn/orca_auto/blob/v6.0.0/docs/QUICKSTART.md)** — configure a
100
+ source checkout, start services, and inspect the queue.
101
+
102
+ **Upgrading?** Keep running calculations on their current environment. Switch
103
+ only in an idle window; see the [upgrade guide](https://github.com/dhsohn/orca_auto/blob/v6.0.0/docs/RELEASE.md#removing-ts-workflows-in-60).
104
+
105
+ ## In the same chemistry ecosystem
106
+
107
+ [Chemvas](https://github.com/dhsohn/Chemvas) for chemical drawings,
108
+ **ORCA_auto** for calculation execution, and
109
+ [LLMdocx](https://github.com/dhsohn/LLMdocx) for research documents are
110
+ independent, local-first companion tools. Data handoffs require explicit
111
+ conversion—not an automatic end-to-end integration.
112
+ [How the tools connect →](https://github.com/dhsohn/orca_auto/blob/v6.0.0/docs/RELATED_WORK.md#local-first-companion-tools)
113
+
114
+ ## Documentation
115
+
116
+ [Command reference](https://github.com/dhsohn/orca_auto/blob/v6.0.0/docs/REFERENCE.md) · [Runtime contracts](https://github.com/dhsohn/orca_auto/blob/v6.0.0/docs/PUBLIC_CONTRACTS.md) ·
117
+ [Architecture](https://github.com/dhsohn/orca_auto/blob/v6.0.0/docs/ARCHITECTURE.md) · [Services](https://github.com/dhsohn/orca_auto/blob/v6.0.0/systemd/README.md) ·
118
+ [Discord notifications](https://github.com/dhsohn/orca_auto/blob/v6.0.0/docs/DISCORD_SETUP.md)
119
+
120
+ [Development](https://github.com/dhsohn/orca_auto/blob/v6.0.0/docs/DEVELOPMENT.md) · [Validation](https://github.com/dhsohn/orca_auto/blob/v6.0.0/docs/VALIDATION.md) ·
121
+ [Roadmap](https://github.com/dhsohn/orca_auto/blob/v6.0.0/ROADMAP.md) · [Changelog](https://github.com/dhsohn/orca_auto/blob/v6.0.0/CHANGELOG.md)
122
+
123
+ [Citation](https://github.com/dhsohn/orca_auto/blob/v6.0.0/CITATION.cff) · [Contributing](https://github.com/dhsohn/orca_auto/blob/v6.0.0/CONTRIBUTING.md) ·
124
+ [Support](https://github.com/dhsohn/orca_auto/blob/v6.0.0/SUPPORT.md) · [Security](https://github.com/dhsohn/orca_auto/blob/v6.0.0/SECURITY.md)
@@ -0,0 +1,63 @@
1
+ <p align="center">
2
+ <img src="https://raw.githubusercontent.com/dhsohn/orca_auto/v6.0.0/docs/images/banner.svg" alt="ORCA_auto — Submit durably. Execute reliably. Recover explicitly." width="680">
3
+ </p>
4
+
5
+ <p align="center">
6
+ <a href="https://github.com/dhsohn/orca_auto/actions/workflows/ci.yml"><img src="https://github.com/dhsohn/orca_auto/actions/workflows/ci.yml/badge.svg" alt="CI"></a>
7
+ <a href="https://github.com/dhsohn/orca_auto/releases/latest"><img src="https://img.shields.io/github/v/release/dhsohn/orca_auto" alt="Release"></a>
8
+ <a href="https://www.python.org/"><img src="https://img.shields.io/badge/python-3.11%2B-blue.svg" alt="Python 3.11+"></a>
9
+ <a href="https://github.com/dhsohn/orca_auto/blob/v6.0.0/LICENSE"><img src="https://img.shields.io/badge/License-MIT-blue.svg" alt="License: MIT"></a>
10
+ </p>
11
+
12
+ <p align="center"><b>English</b> · <a href="https://github.com/dhsohn/orca_auto/blob/v6.0.0/README.ko.md">한국어</a></p>
13
+
14
+ ORCA_auto is a **queue-first runner for ORCA** on Linux/WSL.
15
+ Submit calculations to a durable queue, follow their progress, and inspect
16
+ recorded results and recovery decisions. Input design and chemical judgment
17
+ stay with you.
18
+
19
+ ## Features
20
+
21
+ - **Submit and close the terminal.** A successful submission saves the job to
22
+ disk; a supervised worker handles execution.
23
+ - **See what happened.** Check queue status from the CLI and inspect saved
24
+ calculation reports and failure reasons.
25
+ - **Recover with evidence.** Worker or host interruptions follow verified
26
+ recovery paths. Failed ORCA calculations are not automatically retried.
27
+
28
+ ## Get started
29
+
30
+ Python **3.11+**, Linux/WSL2, and a separately installed ORCA engine are
31
+ required. Supervised workers use `systemd`.
32
+
33
+ ```bash
34
+ python -m pip install orca_auto==6.0.0
35
+ ```
36
+
37
+ - **[Installation details](https://github.com/dhsohn/orca_auto/blob/v6.0.0/docs/INSTALLATION.md)** — install Core from PyPI in a fresh environment.
38
+ - **[Set up workers and submit your first job](https://github.com/dhsohn/orca_auto/blob/v6.0.0/docs/QUICKSTART.md)** — configure a
39
+ source checkout, start services, and inspect the queue.
40
+
41
+ **Upgrading?** Keep running calculations on their current environment. Switch
42
+ only in an idle window; see the [upgrade guide](https://github.com/dhsohn/orca_auto/blob/v6.0.0/docs/RELEASE.md#removing-ts-workflows-in-60).
43
+
44
+ ## In the same chemistry ecosystem
45
+
46
+ [Chemvas](https://github.com/dhsohn/Chemvas) for chemical drawings,
47
+ **ORCA_auto** for calculation execution, and
48
+ [LLMdocx](https://github.com/dhsohn/LLMdocx) for research documents are
49
+ independent, local-first companion tools. Data handoffs require explicit
50
+ conversion—not an automatic end-to-end integration.
51
+ [How the tools connect →](https://github.com/dhsohn/orca_auto/blob/v6.0.0/docs/RELATED_WORK.md#local-first-companion-tools)
52
+
53
+ ## Documentation
54
+
55
+ [Command reference](https://github.com/dhsohn/orca_auto/blob/v6.0.0/docs/REFERENCE.md) · [Runtime contracts](https://github.com/dhsohn/orca_auto/blob/v6.0.0/docs/PUBLIC_CONTRACTS.md) ·
56
+ [Architecture](https://github.com/dhsohn/orca_auto/blob/v6.0.0/docs/ARCHITECTURE.md) · [Services](https://github.com/dhsohn/orca_auto/blob/v6.0.0/systemd/README.md) ·
57
+ [Discord notifications](https://github.com/dhsohn/orca_auto/blob/v6.0.0/docs/DISCORD_SETUP.md)
58
+
59
+ [Development](https://github.com/dhsohn/orca_auto/blob/v6.0.0/docs/DEVELOPMENT.md) · [Validation](https://github.com/dhsohn/orca_auto/blob/v6.0.0/docs/VALIDATION.md) ·
60
+ [Roadmap](https://github.com/dhsohn/orca_auto/blob/v6.0.0/ROADMAP.md) · [Changelog](https://github.com/dhsohn/orca_auto/blob/v6.0.0/CHANGELOG.md)
61
+
62
+ [Citation](https://github.com/dhsohn/orca_auto/blob/v6.0.0/CITATION.cff) · [Contributing](https://github.com/dhsohn/orca_auto/blob/v6.0.0/CONTRIBUTING.md) ·
63
+ [Support](https://github.com/dhsohn/orca_auto/blob/v6.0.0/SUPPORT.md) · [Security](https://github.com/dhsohn/orca_auto/blob/v6.0.0/SECURITY.md)
@@ -0,0 +1,335 @@
1
+ [build-system]
2
+ requires = ["setuptools>=68.0"]
3
+ build-backend = "setuptools.build_meta"
4
+
5
+ [project]
6
+ name = "orca_auto"
7
+ version = "6.0.0"
8
+ description = "ORCA_auto core: durable ORCA queues and supervised execution"
9
+ readme = "README.md"
10
+ requires-python = ">=3.11"
11
+ license = { file = "LICENSE" }
12
+ authors = [
13
+ { name = "Daehyup Sohn" },
14
+ ]
15
+ keywords = [
16
+ "orca",
17
+ "dft",
18
+ "computational-chemistry",
19
+ "workflow-automation",
20
+ "cli",
21
+ ]
22
+ classifiers = [
23
+ "Development Status :: 5 - Production/Stable",
24
+ "Environment :: Console",
25
+ "Intended Audience :: Science/Research",
26
+ "License :: OSI Approved :: MIT License",
27
+ "Operating System :: POSIX :: Linux",
28
+ "Programming Language :: Python :: 3",
29
+ "Programming Language :: Python :: 3.11",
30
+ "Programming Language :: Python :: 3.12",
31
+ "Programming Language :: Python :: 3.13",
32
+ "Topic :: Scientific/Engineering :: Chemistry",
33
+ ]
34
+ dependencies = [
35
+ "PyYAML>=6.0.1",
36
+ ]
37
+
38
+ [project.urls]
39
+ Homepage = "https://github.com/dhsohn/orca_auto"
40
+ Repository = "https://github.com/dhsohn/orca_auto"
41
+ Issues = "https://github.com/dhsohn/orca_auto/issues"
42
+ Documentation = "https://github.com/dhsohn/orca_auto/blob/v6.0.0/docs/INSTALLATION.md"
43
+ Changelog = "https://github.com/dhsohn/orca_auto/blob/v6.0.0/CHANGELOG.md"
44
+
45
+ [project.optional-dependencies]
46
+ workflows = ["orca_auto_workflows==6.0.0"]
47
+ dev = [
48
+ "build>=1.2.2",
49
+ "setuptools>=68.0",
50
+ "wheel>=0.45.1",
51
+ "import-linter>=2.12",
52
+ "mypy>=1.19.1",
53
+ "pytest>=9.0",
54
+ "pytest-cov>=7.0.0",
55
+ "ruff>=0.15.5",
56
+ "types-PyYAML>=6.0.12",
57
+ ]
58
+
59
+ [project.scripts]
60
+ orca_auto = "orca_auto.cli:main"
61
+
62
+ [tool.setuptools.packages.find]
63
+ where = ["src"]
64
+ include = ["orca_auto*"]
65
+
66
+ [tool.ruff]
67
+ target-version = "py311"
68
+ line-length = 100
69
+ src = [".", "src", "extensions/workflows/src"]
70
+
71
+ [tool.ruff.lint]
72
+ # Layout (including line length) is owned by `ruff format`, which
73
+ # `scripts/check.sh` enforces via `ruff format --check`. `E501` is intentionally
74
+ # omitted so the formatter stays the single source of truth for line wrapping.
75
+ select = [
76
+ "E4",
77
+ "E7",
78
+ "E9",
79
+ "F",
80
+ "I",
81
+ "B",
82
+ "BLE",
83
+ "FURB162",
84
+ "FURB188",
85
+ "PYI034",
86
+ "UP",
87
+ "RUF100",
88
+ ]
89
+ # UP042 (str-Enum -> StrEnum) changes `str()`/format semantics of status enums
90
+ # that are serialized and compared as plain strings; keep the str mixin.
91
+ ignore = ["UP042"]
92
+
93
+ [tool.mypy]
94
+ python_version = "3.11"
95
+ files = ["src/orca_auto", "extensions/workflows/src/orca_auto/flow", "tests"]
96
+ mypy_path = ["src", "extensions/workflows/src"]
97
+ pretty = true
98
+ show_error_codes = true
99
+ warn_unused_configs = true
100
+ explicit_package_bases = true
101
+
102
+ # The strict-style mypy options apply to the whole orca_auto package; every
103
+ # module under src already passes them, so a new or moved module is strict
104
+ # by default. Tests stay on the non-strict top-level config until the full
105
+ # src+tests tree passes the equivalent strict flags, at which point the
106
+ # options move to [tool.mypy].
107
+ [[tool.mypy.overrides]]
108
+ module = ["orca_auto", "orca_auto.*"]
109
+ check_untyped_defs = true
110
+ disallow_any_generics = true
111
+ disallow_incomplete_defs = true
112
+ disallow_untyped_calls = true
113
+ disallow_untyped_defs = true
114
+ no_implicit_optional = true
115
+ strict_equality = true
116
+ warn_return_any = true
117
+ warn_unused_ignores = true
118
+
119
+ # Layering is enforced by import-linter (`lint-imports`, run by scripts/check.sh
120
+ # and therefore by CI). Engine wiring crosses layers only through lazy string
121
+ # module paths (core/engine_catalog.py). The absent-workflows subprocess tests
122
+ # additionally exercise this dynamic seam, which static import checks cannot see.
123
+ [tool.importlinter]
124
+ root_packages = ["orca_auto"]
125
+ exclude_type_checking_imports = true
126
+
127
+ [[tool.importlinter.contracts]]
128
+ name = "Layered architecture: flow -> orca -> core"
129
+ type = "layers"
130
+ layers = [
131
+ "orca_auto.flow",
132
+ "orca_auto.orca",
133
+ "orca_auto.core",
134
+ ]
135
+
136
+ [[tool.importlinter.contracts]]
137
+ name = "Messaging never imports the notification layer"
138
+ type = "forbidden"
139
+ source_modules = ["orca_auto.core.messaging"]
140
+ forbidden_modules = ["orca_auto.core.notifications"]
141
+
142
+ [[tool.importlinter.contracts]]
143
+ name = "ORCA domain and worker policy never import CLI commands"
144
+ type = "forbidden"
145
+ source_modules = [
146
+ "orca_auto.orca.execution",
147
+ "orca_auto.orca.run_context",
148
+ "orca_auto.orca.submission",
149
+ "orca_auto.orca.worker_execution",
150
+ "orca_auto.orca.queue",
151
+ ]
152
+ forbidden_modules = ["orca_auto.orca.commands"]
153
+
154
+ [[tool.importlinter.contracts]]
155
+ name = "ORCA state reading stays below mutation and report publication"
156
+ type = "forbidden"
157
+ source_modules = ["orca_auto.orca.state_reading"]
158
+ forbidden_modules = [
159
+ "orca_auto.orca.state",
160
+ "orca_auto.orca.report",
161
+ ]
162
+
163
+ [[tool.importlinter.contracts]]
164
+ name = "ORCA structure and frequency evidence never depend on human reports"
165
+ type = "forbidden"
166
+ source_modules = [
167
+ "orca_auto.orca.evidence",
168
+ "orca_auto.orca.frequencies",
169
+ ]
170
+ forbidden_modules = ["orca_auto.orca.report"]
171
+
172
+ [[tool.importlinter.contracts]]
173
+ name = "Workflow structure evidence and selection never depend on SI presentation"
174
+ type = "forbidden"
175
+ source_modules = [
176
+ "orca_auto.flow.orca_stage_evidence",
177
+ "orca_auto.flow.conformer_selection",
178
+ ]
179
+ forbidden_modules = ["orca_auto.orca.report.si", "orca_auto.orca.report.frequencies"]
180
+
181
+ [[tool.importlinter.contracts]]
182
+ name = "Workflow stage views stay below orchestration wiring"
183
+ type = "forbidden"
184
+ source_modules = [
185
+ "orca_auto.flow.orchestration.stage_view_mutators",
186
+ "orca_auto.flow.orchestration.stage_views",
187
+ ]
188
+ forbidden_modules = [
189
+ "orca_auto.flow.orchestration.advance",
190
+ "orca_auto.flow.orchestration.advance_phases",
191
+ "orca_auto.flow.orchestration.services",
192
+ ]
193
+
194
+ [[tool.importlinter.contracts]]
195
+ name = "Workflow report evidence consumers stay below rendering"
196
+ type = "forbidden"
197
+ source_modules = [
198
+ "orca_auto.flow.workflow.report_collection",
199
+ "orca_auto.flow.workflow.report_diagnostics",
200
+ "orca_auto.flow.workflow.report_energy_evidence",
201
+ "orca_auto.flow.workflow.machine",
202
+ "orca_auto.flow.workflow.notifications",
203
+ "orca_auto.flow.workflow.si.collection",
204
+ ]
205
+ forbidden_modules = ["orca_auto.flow.workflow.report_rendering"]
206
+
207
+ [[tool.importlinter.contracts]]
208
+ name = "Workflow report collection stays above evidence readers"
209
+ type = "layers"
210
+ layers = [
211
+ "orca_auto.flow.workflow.report_collection",
212
+ "orca_auto.flow.workflow.report_energy_evidence",
213
+ "orca_auto.flow.workflow.report_diagnostics",
214
+ ]
215
+
216
+ [[tool.importlinter.contracts]]
217
+ name = "Workflow SI layers: publication over rendering over collection"
218
+ type = "layers"
219
+ layers = [
220
+ "orca_auto.flow.workflow.si.publication",
221
+ "orca_auto.flow.workflow.si.rendering",
222
+ "orca_auto.flow.workflow.si.collection",
223
+ ]
224
+
225
+ [[tool.importlinter.contracts]]
226
+ name = "Systemd CLI layers: independent command owners over freshness over units over plan"
227
+ type = "layers"
228
+ layers = [
229
+ "orca_auto.cli_systemd_apply | orca_auto.cli_systemd_restart | orca_auto.cli_systemd_status",
230
+ "orca_auto.cli_systemd_restart_guard",
231
+ "orca_auto.cli_systemd_freshness",
232
+ "orca_auto.cli_systemd_units",
233
+ "orca_auto.systemd_plan",
234
+ ]
235
+
236
+ [[tool.importlinter.contracts]]
237
+ name = "ORCA stage validation never imports materialization"
238
+ type = "forbidden"
239
+ source_modules = ["orca_auto.flow.orca_stage_validation"]
240
+ forbidden_modules = ["orca_auto.flow._orca_stage_materialization"]
241
+
242
+ [[tool.importlinter.contracts]]
243
+ name = "Bounded YAML substrate never imports config policy"
244
+ type = "forbidden"
245
+ source_modules = ["orca_auto.core.config.bounded_yaml"]
246
+ forbidden_modules = ["orca_auto.core.config.files"]
247
+
248
+ [[tool.importlinter.contracts]]
249
+ name = "Worker process supervision stays below CLI assembly"
250
+ type = "forbidden"
251
+ source_modules = ["orca_auto.cli_worker_supervision"]
252
+ forbidden_modules = ["orca_auto.cli_workers"]
253
+
254
+ [[tool.importlinter.contracts]]
255
+ name = "Restart settings stay mutation-free"
256
+ type = "forbidden"
257
+ source_modules = ["orca_auto.flow.restart.settings"]
258
+ forbidden_modules = [
259
+ "orca_auto.flow.restart.mutation",
260
+ "orca_auto.flow.restart.orca_input",
261
+ "orca_auto.flow.restart.stage_ops",
262
+ ]
263
+
264
+ [[tool.importlinter.contracts]]
265
+ name = "Restart mutation layers: mutation over stage ops over ORCA input"
266
+ type = "layers"
267
+ layers = [
268
+ "orca_auto.flow.restart.mutation",
269
+ "orca_auto.flow.restart.stage_ops",
270
+ "orca_auto.flow.restart.orca_input",
271
+ ]
272
+
273
+ [[tool.importlinter.contracts]]
274
+ name = "Restart settings resolve independently of the mutation owners"
275
+ type = "forbidden"
276
+ source_modules = [
277
+ "orca_auto.flow.restart.mutation",
278
+ "orca_auto.flow.restart.orca_input",
279
+ "orca_auto.flow.restart.stage_ops",
280
+ ]
281
+ forbidden_modules = ["orca_auto.flow.restart.settings"]
282
+
283
+ [[tool.importlinter.contracts]]
284
+ name = "ORCA input syntax never imports reference scanning"
285
+ type = "forbidden"
286
+ source_modules = ["orca_auto.orca.input_blocks"]
287
+ forbidden_modules = ["orca_auto.orca.input_references"]
288
+
289
+ [[tool.importlinter.contracts]]
290
+ name = "ORCA input reference scanning stays below runtime consumers"
291
+ type = "forbidden"
292
+ source_modules = ["orca_auto.orca.input_references"]
293
+ forbidden_modules = [
294
+ "orca_auto.flow.conformer_selection",
295
+ "orca_auto.flow.restart.orca_input",
296
+ "orca_auto.orca.execution_binding",
297
+ "orca_auto.orca.scratch",
298
+ ]
299
+
300
+ # The top-level CLI modules are the outermost layer: they compose the domain
301
+ # packages, and no domain package may reach back up into them. Shared terminal
302
+ # presentation and config discovery live in core so command adapters inside
303
+ # flow can use them without crossing this boundary.
304
+ [[tool.importlinter.contracts]]
305
+ name = "Domain packages never import the top-level CLI layer"
306
+ type = "forbidden"
307
+ source_modules = ["orca_auto.core", "orca_auto.orca", "orca_auto.flow"]
308
+ forbidden_modules = [
309
+ "orca_auto._process_evidence",
310
+ "orca_auto.activity",
311
+ "orca_auto.activity_labels",
312
+ "orca_auto.activity_rendering",
313
+ "orca_auto.activity_view",
314
+ "orca_auto.cli",
315
+ "orca_auto.cli_handlers",
316
+ "orca_auto.cli_parsers",
317
+ "orca_auto.cli_queue",
318
+ "orca_auto.cli_systemd_apply",
319
+ "orca_auto.cli_systemd_freshness",
320
+ "orca_auto.cli_systemd_restart",
321
+ "orca_auto.cli_systemd_restart_guard",
322
+ "orca_auto.cli_systemd_status",
323
+ "orca_auto.cli_systemd_units",
324
+ "orca_auto.cli_worker_supervision",
325
+ "orca_auto.cli_workers",
326
+ "orca_auto.systemd_plan",
327
+ "orca_auto.terminal_table",
328
+ ]
329
+
330
+ [tool.coverage.run]
331
+ source = ["src/orca_auto", "extensions/workflows/src/orca_auto/flow"]
332
+
333
+ [tool.coverage.report]
334
+ fail_under = 80
335
+ show_missing = true
@@ -0,0 +1,4 @@
1
+ [egg_info]
2
+ tag_build =
3
+ tag_date = 0
4
+
@@ -0,0 +1,11 @@
1
+ """Shared namespace package for the chemistry automation monorepo."""
2
+
3
+ from pkgutil import extend_path
4
+
5
+ # Core owns this initializer; separately installed extensions own subpackages.
6
+ # Never discover sibling checkout sources unless they were explicitly installed.
7
+ __path__ = extend_path(__path__, __name__)
8
+
9
+ from ._version import __version__
10
+
11
+ __all__ = ["__version__"]
@@ -0,0 +1,60 @@
1
+ """Process-local provenance used by the systemd freshness check."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import os
6
+ import sys
7
+ from importlib import import_module
8
+ from pathlib import Path
9
+
10
+ PROCESS_IMPORT_SOURCE_ENV = "ORCA_AUTO_PROCESS_IMPORT_SOURCE"
11
+ PROCESS_WORKFLOW_IMPORT_SOURCE_ENV = "ORCA_AUTO_PROCESS_WORKFLOW_IMPORT_SOURCE"
12
+
13
+
14
+ def _workflow_worker_requested(argv: list[str]) -> bool:
15
+ return "--app=workflow" in argv or any(
16
+ flag == "--app" and value == "workflow" for flag, value in zip(argv, argv[1:], strict=False)
17
+ )
18
+
19
+
20
+ def exec_with_import_source_evidence() -> None:
21
+ """Re-exec the module CLI once with its actual imported source in environ.
22
+
23
+ ``/proc/<pid>/environ`` exposes only the environment installed by ``exec``;
24
+ mutating ``os.environ`` after Python starts is not reliable process evidence.
25
+ Re-exec preserves the systemd MainPID and kernel process start identity while
26
+ making the source path observable without a sidecar state file.
27
+ """
28
+
29
+ if sys.argv[1:3] != ["queue", "worker"]:
30
+ return
31
+ import_source = str(Path(__file__).resolve(strict=False))
32
+ environment = os.environ.copy()
33
+ environment[PROCESS_IMPORT_SOURCE_ENV] = import_source
34
+ if _workflow_worker_requested(sys.argv[3:]):
35
+ from orca_auto.core.extensions import require_workflows
36
+
37
+ require_workflows()
38
+ workflow_module = import_module("orca_auto.flow")
39
+ workflow_source = workflow_module.__file__
40
+ if workflow_source is None:
41
+ raise ValueError("workflow import source is unavailable")
42
+ environment[PROCESS_WORKFLOW_IMPORT_SOURCE_ENV] = str(
43
+ Path(workflow_source).resolve(strict=True)
44
+ )
45
+ else:
46
+ environment.pop(PROCESS_WORKFLOW_IMPORT_SOURCE_ENV, None)
47
+ if environment == os.environ:
48
+ return
49
+ os.execve(
50
+ sys.executable,
51
+ [sys.executable, "-m", "orca_auto.cli", *sys.argv[1:]],
52
+ environment,
53
+ )
54
+
55
+
56
+ __all__ = [
57
+ "PROCESS_IMPORT_SOURCE_ENV",
58
+ "PROCESS_WORKFLOW_IMPORT_SOURCE_ENV",
59
+ "exec_with_import_source_evidence",
60
+ ]
@@ -0,0 +1,45 @@
1
+ from __future__ import annotations
2
+
3
+ import tomllib
4
+ from importlib import metadata
5
+ from pathlib import Path
6
+
7
+
8
+ def package_version() -> str:
9
+ try:
10
+ return metadata.version("orca_auto")
11
+ except metadata.PackageNotFoundError:
12
+ return "0.0.0+unknown"
13
+
14
+
15
+ def _source_pyproject_version(source_root: Path) -> str | None:
16
+ try:
17
+ with open(source_root / "pyproject.toml", "rb") as fh:
18
+ project = tomllib.load(fh)["project"]
19
+ if project["name"] != "orca_auto":
20
+ return None
21
+ return str(project["version"])
22
+ except (OSError, tomllib.TOMLDecodeError, KeyError, TypeError):
23
+ return None
24
+
25
+
26
+ def installed_version_drift(source_root: Path | None = None) -> tuple[str, str] | None:
27
+ """Report `(installed, source)` when the two disagree, else `None`.
28
+
29
+ An editable install freezes its distribution metadata at install time while
30
+ the interpreter keeps importing the checkout, so a live deployment can run
31
+ one version's code and declare another until someone reruns the install.
32
+ Returns `None` when there is no source `pyproject.toml` to compare against,
33
+ which is the normal shape of a wheel install rather than a drift verdict.
34
+ """
35
+ root = source_root if source_root is not None else Path(__file__).resolve().parents[2]
36
+ source = _source_pyproject_version(root)
37
+ if source is None:
38
+ return None
39
+ installed = package_version()
40
+ return None if installed == source else (installed, source)
41
+
42
+
43
+ __version__ = package_version()
44
+
45
+ __all__ = ["__version__", "installed_version_drift", "package_version"]