outerloop-science 0.2.0rc2__tar.gz → 0.2.0rc3__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 (187) hide show
  1. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/CHANGELOG.md +14 -0
  2. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/CITATION.cff +2 -2
  3. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/PKG-INFO +1 -1
  4. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/docs/install.md +72 -8
  5. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/scripts/tick_chain.sbatch +3 -1
  6. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/scripts/tick_deploy.sh +1 -0
  7. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/scripts/tick_resident.sh +3 -1
  8. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/src/outerloop/__init__.py +1 -1
  9. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/src/outerloop/attempt.py +302 -113
  10. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/src/outerloop/cli.py +114 -23
  11. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/src/outerloop/compute.py +21 -0
  12. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/src/outerloop/dispatch.py +5 -2
  13. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/src/outerloop/github.py +33 -5
  14. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/src/outerloop/harness.py +36 -9
  15. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/src/outerloop/image.py +6 -1
  16. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/src/outerloop/init.py +8 -15
  17. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/src/outerloop/measure.py +4 -0
  18. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/src/outerloop/orchestrator.py +3 -1
  19. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/src/outerloop/runstate.py +122 -0
  20. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/src/outerloop/steward.py +20 -2
  21. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/src/outerloop/tick.py +154 -34
  22. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/tests/conftest.py +7 -0
  23. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/tests/test_app_permissions.py +2 -0
  24. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/tests/test_attempt.py +380 -7
  25. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/tests/test_attempt_review.py +93 -0
  26. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/tests/test_dispatch.py +44 -0
  27. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/tests/test_github.py +31 -0
  28. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/tests/test_harness.py +44 -15
  29. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/tests/test_hermes_harness.py +2 -1
  30. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/tests/test_image.py +18 -0
  31. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/tests/test_init.py +58 -7
  32. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/tests/test_local_compute.py +47 -2
  33. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/tests/test_orchestrator.py +6 -2
  34. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/tests/test_runstate.py +128 -0
  35. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/tests/test_start.py +289 -39
  36. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/tests/test_tick.py +300 -4
  37. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/tests/test_tick_resident.py +10 -2
  38. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/.gitignore +0 -0
  39. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/.pre-commit-config.yaml +0 -0
  40. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/.python-version +0 -0
  41. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/CLAUDE.md +0 -0
  42. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/CONTRIBUTING.md +0 -0
  43. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/LICENSE +0 -0
  44. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/NOTICE +0 -0
  45. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/README.md +0 -0
  46. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/RELEASING.md +0 -0
  47. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/SECURITY.md +0 -0
  48. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/containers/README.md +0 -0
  49. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/containers/agent-py312.def +0 -0
  50. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/docs/assets/icon-dark.svg +0 -0
  51. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/docs/assets/icon-light.svg +0 -0
  52. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/docs/assets/icon.svg +0 -0
  53. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/docs/community.md +0 -0
  54. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/docs/compute.md +0 -0
  55. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/docs/contract.md +0 -0
  56. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/docs/design/agent-protocols.md +0 -0
  57. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/docs/design/agent-substrate.md +0 -0
  58. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/docs/design/architecture.md +0 -0
  59. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/docs/design/base-reintegration.md +0 -0
  60. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/docs/design/consolidation.md +0 -0
  61. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/docs/design/dispatcher.md +0 -0
  62. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/docs/design/eval-cache.md +0 -0
  63. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/docs/design/external.md +0 -0
  64. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/docs/design/github-app-auth.md +0 -0
  65. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/docs/design/headline.md +0 -0
  66. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/docs/design/judge-placement.md +0 -0
  67. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/docs/design/lifecycle.md +0 -0
  68. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/docs/design/meta.md +0 -0
  69. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/docs/design/onboarding.md +0 -0
  70. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/docs/design/orchestrator-verify.md +0 -0
  71. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/docs/design/public-surface.md +0 -0
  72. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/docs/design/research-lines.md +0 -0
  73. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/docs/design/research-loop-buildout.md +0 -0
  74. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/docs/design/research-loop.md +0 -0
  75. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/docs/design/resident-tick.md +0 -0
  76. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/docs/design/review-placement.md +0 -0
  77. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/docs/design/reviewer-infra.md +0 -0
  78. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/docs/design/role-cli.md +0 -0
  79. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/docs/design/roles.md +0 -0
  80. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/docs/design/scaling.md +0 -0
  81. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/docs/design/session-watcher.md +0 -0
  82. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/docs/reviewer.md +0 -0
  83. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/docs/roadmap.md +0 -0
  84. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/docs/validation/author-syscalls.md +0 -0
  85. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/examples/review.yml +0 -0
  86. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/pyproject.toml +0 -0
  87. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/scripts/README.md +0 -0
  88. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/scripts/install_codex.sh +0 -0
  89. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/scripts/install_hermes.sh +0 -0
  90. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/scripts/requeue_moved_successors.sh +0 -0
  91. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/scripts/setup_branch_protection.sh +0 -0
  92. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/scripts/sweep_git_locks.sh +0 -0
  93. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/src/outerloop/__main__.py +0 -0
  94. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/src/outerloop/appauth.py +0 -0
  95. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/src/outerloop/appmanifest.py +0 -0
  96. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/src/outerloop/brief.py +0 -0
  97. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/src/outerloop/climbboard.py +0 -0
  98. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/src/outerloop/contract.py +0 -0
  99. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/src/outerloop/contract_cli.py +0 -0
  100. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/src/outerloop/disk.py +0 -0
  101. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/src/outerloop/evalcache.py +0 -0
  102. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/src/outerloop/housekeeping.py +0 -0
  103. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/src/outerloop/hypothesis.py +0 -0
  104. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/src/outerloop/inbox.py +0 -0
  105. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/src/outerloop/intake.py +0 -0
  106. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/src/outerloop/launchlog.py +0 -0
  107. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/src/outerloop/limits.py +0 -0
  108. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/src/outerloop/maintain.py +0 -0
  109. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/src/outerloop/maintain_agent_cli.py +0 -0
  110. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/src/outerloop/maintain_post_cli.py +0 -0
  111. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/src/outerloop/markers.py +0 -0
  112. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/src/outerloop/panel.py +0 -0
  113. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/src/outerloop/paths.py +0 -0
  114. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/src/outerloop/posting.py +0 -0
  115. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/src/outerloop/progress.py +0 -0
  116. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/src/outerloop/py.typed +0 -0
  117. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/src/outerloop/review.py +0 -0
  118. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/src/outerloop/review_agent.py +0 -0
  119. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/src/outerloop/review_agent_cli.py +0 -0
  120. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/src/outerloop/review_post_cli.py +0 -0
  121. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/src/outerloop/review_summarize_cli.py +0 -0
  122. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/src/outerloop/role_runner.py +0 -0
  123. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/src/outerloop/roles.py +0 -0
  124. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/src/outerloop/rolespec.py +0 -0
  125. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/src/outerloop/style.py +0 -0
  126. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/src/outerloop/syscall.py +0 -0
  127. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/src/outerloop/syscall_cli.py +0 -0
  128. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/src/outerloop/verifier.py +0 -0
  129. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/src/outerloop/verify_agent.py +0 -0
  130. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/src/outerloop/verify_agent_cli.py +0 -0
  131. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/src/outerloop/verify_post_cli.py +0 -0
  132. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/src/outerloop/watcher.py +0 -0
  133. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/tests/fakes.py +0 -0
  134. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/tests/helpers.py +0 -0
  135. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/tests/test_appauth.py +0 -0
  136. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/tests/test_appmanifest.py +0 -0
  137. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/tests/test_bot_aliases.py +0 -0
  138. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/tests/test_bot_login.py +0 -0
  139. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/tests/test_brief.py +0 -0
  140. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/tests/test_channel_dir.py +0 -0
  141. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/tests/test_climbboard.py +0 -0
  142. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/tests/test_codex_harness.py +0 -0
  143. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/tests/test_compute.py +0 -0
  144. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/tests/test_contract.py +0 -0
  145. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/tests/test_contract_cli.py +0 -0
  146. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/tests/test_contract_names.py +0 -0
  147. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/tests/test_disk.py +0 -0
  148. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/tests/test_evalcache.py +0 -0
  149. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/tests/test_hardening.py +0 -0
  150. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/tests/test_housekeeping.py +0 -0
  151. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/tests/test_import.py +0 -0
  152. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/tests/test_inbox.py +0 -0
  153. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/tests/test_intake.py +0 -0
  154. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/tests/test_launchlog.py +0 -0
  155. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/tests/test_lifecycle_cli.py +0 -0
  156. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/tests/test_limits.py +0 -0
  157. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/tests/test_maintain.py +0 -0
  158. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/tests/test_markers.py +0 -0
  159. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/tests/test_measure.py +0 -0
  160. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/tests/test_measure_and_decide.py +0 -0
  161. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/tests/test_messages.py +0 -0
  162. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/tests/test_packaging.py +0 -0
  163. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/tests/test_panel.py +0 -0
  164. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/tests/test_paths.py +0 -0
  165. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/tests/test_posting.py +0 -0
  166. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/tests/test_progress.py +0 -0
  167. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/tests/test_requeue_moved_successors.py +0 -0
  168. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/tests/test_review.py +0 -0
  169. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/tests/test_review_agent.py +0 -0
  170. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/tests/test_review_agent_cli.py +0 -0
  171. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/tests/test_review_hardening.py +0 -0
  172. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/tests/test_review_policy.py +0 -0
  173. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/tests/test_review_summarize.py +0 -0
  174. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/tests/test_role_runner.py +0 -0
  175. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/tests/test_rolespec.py +0 -0
  176. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/tests/test_steward.py +0 -0
  177. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/tests/test_sweep_git_locks.py +0 -0
  178. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/tests/test_syscall.py +0 -0
  179. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/tests/test_syscall_cli.py +0 -0
  180. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/tests/test_tick_chain_successors.py +0 -0
  181. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/tests/test_tiers.py +0 -0
  182. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/tests/test_verifier.py +0 -0
  183. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/tests/test_verify_agent.py +0 -0
  184. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/tests/test_verify_agent_cli.py +0 -0
  185. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/tests/test_version.py +0 -0
  186. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/tests/test_watcher.py +0 -0
  187. {outerloop_science-0.2.0rc2 → outerloop_science-0.2.0rc3}/uv.lock +0 -0
@@ -20,12 +20,26 @@ launch arrays in parallel. The board shows running GPU jobs. `OUTERLOOP_LOCAL_GP
20
20
  overrides GPU detection; `0` disables allocation. Submissions still wait for all
21
21
  tasks to finish.
22
22
 
23
+ ### Added
24
+
25
+ - `OUTERLOOP_TICK_HOST=login` (or `--tick-host login`) runs a niced foreground tick loop against Slurm, with one tick lease per state root.
26
+ - `OUTERLOOP_QOS` sets the QOS for every submitted Slurm job.
27
+ - `OUTERLOOP_APPTAINER_BIN` selects the container executable on compute nodes.
28
+ - `<root>/HOLD_LAUNCHES` holds fresh kernel launches while existing runs, wake delivery, and the tick chain continue; remove the file to resume.
29
+
23
30
  ### Removed
24
31
 
25
32
  - The pre-rename names are gone. The `AUTORESEARCH_*` environment names are no longer read by the package, the `.env` reader, the chain or the deploy step. `~/.config/autoresearch/`, `.autoresearch.yaml`, the `.autoresearch` channel directory, the `~/.autoresearch` local root default and `~/autoresearch-images` are no longer looked for. The `autoresearch-resident` and `autoresearch-tick` job names are no longer recognized. The `harness_key` file, the `*_HARNESS_KEY_FILE` setting and the `climb_job_id` record field are gone. Before upgrading, rename the `.env` keys, the config directory and the image directory. Cancel a resident or chain still queued under an old job name (`scancel --name autoresearch-resident`, or `scancel --name autoresearch-tick`) before running `outerloop start`: the guard against two loops on one root knows only the current name. Old `autoresearch:` comment markers are still recognized.
26
33
 
27
34
  ### Fixed
28
35
 
36
+ - `outerloop start` refuses to run when the configured author's CLI is missing: it checks the recorded path, else PATH, else `~/.local/bin`, and names the install command and `outerloop init --force`.
37
+
38
+ - Ending line snapshots push once, with the kernel's GitHub auth. Without auth nothing is pushed and the log says so. A refused push is retried only when the remote line moved.
39
+ - PRs under `merge: auto` say why self-merge is waiting, and the publish records and logs the bless decision.
40
+
41
+ - A timed-out local job could leave its GPUs reserved until the next submit; they are now released once its process group is gone.
42
+
29
43
  - The tick log says why a blessed PR is not merged yet (a message waits for the author, the run sleeps on jobs, the base moved, and so on), one line per sweep.
30
44
  - Runs retain their hypothesis through review. The status strip and sibling view carry it with the PR link, and the brief asks authors to check the view, refreshed at every wake, before choosing a direction and before submitting.
31
45
 
@@ -13,5 +13,5 @@ authors:
13
13
  repository-code: "https://github.com/outerloop-science/outerloop"
14
14
  url: "https://outerloop.science"
15
15
  license: Apache-2.0
16
- version: 0.2.0rc2
17
- date-released: "2026-09-14"
16
+ version: 0.2.0rc3
17
+ date-released: "2026-09-15"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: outerloop-science
3
- Version: 0.2.0rc2
3
+ Version: 0.2.0rc3
4
4
  Summary: Autonomous research agents that improve the benchmark you point them at, one verified pull request at a time
5
5
  Project-URL: Homepage, https://outerloop.science
6
6
  Project-URL: Repository, https://github.com/outerloop-science/outerloop
@@ -295,6 +295,25 @@ says so — rerun `outerloop init --force` online, or set the login in the
295
295
 
296
296
  ### 2c. Run the loop
297
297
 
298
+ **Host prerequisites for model backends.** From the outerloop checkout:
299
+
300
+ - Claude, as author or reviewer: the Claude Code CLI ([official
301
+ setup](https://code.claude.com/docs/en/setup)); install with
302
+ `curl -fsSL https://claude.ai/install.sh | bash`.
303
+ - Codex, as author or reviewer: the pinned Codex CLI; install with
304
+ `bash scripts/install_codex.sh`.
305
+ - Hermes, as reviewer only (not an author backend): the pinned hermes-agent
306
+ source checkout, run through `uv`; install with `bash scripts/install_hermes.sh`.
307
+
308
+ Install the selected backend before setup. `init` records the absolute Claude
309
+ or Codex path found on PATH (or in `~/.local/bin`) as `OUTERLOOP_<BACKEND>_BIN`.
310
+ `start` checks only the configured author's CLI: the recorded path takes
311
+ precedence, otherwise it searches PATH, then `~/.local/bin`. A missing or non-executable CLI stops
312
+ launch before any job runs. After installing or moving it, run
313
+ `outerloop init --force` to record its path again. `--dry-run` prints the launch
314
+ command without checking the CLI. For Hermes, set `REVIEW_HERMES_REPO` to the installed checkout (the installer
315
+ defaults to `~/hermes-agent`); contained review sessions bind its source read-only.
316
+
298
317
  The quickest path is the guided setup:
299
318
 
300
319
  ```bash
@@ -321,7 +340,7 @@ that can reach GitHub and your LLM provider works.
321
340
  you start it again. On a headless machine start it under `nohup` or in a
322
341
  tmux window, or as a user service.
323
342
 
324
- **Updates.** A Slurm deployment runs from a checkout, and
343
+ **Updates.** A resident Slurm deployment runs from a checkout, and
325
344
  `OUTERLOOP_AUTO_UPDATE` in `.env` says whether the deploy step moves it. `off`,
326
345
  the default, leaves the checkout alone: you upgrade when you choose, and the
327
346
  loop keeps running the code you validated. `release` moves it to the newest
@@ -334,6 +353,44 @@ the installed package, which has no such policy: run `outerloop upgrade` to move
334
353
  it to the newest release (add `--pre` to track pre-releases), then start it
335
354
  again. That is `pip install --upgrade outerloop-science` under one verb.
336
355
 
356
+ #### Login-node loop
357
+
358
+ Use this when no Slurm partition can start a resident tick within your cadence
359
+ and the site permits a long-lived process on the login node. In
360
+ `~/.config/outerloop/.env`, set:
361
+
362
+ ```bash
363
+ OUTERLOOP_TICK_HOST=login
364
+ OUTERLOOP_QOS=priority
365
+ OUTERLOOP_APPTAINER_BIN=/cm/local/apps/apptainer/current/bin/apptainer
366
+ ```
367
+
368
+ Run `outerloop start` from your checkout with the usual shared `OUTERLOOP_ROOT`.
369
+ `--tick-host login` overrides the environment, which overrides `.env`.
370
+ `resident` is the default on Slurm; local compute still runs locally.
371
+ The login loop requires `sbatch` on PATH, runs in the foreground at nice +10,
372
+ and submits compute to Slurm. QOS applies to all submitted jobs; the Apptainer
373
+ path is used on compute nodes. The tick only checks the image file exists and
374
+ does not run Apptainer on the login node. Empty QOS uses Slurm's default;
375
+ an empty binary setting uses `apptainer`.
376
+
377
+ Only one loop may own a state root. Every foreground loop, local or login,
378
+ holds the root's `TICK` lease (holder `host:pid`, heartbeat and the holder's
379
+ cadence written each tick); a file lock refuses a second loop while the owner
380
+ runs. `outerloop start` refuses any loop while the lease is held, and a login
381
+ loop while a resident chain is queued or running; a resident submission that
382
+ finds the lease taken meanwhile withdraws its job, and a login loop that
383
+ finds a resident queued after taking the lease stops. After a crash the next
384
+ start on the same host takes the lease at once, and a start from another
385
+ host once the heartbeat is three of the holder's cadences old (file locks may
386
+ not reach across nodes); a loop whose record was overwritten from another
387
+ node stops at its next heartbeat. Ctrl-C or SIGTERM releases the lease. Use
388
+ tmux or a user service if the process should survive your terminal.
389
+
390
+ The login loop does **not auto-update**, even with `OUTERLOOP_AUTO_UPDATE=main`.
391
+ To restart or upgrade: stop the process, run `git pull`, run `uv sync`, then
392
+ run `outerloop start` again. Settings from `.env` are exported only at launch.
393
+
337
394
  ### Upgrading
338
395
 
339
396
  1. Run `outerloop upgrade` (add `--pre` for pre-releases).
@@ -397,13 +454,20 @@ lesser of 10 minutes and half the cadence), and `OUTERLOOP_MAX_JOB_MINUTES` caps
397
454
  the walltime the tick requests for the climb and author-sleep wake jobs it sizes
398
455
  (clamped under a code ceiling).
399
456
 
400
- **Two operator switches.** `touch <root>/PAUSE` pauses the loop; `touch
401
- <root>/DISARM_WAKE` stops parked runs from being woken, by the sweep and by a
402
- wake job a park already queued, until the file is removed. Both are read at
403
- every tick and by every wake, no restart: the sentinel is the switch.
404
- (`OUTERLOOP_DISPATCH_WAKE=0` in the environment that starts the loop or the
405
- chain does the same; it is not read from `.env`.) Wakes are on by default: a
406
- loop that cannot wake strands every parked run without a word.
457
+ **Three operator switches.** `touch <root>/PAUSE` stops tick work except the
458
+ heartbeat; jobs already running continue. The resident chain drains on it (it
459
+ cancels its successor and exits), so after `rm <root>/PAUSE` run `outerloop
460
+ start` there; the per-tick chain and the local loop resume on their own at the
461
+ next tick.
462
+ `touch <root>/DISARM_WAKE` stops wake delivery by the sweep and by queued wake
463
+ jobs until `rm <root>/DISARM_WAKE`, while fresh launches, ending records, and
464
+ the chain keep running (the starting environment's `OUTERLOOP_DISPATCH_WAKE=0`
465
+ also disarms wakes; it is not read from `.env`).
466
+ `touch <root>/HOLD_LAUNCHES` stops fresh intake, self-initiated, and steward runs
467
+ until `rm <root>/HOLD_LAUNCHES`, with no chain restart, while the sweep, wake and
468
+ message delivery, GitHub polling, self-merge sweep, board, and ending records
469
+ continue; existing runs keep spending, including their panels, author sessions,
470
+ and the authors' own `launch` submissions.
407
471
 
408
472
  **Local mode without an image.** On a machine with no Apptainer image,
409
473
  `OUTERLOOP_COMPUTE=local` still runs. Sessions run under the harness's own
@@ -52,6 +52,8 @@ done
52
52
  # partition may be a comma-list like "a,b"), pass them through.
53
53
  acct_arg=""
54
54
  [ -n "${OUTERLOOP_ACCOUNT:-}" ] && acct_arg="--account=${OUTERLOOP_ACCOUNT}"
55
+ qos_arg=""
56
+ [ -n "${OUTERLOOP_QOS:-}" ] && qos_arg="--qos=${OUTERLOOP_QOS}"
55
57
  part_arg=""
56
58
  [ -n "${OUTERLOOP_PARTITION:-}" ] && part_arg="--partition=${OUTERLOOP_PARTITION}"
57
59
 
@@ -104,7 +106,7 @@ while [ "$i" -le "$need" ]; do
104
106
  || date -r "$begin_epoch" +%Y-%m-%dT%H:%M:%S)
105
107
  for attempt in 1 2 3; do
106
108
  if sbatch --dependency=singleton --begin="$begin" \
107
- ${acct_arg:+"$acct_arg"} ${part_arg:+"$part_arg"} \
109
+ ${acct_arg:+"$acct_arg"} ${part_arg:+"$part_arg"} ${qos_arg:+"$qos_arg"} \
108
110
  "${OUTERLOOP_HOME:-}/scripts/tick_chain.sbatch"; then
109
111
  break
110
112
  fi
@@ -195,6 +195,7 @@ if [ -n "$ENV_TRUSTED" ]; then
195
195
  OUTERLOOP_TARGET \
196
196
  OUTERLOOP_GITHUB_APP_FILE OUTERLOOP_BOT_LOGIN OUTERLOOP_BOT_ALIASES \
197
197
  OUTERLOOP_GPU_PARTITION OUTERLOOP_GPU_ACCOUNT \
198
+ OUTERLOOP_QOS OUTERLOOP_APPTAINER_BIN \
198
199
  OUTERLOOP_IMAGE \
199
200
  OUTERLOOP_PANEL OUTERLOOP_PANEL_KEY_FILE \
200
201
  OUTERLOOP_PANEL_CODEX_KEY_FILE \
@@ -45,13 +45,15 @@ submit_successor() {
45
45
  # them only when set.
46
46
  local acct_arg=""
47
47
  [ -n "${OUTERLOOP_ACCOUNT:-}" ] && acct_arg="--account=${OUTERLOOP_ACCOUNT}"
48
+ local qos_arg=""
49
+ [ -n "${OUTERLOOP_QOS:-}" ] && qos_arg="--qos=${OUTERLOOP_QOS}"
48
50
  local part_arg=""
49
51
  [ -n "${OUTERLOOP_PARTITION:-}" ] && part_arg="--partition=${OUTERLOOP_PARTITION}"
50
52
  local out="" attempt
51
53
  for attempt in 1 2 3; do
52
54
  if out=$(sbatch --parsable --dependency="$dep" --time="$resident_minutes" \
53
55
  --job-name="$RESIDENT_JOB_NAME" --export=ALL \
54
- ${acct_arg:+"$acct_arg"} ${part_arg:+"$part_arg"} \
56
+ ${acct_arg:+"$acct_arg"} ${part_arg:+"$part_arg"} ${qos_arg:+"$qos_arg"} \
55
57
  "$shim" 2>/dev/null); then
56
58
  printf '%s' "${out%%;*}"
57
59
  return 0
@@ -1,3 +1,3 @@
1
1
  """Outerloop: autonomous research agents that improve a benchmark on your own code."""
2
2
 
3
- __version__ = "0.2.0rc2"
3
+ __version__ = "0.2.0rc3"