outerloop-science 0.3.0rc2__tar.gz → 0.4.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 (336) hide show
  1. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/.gitignore +7 -0
  2. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/.pre-commit-config.yaml +3 -0
  3. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/CHANGELOG.md +383 -8
  4. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/CITATION.cff +2 -2
  5. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/CLAUDE.md +3 -3
  6. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/PKG-INFO +67 -67
  7. outerloop_science-0.4.0/README.md +133 -0
  8. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/RELEASING.md +4 -0
  9. outerloop_science-0.4.0/SECURITY.md +98 -0
  10. outerloop_science-0.4.0/docs/assets/outerloop-apple-touch-icon.png +0 -0
  11. outerloop_science-0.4.0/docs/assets/outerloop-favicon.png +0 -0
  12. outerloop_science-0.4.0/docs/assets/outerloop-favicon.svg +11 -0
  13. outerloop_science-0.4.0/docs/community.md +48 -0
  14. outerloop_science-0.4.0/docs/concurrency.md +45 -0
  15. outerloop_science-0.4.0/docs/contract.md +200 -0
  16. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/docs/design/accelerators.md +10 -7
  17. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/docs/design/agent-environment.md +40 -3
  18. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/docs/design/agent-protocols.md +1 -1
  19. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/docs/design/agent-substrate.md +2 -2
  20. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/docs/design/architecture.md +48 -34
  21. outerloop_science-0.4.0/docs/design/compute-cloud.md +204 -0
  22. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/docs/design/dispatcher.md +23 -20
  23. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/docs/design/eval-cache.md +2 -2
  24. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/docs/design/external.md +2 -2
  25. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/docs/design/headline.md +4 -4
  26. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/docs/design/lifecycle.md +12 -11
  27. outerloop_science-0.4.0/docs/design/model-gateway.md +154 -0
  28. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/docs/design/multi-cluster.md +95 -94
  29. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/docs/design/orchestrator-verify.md +13 -7
  30. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/docs/design/research-lines.md +7 -6
  31. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/docs/design/research-loop-buildout.md +2 -2
  32. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/docs/design/resident-tick.md +33 -44
  33. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/docs/design/review-placement.md +10 -9
  34. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/docs/design/reviewer-infra.md +4 -4
  35. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/docs/design/role-cli.md +5 -3
  36. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/docs/design/scaling.md +3 -3
  37. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/docs/design/session-watcher.md +8 -8
  38. outerloop_science-0.4.0/docs/endpoints.md +141 -0
  39. outerloop_science-0.4.0/docs/getting-started.md +159 -0
  40. outerloop_science-0.4.0/docs/how-it-works.md +232 -0
  41. outerloop_science-0.4.0/docs/index.md +18 -0
  42. outerloop_science-0.4.0/docs/install.md +226 -0
  43. outerloop_science-0.4.0/docs/javascripts/figures.js +22 -0
  44. outerloop_science-0.4.0/docs/messages.md +179 -0
  45. outerloop_science-0.4.0/docs/operate.md +110 -0
  46. outerloop_science-0.4.0/docs/reference/cli.md +251 -0
  47. outerloop_science-0.4.0/docs/reference/contract.md +571 -0
  48. outerloop_science-0.4.0/docs/reference/environment.md +646 -0
  49. outerloop_science-0.4.0/docs/reference/inbox.md +122 -0
  50. outerloop_science-0.4.0/docs/reference/syscalls.md +210 -0
  51. outerloop_science-0.4.0/docs/reviewer.md +188 -0
  52. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/docs/roadmap.md +17 -9
  53. outerloop_science-0.4.0/docs/session-capture.md +82 -0
  54. outerloop_science-0.4.0/docs/storage.md +214 -0
  55. outerloop_science-0.4.0/docs/stylesheets/figures.css +141 -0
  56. outerloop_science-0.4.0/docs/stylesheets/site.css +10 -0
  57. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/docs/validation/author-syscalls.md +1 -1
  58. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/examples/review.yml +13 -6
  59. outerloop_science-0.4.0/mkdocs.yml +135 -0
  60. outerloop_science-0.4.0/overrides/.icons/bi/circle-half.svg +3 -0
  61. outerloop_science-0.4.0/overrides/.icons/bi/moon.svg +3 -0
  62. outerloop_science-0.4.0/overrides/.icons/bi/search.svg +3 -0
  63. outerloop_science-0.4.0/overrides/.icons/bi/sun.svg +3 -0
  64. outerloop_science-0.4.0/overrides/.icons/lab/github.svg +1 -0
  65. outerloop_science-0.4.0/overrides/main.html +45 -0
  66. outerloop_science-0.4.0/overrides/partials/logo.html +6 -0
  67. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/pyproject.toml +7 -0
  68. outerloop_science-0.4.0/scripts/docs/build.sh +11 -0
  69. outerloop_science-0.4.0/scripts/docs/hooks.py +163 -0
  70. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/scripts/install_bridge.sh +2 -2
  71. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/scripts/install_claude.sh +1 -1
  72. outerloop_science-0.4.0/scripts/install_codex.sh +103 -0
  73. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/scripts/install_hermes.sh +4 -4
  74. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/scripts/requeue_moved_successors.sh +2 -2
  75. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/scripts/sweep_git_locks.sh +1 -1
  76. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/scripts/tick_deploy.sh +6 -3
  77. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/scripts/tick_resident.sh +1 -1
  78. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/src/outerloop/__init__.py +1 -1
  79. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/src/outerloop/attempt.py +466 -134
  80. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/src/outerloop/brief.py +132 -77
  81. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/src/outerloop/cli.py +123 -14
  82. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/src/outerloop/climbboard.py +29 -7
  83. outerloop_science-0.4.0/src/outerloop/codex_requirements.toml +3 -0
  84. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/src/outerloop/compute.py +14 -6
  85. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/src/outerloop/contract.py +185 -20
  86. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/src/outerloop/disk.py +1 -1
  87. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/src/outerloop/dispatch.py +171 -12
  88. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/src/outerloop/github.py +197 -19
  89. outerloop_science-0.4.0/src/outerloop/guidance_pack.py +63 -0
  90. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/src/outerloop/harness.py +255 -76
  91. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/src/outerloop/harness_cli.py +169 -20
  92. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/src/outerloop/harness_pins.py +10 -0
  93. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/src/outerloop/harnesses.toml +3 -2
  94. outerloop_science-0.4.0/src/outerloop/hermes_capture.py +67 -0
  95. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/src/outerloop/housekeeping.py +1 -1
  96. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/src/outerloop/image.py +11 -1
  97. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/src/outerloop/inbox.py +18 -2
  98. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/src/outerloop/ledger_branch.py +4 -2
  99. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/src/outerloop/ledger_events.py +6 -3
  100. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/src/outerloop/ledger_migrate.py +3 -2
  101. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/src/outerloop/maintain.py +1 -1
  102. outerloop_science-0.4.0/src/outerloop/markers.py +38 -0
  103. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/src/outerloop/measure.py +143 -42
  104. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/src/outerloop/operator_limits.py +5 -2
  105. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/src/outerloop/orchestrator.py +357 -65
  106. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/src/outerloop/panel.py +12 -2
  107. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/src/outerloop/posting.py +92 -16
  108. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/src/outerloop/progress.py +35 -4
  109. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/src/outerloop/review.py +31 -2
  110. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/src/outerloop/review_agent.py +4 -2
  111. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/src/outerloop/review_post_cli.py +15 -24
  112. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/src/outerloop/role_runner.py +60 -0
  113. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/src/outerloop/runstate.py +30 -6
  114. outerloop_science-0.4.0/src/outerloop/session_evidence.py +521 -0
  115. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/src/outerloop/status.py +21 -1
  116. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/src/outerloop/steward.py +30 -5
  117. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/src/outerloop/syscall.py +82 -14
  118. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/src/outerloop/syscall_cli.py +99 -28
  119. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/src/outerloop/tick.py +56 -55
  120. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/src/outerloop/verifier.py +28 -31
  121. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/src/outerloop/verify_agent.py +46 -2
  122. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/src/outerloop/verify_post_cli.py +12 -19
  123. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/src/outerloop/watcher.py +8 -0
  124. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/conftest.py +12 -0
  125. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/fixtures/README.md +16 -0
  126. outerloop_science-0.4.0/tests/fixtures/default_contract_head.json +28 -0
  127. outerloop_science-0.4.0/tests/fixtures/dispatched_pre_gpu_identity/completed/eval-candidate-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa-f69684777d523fe6502ee4ed4d09f98410a56aec/command.txt +1 -0
  128. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/fixtures/dispatched_pre_gpu_identity/completed/eval-candidate-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa-f69684777d523fe6502ee4ed4d09f98410a56aec/provenance.json +1 -1
  129. outerloop_science-0.4.0/tests/fixtures/dispatched_pre_gpu_identity/completed/eval-candidate-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa-f69684777d523fe6502ee4ed4d09f98410a56aec/submitted +1 -0
  130. outerloop_science-0.4.0/tests/fixtures/dispatched_pre_gpu_identity/inflight/eval-candidate-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa-f69684777d523fe6502ee4ed4d09f98410a56aec/command.txt +1 -0
  131. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/fixtures/dispatched_pre_gpu_identity/inflight/eval-candidate-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa-f69684777d523fe6502ee4ed4d09f98410a56aec/provenance.json +1 -1
  132. outerloop_science-0.4.0/tests/fixtures/dispatched_pre_gpu_identity/inflight/eval-candidate-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa-f69684777d523fe6502ee4ed4d09f98410a56aec/submitted +1 -0
  133. outerloop_science-0.4.0/tests/fixtures/pre_contract_switches.json +51 -0
  134. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/fixtures/rc1_v021/baselines/main@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.json +1 -1
  135. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/fixtures/rc1_v021/brief.txt +1 -1
  136. outerloop_science-0.4.0/tests/fixtures/rc1_v021/end-request.json +1 -0
  137. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/fixtures/rc1_v021/ended.json +1 -1
  138. outerloop_science-0.4.0/tests/fixtures/rc1_v021/eval-provenance/command.txt +1 -0
  139. outerloop_science-0.4.0/tests/fixtures/rc1_v021/eval-run/eval-candidate-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa-f69684777d523fe6502ee4ed4d09f98410a56aec/command.txt +1 -0
  140. outerloop_science-0.4.0/tests/fixtures/rc1_v021/eval-run/eval-candidate-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa-f69684777d523fe6502ee4ed4d09f98410a56aec/submitted +1 -0
  141. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/fixtures/rc1_v021/identity.json +1 -1
  142. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/fixtures/rc1_v021/merged.json +1 -1
  143. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/fixtures/rc1_v021/open.json +1 -1
  144. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/fixtures/rc1_v021/pending/owner__repo.json +1 -1
  145. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/fixtures/rc1_v021/pending/owner__repo@agent-01.json +1 -1
  146. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/fixtures/rc1_v021/pr-states.json +1 -1
  147. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/fixtures/rc1_v021/queue.json +1 -1
  148. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/fixtures/rc1_v021/rebind.json +1 -1
  149. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/fixtures/rc1_v021/sessionless.json +1 -1
  150. outerloop_science-0.4.0/tests/fixtures/session_cost_legacy.json +5 -0
  151. outerloop_science-0.4.0/tests/fixtures/suite_measurement_legacy.json +1 -0
  152. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/test_attempt.py +704 -102
  153. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/test_attempt_review.py +149 -164
  154. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/test_author_overrides.py +119 -1
  155. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/test_bot_aliases.py +1 -1
  156. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/test_brief.py +13 -8
  157. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/test_climbboard.py +81 -110
  158. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/test_codex_bridge.py +3 -1
  159. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/test_codex_harness.py +80 -3
  160. outerloop_science-0.4.0/tests/test_codex_hooks.py +276 -0
  161. outerloop_science-0.4.0/tests/test_codex_host.py +232 -0
  162. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/test_compute.py +7 -7
  163. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/test_contract.py +157 -16
  164. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/test_contract_names.py +42 -3
  165. outerloop_science-0.4.0/tests/test_contract_switches.py +790 -0
  166. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/test_default_claude_model.py +1 -1
  167. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/test_dispatch.py +248 -7
  168. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/test_endpoints.py +2 -0
  169. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/test_github.py +16 -2
  170. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/test_harness.py +8 -3
  171. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/test_harness_pins.py +190 -7
  172. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/test_hermes_harness.py +47 -2
  173. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/test_inbox.py +125 -149
  174. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/test_install_harness.py +8 -4
  175. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/test_intake.py +1 -1
  176. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/test_ledger_events.py +3 -1
  177. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/test_markers.py +8 -8
  178. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/test_measure.py +148 -9
  179. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/test_measure_and_decide.py +64 -5
  180. outerloop_science-0.4.0/tests/test_operator_message.py +56 -0
  181. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/test_orchestrator.py +387 -362
  182. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/test_panel.py +11 -0
  183. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/test_posting.py +71 -0
  184. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/test_requeue_moved_successors.py +4 -4
  185. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/test_review_agent.py +21 -1
  186. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/test_role_runner.py +22 -0
  187. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/test_runstate.py +22 -2
  188. outerloop_science-0.4.0/tests/test_session_evidence.py +690 -0
  189. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/test_start.py +17 -11
  190. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/test_status.py +12 -1
  191. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/test_steward.py +109 -19
  192. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/test_syscall.py +119 -192
  193. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/test_syscall_cli.py +67 -23
  194. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/test_tick.py +293 -190
  195. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/test_tick_resident.py +6 -3
  196. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/test_verifier.py +16 -9
  197. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/test_verify_agent.py +24 -0
  198. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/test_version.py +1 -1
  199. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/test_watcher.py +4 -4
  200. outerloop_science-0.4.0/uv.lock +1471 -0
  201. outerloop_science-0.3.0rc2/README.md +0 -133
  202. outerloop_science-0.3.0rc2/SECURITY.md +0 -37
  203. outerloop_science-0.3.0rc2/docs/community.md +0 -54
  204. outerloop_science-0.3.0rc2/docs/compute.md +0 -26
  205. outerloop_science-0.3.0rc2/docs/contract.md +0 -40
  206. outerloop_science-0.3.0rc2/docs/endpoints.md +0 -252
  207. outerloop_science-0.3.0rc2/docs/install.md +0 -1036
  208. outerloop_science-0.3.0rc2/docs/reviewer.md +0 -54
  209. outerloop_science-0.3.0rc2/scripts/install_codex.sh +0 -104
  210. outerloop_science-0.3.0rc2/src/outerloop/markers.py +0 -48
  211. outerloop_science-0.3.0rc2/tests/fixtures/dispatched_pre_gpu_identity/completed/eval-candidate-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa-f69684777d523fe6502ee4ed4d09f98410a56aec/command.txt +0 -1
  212. outerloop_science-0.3.0rc2/tests/fixtures/dispatched_pre_gpu_identity/completed/eval-candidate-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa-f69684777d523fe6502ee4ed4d09f98410a56aec/submitted +0 -1
  213. outerloop_science-0.3.0rc2/tests/fixtures/dispatched_pre_gpu_identity/inflight/eval-candidate-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa-f69684777d523fe6502ee4ed4d09f98410a56aec/command.txt +0 -1
  214. outerloop_science-0.3.0rc2/tests/fixtures/dispatched_pre_gpu_identity/inflight/eval-candidate-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa-f69684777d523fe6502ee4ed4d09f98410a56aec/submitted +0 -1
  215. outerloop_science-0.3.0rc2/tests/fixtures/rc1_v021/end-request.json +0 -1
  216. outerloop_science-0.3.0rc2/tests/fixtures/rc1_v021/eval-provenance/command.txt +0 -1
  217. outerloop_science-0.3.0rc2/tests/fixtures/rc1_v021/eval-run/eval-candidate-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa-f69684777d523fe6502ee4ed4d09f98410a56aec/command.txt +0 -1
  218. outerloop_science-0.3.0rc2/tests/fixtures/rc1_v021/eval-run/eval-candidate-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa-f69684777d523fe6502ee4ed4d09f98410a56aec/submitted +0 -1
  219. outerloop_science-0.3.0rc2/uv.lock +0 -910
  220. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/.python-version +0 -0
  221. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/CONTRIBUTING.md +0 -0
  222. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/LICENSE +0 -0
  223. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/NOTICE +0 -0
  224. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/containers/README.md +0 -0
  225. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/containers/agent-py312.def +0 -0
  226. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/docs/assets/icon-dark.svg +0 -0
  227. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/docs/assets/icon-light.svg +0 -0
  228. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/docs/assets/icon.svg +0 -0
  229. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/docs/design/base-reintegration.md +0 -0
  230. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/docs/design/consolidation.md +0 -0
  231. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/docs/design/github-app-auth.md +0 -0
  232. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/docs/design/judge-placement.md +0 -0
  233. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/docs/design/meta.md +0 -0
  234. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/docs/design/onboarding.md +0 -0
  235. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/docs/design/public-surface.md +0 -0
  236. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/docs/design/research-loop.md +0 -0
  237. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/docs/design/roles.md +0 -0
  238. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/scripts/README.md +0 -0
  239. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/scripts/setup_branch_protection.sh +0 -0
  240. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/scripts/tick_chain.sbatch +0 -0
  241. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/src/outerloop/__main__.py +0 -0
  242. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/src/outerloop/appauth.py +0 -0
  243. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/src/outerloop/appmanifest.py +0 -0
  244. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/src/outerloop/author_overrides.py +0 -0
  245. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/src/outerloop/bridge_install.py +0 -0
  246. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/src/outerloop/bridge_runtime/pyproject.toml +0 -0
  247. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/src/outerloop/bridge_runtime/uv.lock +0 -0
  248. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/src/outerloop/codex_bridge.py +0 -0
  249. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/src/outerloop/contract_cli.py +0 -0
  250. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/src/outerloop/endpoint_wait.py +0 -0
  251. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/src/outerloop/endpoints.py +0 -0
  252. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/src/outerloop/evalcache.py +0 -0
  253. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/src/outerloop/gpu_lanes.py +0 -0
  254. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/src/outerloop/hermes_install.py +0 -0
  255. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/src/outerloop/hypothesis.py +0 -0
  256. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/src/outerloop/init.py +0 -0
  257. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/src/outerloop/instance.py +0 -0
  258. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/src/outerloop/intake.py +0 -0
  259. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/src/outerloop/job_names.py +0 -0
  260. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/src/outerloop/launchlog.py +0 -0
  261. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/src/outerloop/limits.py +0 -0
  262. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/src/outerloop/maintain_agent_cli.py +0 -0
  263. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/src/outerloop/maintain_post_cli.py +0 -0
  264. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/src/outerloop/paths.py +0 -0
  265. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/src/outerloop/provenance.py +0 -0
  266. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/src/outerloop/py.typed +0 -0
  267. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/src/outerloop/rebind.py +0 -0
  268. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/src/outerloop/review_agent_cli.py +0 -0
  269. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/src/outerloop/review_summarize_cli.py +0 -0
  270. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/src/outerloop/roles.py +0 -0
  271. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/src/outerloop/rolespec.py +0 -0
  272. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/src/outerloop/style.py +0 -0
  273. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/src/outerloop/verify_agent_cli.py +0 -0
  274. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/fakes.py +0 -0
  275. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/fixtures/author_route_legacy.json +0 -0
  276. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/fixtures/author_route_missing_model.json +0 -0
  277. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/fixtures/author_route_missing_route.json +0 -0
  278. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/fixtures/base_moved_cc4e5d7.json +0 -0
  279. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/fixtures/dispatched_pre_gpu_identity/completed/eval-candidate-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa-f69684777d523fe6502ee4ed4d09f98410a56aec/exit-code +0 -0
  280. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/fixtures/dispatched_pre_gpu_identity/completed/eval-candidate-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa-f69684777d523fe6502ee4ed4d09f98410a56aec/job.sh +0 -0
  281. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/fixtures/dispatched_pre_gpu_identity/completed/eval-candidate-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa-f69684777d523fe6502ee4ed4d09f98410a56aec/stdout +0 -0
  282. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/fixtures/dispatched_pre_gpu_identity/identity.json +0 -0
  283. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/fixtures/dispatched_pre_gpu_identity/inflight/eval-candidate-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa-f69684777d523fe6502ee4ed4d09f98410a56aec/job.sh +0 -0
  284. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/fixtures/hermes_resume_legacy.json +0 -0
  285. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/fixtures/hermes_sample_20260924.json +0 -0
  286. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/fixtures/launches-before-provenance.jsonl +0 -0
  287. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/fixtures/panel_wake_9ca3d7c.json +0 -0
  288. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/fixtures/rc1_v021/eval-provenance/job.sh +0 -0
  289. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/fixtures/rc1_v021/eval-run/eval-candidate-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa-f69684777d523fe6502ee4ed4d09f98410a56aec/exit-code +0 -0
  290. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/fixtures/rc1_v021/eval-run/eval-candidate-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa-f69684777d523fe6502ee4ed4d09f98410a56aec/job.sh +0 -0
  291. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/fixtures/rc1_v021/eval-run/eval-candidate-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa-f69684777d523fe6502ee4ed4d09f98410a56aec/stdout +0 -0
  292. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/fixtures/rc1_v021/generate.py.txt +0 -0
  293. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/fixtures/rc1_v021/launches.jsonl +0 -0
  294. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/fixtures/rc1_v021/line.bundle +0 -0
  295. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/helpers.py +0 -0
  296. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/ledger_fake.py +0 -0
  297. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/test_app_permissions.py +0 -0
  298. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/test_appauth.py +0 -0
  299. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/test_appmanifest.py +0 -0
  300. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/test_bot_login.py +0 -0
  301. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/test_channel_dir.py +0 -0
  302. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/test_contract_cli.py +0 -0
  303. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/test_disk.py +0 -0
  304. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/test_endpoint_wait.py +0 -0
  305. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/test_evalcache.py +0 -0
  306. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/test_gpu_lanes.py +0 -0
  307. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/test_hardening.py +0 -0
  308. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/test_hermes_author.py +0 -0
  309. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/test_housekeeping.py +0 -0
  310. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/test_image.py +0 -0
  311. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/test_import.py +0 -0
  312. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/test_init.py +0 -0
  313. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/test_instance.py +0 -0
  314. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/test_launchlog.py +0 -0
  315. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/test_ledger_migrate.py +0 -0
  316. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/test_lifecycle_cli.py +0 -0
  317. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/test_limits.py +0 -0
  318. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/test_local_compute.py +0 -0
  319. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/test_maintain.py +0 -0
  320. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/test_messages.py +0 -0
  321. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/test_operator_end.py +0 -0
  322. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/test_operator_limits.py +0 -0
  323. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/test_packaging.py +0 -0
  324. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/test_paths.py +0 -0
  325. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/test_progress.py +0 -0
  326. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/test_rebind.py +0 -0
  327. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/test_review.py +0 -0
  328. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/test_review_agent_cli.py +0 -0
  329. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/test_review_hardening.py +0 -0
  330. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/test_review_policy.py +0 -0
  331. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/test_review_summarize.py +0 -0
  332. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/test_rolespec.py +0 -0
  333. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/test_sweep_git_locks.py +0 -0
  334. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/test_tick_chain_successors.py +0 -0
  335. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/test_tiers.py +0 -0
  336. {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/test_verify_agent_cli.py +0 -0
@@ -5,6 +5,10 @@ __pycache__/
5
5
  dist/
6
6
  build/
7
7
 
8
+ # Docs site (scripts/docs/build.sh; dist/ is the Python build)
9
+ dist-docs/
10
+ site/
11
+
8
12
  # Environments
9
13
  .venv/
10
14
 
@@ -12,6 +16,9 @@ build/
12
16
  .pytest_cache/
13
17
  .mypy_cache/
14
18
  .ruff_cache/
19
+ .coverage
20
+ .coverage.*
21
+ htmlcov/
15
22
 
16
23
  # Agent run artifacts (transcripts contain target-repo code — never commit)
17
24
  runs/
@@ -5,6 +5,9 @@ repos:
5
5
  - id: check-added-large-files
6
6
  args: [--maxkb=500]
7
7
  - id: end-of-file-fixer
8
+ # byte-exact archived-writer fixture: save_record must round-trip it,
9
+ # and that writer emitted no trailing newline
10
+ exclude: ^tests/fixtures/author_route_legacy\.json$
8
11
  - id: trailing-whitespace
9
12
  - id: check-merge-conflict
10
13
  - id: check-yaml
@@ -6,6 +6,381 @@ Versions follow [SemVer](https://semver.org).
6
6
 
7
7
  ## [Unreleased]
8
8
 
9
+ ## [0.4.0] - 2026-10-20
10
+
11
+ ### Upgrading
12
+
13
+ Operator actions before upgrading (everything else needs no action; details
14
+ in each entry):
15
+
16
+ - Rename `autoresearch:*` labels on target repos to `outerloop:*` and update
17
+ workflow `if:` conditions that match them; old labels and comment markers
18
+ are no longer recognized.
19
+ - Change an open research-log issue's `<!-- autoresearch:research-log -->`
20
+ marker to `<!-- outerloop:research-log -->`, and finish, close, or re-mark
21
+ issues and PRs that carry other `autoresearch:` markers; otherwise the
22
+ kernel may re-post a review, re-pick a claimed issue, or open a duplicate.
23
+ - Rename the contract key `climb_job_minutes` to `attempt_job_minutes`, and
24
+ finish or rebind runs parked on a commit whose contract still uses it.
25
+ - Finish or rebind parked runs whose benchmark was renamed or removed.
26
+ - Run `outerloop harness upgrade codex` (deploys that run harness upgrades do
27
+ this automatically).
28
+ - The one-idea rule is no longer enforced; a repository that wants it writes
29
+ it into its guidance files.
30
+
31
+ What changes for runs in flight: a parked run may get one tool-update note at
32
+ its first wake; a measurement between infrastructure retries may get one extra
33
+ retry; codex costs captured before the upgrade still overstate resumed
34
+ sessions.
35
+
36
+ Before rolling back: remove `regression` blocks from contracts, drain parked
37
+ runs, and do not roll back while self-reported claims exist.
38
+
39
+ ### Documentation
40
+
41
+ - The docs site is now a manual: getting started, task guides, concept pages
42
+ with figures, and reference pages for contract fields, the operator CLI,
43
+ agent syscalls, inbox messages and environment variables.
44
+ - Tests, comments and design notes use generic cluster, partition and
45
+ hardware names (`gpu-large`, `cpu-short`, "cluster A") instead of site-specific ones.
46
+ The docs site drops its footer line.
47
+
48
+ ### Changed
49
+
50
+ - Harness upgrades kill an install only after `OUTERLOOP_HARNESS_TIMEOUT_SECONDS`
51
+ without installer output, with a one-hour overall backstop, so a slow venv
52
+ build completes instead of dying every tick. The installers now print while
53
+ they download and unpack (uv runs verbosely, curl shows progress bars, git
54
+ clone reports progress), so a healthy install never looks stalled. A busy
55
+ upgrade lock now says another upgrade is running rather than `[Errno 11]`.
56
+ Upgrading: the variable keeps its name and default but now means time since
57
+ the last output, so an install that keeps printing may run for up to an hour.
58
+
59
+ - The author verb `end` is renamed `stop` (`stop --report FILE`,
60
+ `stop --withdraw REASON`), with no alias: agents read `end` as "end this
61
+ turn" and called it when they meant to wait for results, so the refusals
62
+ it hit now each name the next step (`sleep`, `cancel`, `stop`). Upgrading:
63
+ a staged request an older kernel's CLI wrote with `"type": "end"` is
64
+ still honoured; the verb is now `stop`.
65
+
66
+ - The git safety checks now run once at each hand-off between a session and
67
+ kernel code (session start and return, wake start, panel read) instead
68
+ of on every kernel git call. Kernel git calls after a hand-off reuse its
69
+ filter-driver listing; launching untrusted code on the workspace drops
70
+ it. A workspace no hand-off covers keeps the per-call check (#512).
71
+
72
+ - The advisory-review examples and install guide track the `v0` release tag
73
+ (`@v0` with `reviewer_ref: v0`) instead of `main` or an exact release. `v0`
74
+ moves only when a final release is cut (a new `RELEASING.md` step), so
75
+ callers follow releases without hand bumps and never run the moving branch
76
+ with their reviewer key (#494).
77
+
78
+ - Research taste moved out of the kernel and into a configurable GUIDANCE
79
+ layer. Kernel agent-facing text (the author brief, the panel claim, the
80
+ verifier rubric) now carries only mechanics; a new top-level contract key
81
+ `guidance` selects the pack: `default` (the moved texts minus the
82
+ one-idea rule), `none`, or a repo-relative directory holding `author.md`
83
+ and `panel.md` (recommended location `.github/outerloop/guidance/`).
84
+ Guidance is read via git objects from the same ref as the contract
85
+ (never the working tree; a symlink blob is refused), capped at 8,000
86
+ characters per file, carried last in the author brief and in the panel
87
+ judges' prompt — outside the fence that holds the claim as untrusted
88
+ data — and labelled advisory; it may never point into `.outerloop/`.
89
+ The panel now blocks only on validity — harness
90
+ exploitation, ruler/seed fishing, data leakage, a confirmed claim-vs-evidence
91
+ contradiction, and scope and measurement facts; aggregation and landscape
92
+ live only in the pack (so `none` leaves validity criteria only), and the
93
+ taste halves of the overfitting/unsupported-claim/measurement-gap rubric
94
+ are advisory-only. Upgrading: the one-idea rule is no longer enforced
95
+ anywhere — a repository that wants it writes it into its guidance files
96
+ (the panel will not block on it); the default hypothesis, done criteria,
97
+ PR body and brief wording changed accordingly, and stored briefs from
98
+ earlier versions still load unchanged.
99
+ - A second pass moved the remaining research advice out of the kernel brief
100
+ into the default guidance pack (when to check the sibling view, budgeting
101
+ experiments against the final eval, running the repo's checks before a
102
+ submit) and deleted the divergence-debt aside from the research-line
103
+ section; under `guidance: none` the brief now states mechanics only.
104
+ ### Added
105
+
106
+ - Operator `outerloop message <run-id> (<text> | --file <path>)` to append one
107
+ note to a run's inbox, delivered at the run's next wake — no PR needed.
108
+ Reuses the existing `note`/`kernel` message shape, so older kernels read it
109
+ without a compatibility change. Upgrading: no action needed; it appends an
110
+ ordinary note from the kernel; a parked run that is not waiting on jobs wakes
111
+ at the next tick to read it, and one waiting on jobs reads it when they end.
112
+ - `OUTERLOOP_UNCONTAINED=1` runs a cluster deployment without a container
113
+ runtime: sessions and evaluations run as Slurm jobs the way local mode runs
114
+ them without an image, the image is ignored, and the panel stays opt-in
115
+ (`OUTERLOOP_PANEL_UNCONTAINED=1`, now also carried by the chain's deploy
116
+ step). Without it, a cluster deployment with no image still services nothing,
117
+ and its log now names the setting. `outerloop start` now checks the fleet
118
+ default author with the tick's own author check, as it already did for
119
+ overrides, reading settings with the precedence the launched tick applies,
120
+ so a default the tick would refuse (a Codex or Hermes author without an
121
+ image, a Codex author without a Codex model) fails at start instead of
122
+ idling every tick.
123
+ - Multi-node benchmarks: a benchmark's `nodes` (default 1, up to 64) spreads
124
+ every dispatched job over that many nodes, with `gpus` per node. The eval
125
+ job `srun`s one task per node; each runs the command in its own checkout
126
+ with `NNODES`, `NODE_RANK`, `MASTER_ADDR`, `MASTER_PORT` and torchrun's
127
+ `PET_*` defaults set, node 0's output is the measurement, and a failing node
128
+ stops the rest. A requeued job clears the earlier attempt's per-node results
129
+ before it starts, and those rendezvous names (and any `PET_*`) are refused as
130
+ a `seed_env`. GPU-hour charges, budget checks, sweep pacing and the
131
+ operator's GPU ceiling count `nodes x gpus`. Uncontained Slurm deployments
132
+ only: a contained or local deployment refuses to launch attempts on such a
133
+ contract. Upgrading: one-node benchmarks keep their measurement signatures,
134
+ eval slots and cached baselines unchanged; cached baselines now record
135
+ their node count, and entries without one read as one node. A contract
136
+ that sets `nodes` fails to load on older kernels (unknown keys are
137
+ refused), so upgrade every fleet that services a target before adding it.
138
+ - `OUTERLOOP_OPERATOR_HARNESSES` lists harness CLIs the operator supplies, such
139
+ as a site-managed `claude` that authenticates by itself: `outerloop harness
140
+ upgrade` (and the deployment's automatic `--used` run) never replaces them or
141
+ rewrites their recorded paths, and `outerloop harness status` reports
142
+ `OPERATOR` instead of drift. Unknown names are refused. The chain's deploy
143
+ step re-reads it from `.env` every tick.
144
+
145
+ ### Documentation
146
+
147
+ - Document `OUTERLOOP_CODEX_WEB_SEARCH` and the steward and panel judge key
148
+ files (`OUTERLOOP_STEWARD_KEY_FILE`, `OUTERLOOP_PANEL_KEY_FILE`,
149
+ `OUTERLOOP_PANEL_CODEX_KEY_FILE`, `OUTERLOOP_PANEL_HERMES_KEY_FILE`) in the
150
+ install guide, and mark the verification-loop and dispatcher design notes
151
+ as built (#337).
152
+ - `docs/design/compute-cloud.md` (#348): Slurm on a cloud as the 0.4
153
+ deployment, with operator guidance and the kernel gaps it exposed; clouds
154
+ without Slurm (git in, artifact out; a meta-provider; the run-artifact
155
+ store) as the long-term direction.
156
+ - The pages in `docs/` build into a MkDocs Material site (`mkdocs.yml`,
157
+ `scripts/docs/build.sh`), with the README and project pages as site pages
158
+ and `noindex` staging until the public launch (#523).
159
+
160
+ ### Changed
161
+
162
+ - Refreshed locked dependencies to current releases admitted by the existing
163
+ bounds: cryptography 50.0.1→50.0.2, pydantic 2.13.5→2.14.0 (pydantic-core
164
+ 2.46.5→2.50.0), mypy 2.3.1→2.4.0, ruff 0.16.6→0.17.0, and transitives;
165
+ workflows pin `astral-sh/setup-uv@v10.2.0` (#337).
166
+ - The review and verify posting CLIs now share one gate for the untrusted
167
+ emitted envelope, so a security fix to the decode/identity/kind checks lands
168
+ in both (#337). Upgrading: no action needed; envelopes already emitted keep
169
+ their shape and are read the same way, so a round started before the upgrade
170
+ posts normally.
171
+ - The `.git` guard's object read no longer derives filter-driver overrides
172
+ (`cat-file -e` never converts working-tree files), dropping one
173
+ `git config --get-regexp` subprocess from every guarded kernel git call
174
+ with no change to what is refused or neutralized (#512).
175
+ - A review round refused because the pinned harness is too old for the model,
176
+ or because the runner's harness install is missing or stale, now says which
177
+ and how to fix it instead of calling it an API outage (#475). Upgrading: no
178
+ action needed; the next skipped round names the cause, and skip comments
179
+ already posted keep their text.
180
+
181
+ ### Fixed
182
+
183
+ - A wake that upgrades the author's syscall tool now queues the "tool was
184
+ updated" note once per tool version, keyed by the installed tool's content
185
+ digest. The kernel records that digest in the run record when it installs or
186
+ refreshes the tool (a fresh climb records it without a note), so a wake under
187
+ the same kernel has nothing to announce. A wake whose recorded digest differs
188
+ appends the note before saving the new digest: an interruption between the
189
+ two re-sends at most once, and the inbox's key dedup prevents a duplicate.
190
+ Upgrading: an old `tool:` inbox key written by an earlier kernel no longer
191
+ suppresses the new note, so a parked run may see one update note at its first
192
+ wake after upgrading.
193
+ - Reserve infrastructure retries before submission so a crash before recording
194
+ the job id cannot exceed the two-retry cap; undo the reservation only on a
195
+ capacity rejection before submission. Upgrading: a measure that was between
196
+ infrastructure retries when the kernel was upgraded may get one extra retry,
197
+ once, because older journals counted failures rather than reserved retries.
198
+ - A dispatched baseline or cleanly completed eval that ends with no result is
199
+ now an infrastructure failure: two uncharged retries, then a park naming the
200
+ `infra-retries.json` an operator deletes to resume (#474). Upgrading: a
201
+ missing journal or `stage.wait_note` reads as zero retries / no note.
202
+ - A codex run that slept and resumed was priced once per leg: `exec resume`
203
+ reports the thread's cumulative token usage as each leg's usage, so
204
+ `outerloop status` overstated a resumed session's cost by roughly the
205
+ number of legs (#479). Session totals now price a codex thread once, at
206
+ its newest leg. Claude Code sessions keep summing each leg's reported
207
+ cost: cumulative resume totals arrived only in Claude Code 2.1.277, and
208
+ the CLI version that ran a session is not recorded — an author override
209
+ can pin an older CLI whose legs are per invocation — so summing, which
210
+ can overstate a resumed session on a current CLI, never undercounts one
211
+ on an older CLI.
212
+ Upgrading: index entries written before this change carry no session id
213
+ and keep contributing their recorded cost, so resumed codex sessions
214
+ captured before the upgrade still overstate; totals are accurate for
215
+ sessions captured after upgrading.
216
+ - A label-triggered review round no longer restarts the round counter at 1
217
+ after a summarizer (panel) round: both paths post as the same underlying
218
+ reviewer, so the count continues (#373). Upgrading: no action needed; round
219
+ stamps already posted are still counted, and the next round continues the
220
+ reviewer's count instead of restarting at 1.
221
+ - A manual climb now refuses a relative codex/hermes panel key path, like the
222
+ service preflight always did (#498).
223
+ - A session that ends in error while an out-of-memory kill happens in the job
224
+ ended its run with only the session's symptom; the ending now notes when an
225
+ out-of-memory kill was observed in the job during the session (#483).
226
+ Upgrading: no action needed; endings already recorded keep their text, and
227
+ only a session that ends after the upgrade carries the note.
228
+ - A model-API rate limit (HTTP 429) is now recognized as an outage in every
229
+ backend's wording, and always takes the latch's short 5-minute cooldown,
230
+ so throttled runs park briefly instead of ending aborted (#481). Upgrading:
231
+ no action needed; a latch stamped before the upgrade keeps the cooldown it
232
+ recorded (up to 45 minutes), and a throttle stamped after it takes 5 minutes.
233
+ - An author session that stops without staging anything (an empty reply after
234
+ long reasoning, or a line of narration with no command) no longer ends its
235
+ run as "ended without a submit". The kernel resumes the session with a note
236
+ that nothing ran and the run is still open, up to three times per leg. A stop
237
+ after a kernel note, a gate verdict, or with a PR open is still taken as the
238
+ agent's answer, and `stop` (formerly `end`) still ends the run. Upgrading: no action needed; a
239
+ run already ended as "ended without a submit" stays ended, and the resume
240
+ applies to a leg that stops after the upgrade.
241
+ - A Codex session that recovers from a transient error no longer ends its run
242
+ as aborted. Codex reports a dropped or timed-out model stream as an `error`
243
+ event ("Reconnecting... 1/5") and carries on; the kernel now counts an error
244
+ as fatal only when no completed turn follows it, the turn fails, or Codex
245
+ exits non-zero (#491).
246
+ - Codex installed from npm (the review workflow's install) runs through a
247
+ script launcher whose vendored binary carries its own code-mode host; the
248
+ session no longer refuses it for lacking a host beside the launcher. A
249
+ contained session refuses a launcher up front (the image has no Node.js).
250
+ - `examples/review.yml` referenced a nonexistent `@v1` tag; it now pins the
251
+ current release (`v0.3.0`, with a matching `reviewer_ref`) (#475).
252
+ - Native Codex sessions failed on the first turn because Codex 0.160's code-mode
253
+ host was not installed. The installer now installs and verifies it, and a
254
+ session refuses to start without it.
255
+ Upgrading: run `outerloop harness upgrade codex`; deploys that run harness
256
+ upgrades do this automatically. Existing single-binary installs are detected
257
+ as drift and replaced with a verified pair.
258
+ - Uncontained sweep tasks now receive `SWEEP_INDEX`: the bare evaluation
259
+ branch runs the command under `env -i` and dropped it, so every task of a
260
+ sweep without an image ran the default configuration.
261
+
262
+ ### Changed
263
+
264
+ - A run whose benchmark is no longer in its contract (renamed or removed)
265
+ stops with one clear message naming the benchmarks the contract has,
266
+ instead of continuing on default settings (no GPU budget, default eval
267
+ walltime, research lines off). A contract that fails to load still leaves
268
+ parked runs parked until it is fixed. Upgrading: finish or rebind a parked
269
+ run before upgrading if its benchmark was renamed or removed; on its next
270
+ wake it ends aborted with a message naming the benchmarks the contract has.
271
+
272
+ ### Removed
273
+
274
+ - Upgrading: labels and comment markers are recognized only under the
275
+ `outerloop:` prefix; the retired markers are `followup`, `body-edit`,
276
+ `claimed`, `claim-released`, `withdraw`, `unmeasured-merge`,
277
+ `advisory-review`, `verification-review`, `maintenance-digest`,
278
+ `round-skipped`, `contract-alarm`, `outage-release` and `research-log`, and
279
+ the retired labels are `review`, `steward`,
280
+ `no-review` and `task`. Rename any `autoresearch:*` labels on target repos
281
+ (`gh label edit autoresearch:review --name outerloop:review`), update
282
+ workflow `if:` conditions that match the old label, and change an open
283
+ research-log issue's `<!-- autoresearch:research-log -->` marker to
284
+ `<!-- outerloop:research-log -->`, or the kernel opens a new one; on old
285
+ comments and issue or PR bodies it no longer sees the retired markers, so it
286
+ may re-post a review or addendum, re-pick an already claimed issue, or open
287
+ a duplicate digest issue — finish or close them before upgrading, or edit
288
+ the marker to `outerloop:` where the kernel must still recognize it.
289
+ - Upgrading: the contract budget key `climb_job_minutes` is no longer read,
290
+ and a contract that still uses it fails validation, so rename it to
291
+ `attempt_job_minutes` before upgrading. A wake reads both the current base
292
+ branch's contract and the contract at the commit the run was parked on, so
293
+ finish or rebind a run whose parked commit still uses the old key: it fails
294
+ on wake and stays stuck even after the branch is renamed.
295
+
296
+ ### Added
297
+
298
+ - Add optional per-benchmark `regression` allowances with a free tolerance,
299
+ exclusive hard cap, and optional measured climbed-gain requirement, in
300
+ relative or absolute units. Suite rows and reports identify the applied rule.
301
+ Upgrading: no action for existing contracts; their gate behavior and measurement
302
+ signatures are unchanged. Legacy suite rows without `rule` default to
303
+ `legacy-floor`; the new row field is additive. Contracts using the new block
304
+ require this kernel version and must remove it before rolling back.
305
+
306
+ ### Changed
307
+
308
+ - Codex sessions never get Codex's built-in sub-agent tools; multi-agent work
309
+ goes through the kernel's channels. `OUTERLOOP_CODEX_WEB_SEARCH` controls
310
+ Codex's built-in web search: `auto` (default) leaves it to Codex on native
311
+ provider sessions and turns it off on endpoint sessions, where it cannot run;
312
+ `off` turns it off everywhere. This fixes Codex sessions on chat-only
313
+ endpoints, which failed with "unsupported bridge request" after the 0.160 pin.
314
+ Upgrading: no action.
315
+ - `OUTERLOOP_TOKEN_PRICES` in the deployment `.env` now reaches ticks and the
316
+ jobs they submit, so session cost is priced from the operator table instead of
317
+ staying unknown. Upgrading: no action.
318
+ - GPU job sizing is an operator setting: `OUTERLOOP_EVAL_CPUS_PER_GPU` and
319
+ `OUTERLOOP_EVAL_MEM_GB_PER_GPU` (defaults 8 and 64) set the per-GPU core and
320
+ memory floor for GPU evals and author launches, for nodes with fewer cores or
321
+ less memory per GPU. Upgrading: no action; unset keeps the defaults.
322
+ - Apply the current contract's channel settings before wake message delivery or
323
+ workspace fetches; a run keeps the verification mode it started with, so a
324
+ contract change applies to runs that start after it. Allow measured results to
325
+ replace an earlier self-reported leader without inheriting its claimed baseline.
326
+
327
+ - Bump the pinned Codex CLI from 0.130.0 to 0.160.0 and update its Linux
328
+ archive digest. All contained Codex roles bind a kernel-owned, read-only
329
+ managed-hooks-only policy; uncontained sessions disable lifecycle hooks and
330
+ plugins (including built-in cleanup hooks) because this CLI has no per-session
331
+ requirements-file override. Rebuild user config before every launch/resume to
332
+ discard persisted hook trust, while
333
+ retaining session history. Reject the hook-trust bypass flag.
334
+ Upgrading: no manual action or run-record migration is needed; existing
335
+ session homes are sanitized automatically on their next launch. The policy
336
+ ships with the kernel and needs no image rebuild or system configuration.
337
+ - Record the Codex 0.160.0 project-config finding in `SECURITY.md`: writable
338
+ sessions auto-trust project config, so repository model settings can apply;
339
+ project provider settings are filtered. The external containment boundary
340
+ remains necessary and is unchanged.
341
+ - Retain private per-invocation session evidence: delivered prompt, bounded native
342
+ log, timestamps, identifiers, usage, and SHA-256 hashes beside existing captures.
343
+ Record missing logs and truncation without failing the author. Capture Codex and
344
+ Hermes tokens and price them with `OUTERLOOP_TOKEN_PRICES`; unpriced cost is
345
+ unknown, while explicit zero prices remain zero. Status exposes known spend
346
+ and unpriced session counts. Bound native discovery by depth, entries, and
347
+ elapsed time; withhold unresolved secret prefixes at truncation boundaries.
348
+ Incomplete Codex turn usage remains unpriced, and final-message reads refuse
349
+ symlinks at every path component and apply a byte cap. Redact provisioned
350
+ credential file contents before retention, leave failed Codex invocations
351
+ unpriced, and hash Hermes's delivered resume prompt. Cost totals persist in a
352
+ kernel-written, atomically replaced index outside the workspace and session
353
+ HOME. Separate readers and restarted kernels retain totals; any uncontained
354
+ invocation marks them unverified, also shown in status.
355
+ Upgrading: legacy sidecars are not imported into cost totals; pre-index history
356
+ has unknown coverage.
357
+ Upgrading: new session sidecars and stage usage fields are additive; older
358
+ records without them remain readable, with unknown evidence coverage and no
359
+ fabricated token backfill. Numeric legacy costs retain their meaning. New
360
+ unknown costs use JSON null; older kernels that coerce parked costs with
361
+ `float()` cannot resume those records without an update. Drain parked runs
362
+ before rolling back to such a kernel.
363
+ - Add benchmark `verification: self_report` for explicitly labelled author claims,
364
+ with required candidate and baseline values at submit, scope enforcement and
365
+ improvement floors, without evaluation or panel work. Self-reported PRs never
366
+ arm automatic merging. Add contract channel switches for sibling views,
367
+ inter-agent messages, shared reports and other agents' line branches. Defaults
368
+ retain gated verification and all sharing. Document the existing explicit
369
+ backend/model panel setting for fixed judges.
370
+ - Upgrading: run records, briefs, board rows and submission/leader ledger rows
371
+ gain optional policy or provenance fields. Missing fields retain gate mode,
372
+ enabled channels and measured provenance. Default records and rendered text
373
+ retain their previous bytes; measured ledger rows omit provenance and remain
374
+ readable by older strict readers. Default startup adds no fetch. No backfill
375
+ is needed; legacy and HEAD-output fixtures cover compatibility.
376
+ Start fresh runs for channel isolation because earlier context and Git objects
377
+ cannot be removed reliably. Keep the updated kernel while self-reported claims
378
+ exist: older strict ledger readers cannot read explicit self-reported
379
+ provenance, and older kernels cannot enforce the new contract settings.
380
+
381
+
382
+ ## [0.3.0] - 2026-10-05
383
+
9
384
  ### Upgrading
10
385
 
11
386
  Operator actions (everything else needs no action; details in each entry):
@@ -226,7 +601,7 @@ Operator actions (everything else needs no action; details in each entry):
226
601
  selections without changing legacy routes. New endpoint authors save
227
602
  `model[endpoint=profile]` selectors; keep those profiles until runs finish, and finish
228
603
  endpoint runs before rolling back. Hermes source/runtime must be upgraded
229
- with the harness. See [compatibility and rollback](docs/endpoints.md#upgrade-and-rollback).
604
+ with the harness. See [compatibility and rollback](docs/endpoints.md#changing-a-profile).
230
605
 
231
606
  ### Fixed
232
607
 
@@ -385,7 +760,7 @@ tasks to finish.
385
760
  - A review panel skipped at preflight or in the follow-up now sends the author a kernel note and records the reason in the submit’s PR addendum. These publishes never arm auto-merge.
386
761
 
387
762
  - A submitted review measurement could go unreported when its push failed. The number is now posted once, as soon as it is known. Review submits push a bot commit with the report’s first line and measured number as its message.
388
- - On local compute an author-sleep wake could lose an improvement: the gate answers inline there, and the wake only knew how to end a run, so the result became an aborted ending with no PR (cluster0, three runs). Fresh and resumed climbs now share one terminal: the report, the line notebook, a PR or an ending record, and the issue note. A wake that opened its PR but died before recording it reconciles to that PR instead of opening a second, and a park's snapshot is released only once the run has left waiting.
763
+ - On local compute an author-sleep wake could lose an improvement: the gate answers inline there, and the wake only knew how to end a run, so the result became an aborted ending with no PR (local mode, three runs). Fresh and resumed climbs now share one terminal: the report, the line notebook, a PR or an ending record, and the issue note. A wake that opened its PR but died before recording it reconciles to that PR instead of opening a second, and a park's snapshot is released only once the run has left waiting.
389
764
  - A research line lost its snapshot when the author's session reset its branch to main: the seal parented on main, the push was refused, and the run left no notebook entry (#368). The kernel now records the line head itself and the line only moves forward from that record. Memory files a reset dropped from the tree come back at the seal; files the session deleted on the line stay deleted.
390
765
  - Intake dropped an issue from a private org member without a word: the App's token sees such an author as CONTRIBUTOR, and only OWNER/MEMBER/COLLABORATOR qualified. Every skipped issue is now logged with its reason, a maintainer's `outerloop:task` label vouches for an issue regardless of association, and new Apps request members read so private members read as MEMBER.
391
766
 
@@ -676,7 +1051,7 @@ removes them. The full history since the first pre-release follows.
676
1051
  - GPU BENCHMARKS: a per-benchmark contract field `gpus` (default 0) sizes
677
1052
  every dispatched job of that benchmark — gate measures and author
678
1053
  launches — with `--gpus-per-node=N` on the job (the per-job `--gpus` form
679
- is rejected by Torch's submit plugin as a "CPU job" on a GPU partition —
1054
+ is rejected by the cluster's submit plugin as a "CPU job" on a GPU partition —
680
1055
  the first fleet speedrun attempt aborted on it) and `--nv` on the jail. GPU jobs go
681
1056
  to a dedicated lane (`AUTORESEARCH_GPU_PARTITION`, optional
682
1057
  `AUTORESEARCH_GPU_ACCOUNT`); a `gpus > 0` benchmark on a deployment with no
@@ -1040,7 +1415,7 @@ removes them. The full history since the first pre-release follows.
1040
1415
  - Self-deadline: climbs arm a SIGALRM at walltime-minus-margin (default
1041
1416
  120s, floor 60s, `--deadline-margin-s`) raising into the ordinary
1042
1417
  containment — the only pre-kill warning on clusters that deliver no
1043
- signals to job processes (measured on Torch 2026-08-08). The tick passes
1418
+ signals to job processes (measured on the cluster, 2026-08-08). The tick passes
1044
1419
  each climb its own walltime via `--job-minutes`.
1045
1420
 
1046
1421
  - The advisory reviewer posts one comment PER ROUND (numbered, stamped
@@ -1055,7 +1430,7 @@ removes them. The full history since the first pre-release follows.
1055
1430
  job is terminal — Slurm truth plus grace, outage never reads as dead.
1056
1431
  Previously only crashes (Python exceptions) were contained; kills
1057
1432
  stranded the record forever. A SIGTERM handler also raises into the
1058
- ordinary containment, but measurement (Torch, 2026-08-08) showed Slurm
1433
+ ordinary containment, but measurement (on the cluster, 2026-08-08) showed Slurm
1059
1434
  delivers no signal to job processes there — on such clusters the sweep
1060
1435
  and the self-deadline (below) are the real teardown paths; the handler
1061
1436
  covers direct kills and other sites.
@@ -2034,7 +2409,7 @@ removes them. The full history since the first pre-release follows.
2034
2409
  agent-01 right after its own win).
2035
2410
  - A job the site relocated off its submitted partition counts as lost only
2036
2411
  when it is also starving: eligible (dependencies done, slot passed) and not
2037
- started past the grace window. Relocation alone is routine on Torch and
2412
+ started past the grace window. Relocation alone is routine on the cluster and
2038
2413
  cancelling a relocated job only reset its queue age.
2039
2414
  - `AUTORESEARCH_BOT_ALIASES` names the kernel's former logins, and every
2040
2415
  "is this ours" check (own issues, claims, alarms, own PRs, own comments)
@@ -2139,7 +2514,7 @@ removes them. The full history since the first pre-release follows.
2139
2514
  Also fixes the sha pin itself (here and in `scripts/install_hermes.sh`):
2140
2515
  hermes v-tags are ANNOTATED, so `ls-remote` had yielded the tag OBJECT's
2141
2516
  sha — every verify comparing `rev-parse HEAD` (a commit) against it would
2142
- have always failed, stubbing out all hermes lenses and making the Torch
2517
+ have always failed, stubbing out all hermes lenses and making the cluster
2143
2518
  installer refuse. Pins are now the dereferenced `^{}` commit sha, and the
2144
2519
  installer's three paths (fresh / idempotent / tamper re-pin) were executed
2145
2520
  live against the real repo (a 222 MB clone — the cache earns its keep).
@@ -2151,7 +2526,7 @@ removes them. The full history since the first pre-release follows.
2151
2526
  that finished in minutes. The park-time afterany wake job (zero-latency
2152
2527
  primary) remains planned; the sweep stays the backup.
2153
2528
  - A genuine API refusal the Claude CLI reports as a `subtype: "success"` error
2154
- is no longer misclassified as a `session-error`. Surfaced on Torch: a session
2529
+ is no longer misclassified as a `session-error`. Surfaced on the cluster: a session
2155
2530
  hit the author key's workspace usage cap and came back `is_error` with a
2156
2531
  content-free `subtype: "success"` and the real cause only in
2157
2532
  `result="API Error: 400 ... usage limits"`. The parse stamped `"success"` into
@@ -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.3.0rc2
17
- date-released: "2026-10-04"
16
+ version: 0.4.0
17
+ date-released: "2026-10-20"
@@ -18,7 +18,7 @@ uv run pre-commit run --all-files
18
18
 
19
19
  - **The bot never merges and is never a code owner** — do not weaken this in any
20
20
  code or config change.
21
- - **autoresearch is never a target of itself**; the contract file, roadmap, and
21
+ - **outerloop is never a target of itself**; the contract file, roadmap, and
22
22
  `.github/` are forbidden write paths everywhere, regardless of contract YAML.
23
23
  - Budget caps are load-bearing safety features, not tunables to raise casually.
24
24
  - Never commit credentials, transcripts, or run artifacts (SECURITY.md).
@@ -29,7 +29,7 @@ uv run pre-commit run --all-files
29
29
  need.
30
30
  - Merge commits only; never rebase, squash, or force-push.
31
31
  - **Review until quiet**: development PRs iterate advisory-review rounds
32
- (after a fix commit, remove then re-add the `autoresearch:review` label
32
+ (after a fix commit, remove then re-add the `outerloop:review` label
33
33
  once the push settles; the authorizing round must be the most recent,
34
34
  run against the head commit). Termination is judged, not literal: code
35
35
  PRs stop when a round yields no new medium+/behavior-affecting findings;
@@ -37,7 +37,7 @@ uv run pre-commit run --all-files
37
37
  then escalate to the PI instead of cycling. Merge only on an explicit
38
38
  `ci` success AND that quiet round. Read every review before merging —
39
39
  green is not read.
40
- - Imports are absolute (`from autoresearch...`); deps go in with their code +
40
+ - Imports are absolute (`from outerloop...`); deps go in with their code +
41
41
  `uv lock`; CHANGELOG under `[Unreleased]`.
42
42
  - A PR that changes state read across kernel versions (run records, PR
43
43
  branches, ledger files, inbox messages, caches) carries a compatibility