outerloop-science 0.2.0rc4__tar.gz → 0.2.1__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 (202) hide show
  1. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/CHANGELOG.md +59 -1
  2. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/CITATION.cff +2 -2
  3. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/CLAUDE.md +4 -0
  4. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/PKG-INFO +1 -1
  5. outerloop_science-0.2.1/RELEASING.md +69 -0
  6. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/docs/design/architecture.md +15 -1
  7. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/docs/design/meta.md +5 -2
  8. outerloop_science-0.2.1/docs/design/multi-cluster.md +464 -0
  9. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/docs/design/roles.md +8 -6
  10. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/docs/design/scaling.md +5 -4
  11. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/docs/install.md +35 -6
  12. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/docs/roadmap.md +5 -0
  13. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/scripts/tick_deploy.sh +3 -3
  14. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/scripts/tick_resident.sh +58 -27
  15. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/src/outerloop/__init__.py +1 -1
  16. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/src/outerloop/attempt.py +573 -259
  17. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/src/outerloop/brief.py +13 -6
  18. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/src/outerloop/cli.py +89 -3
  19. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/src/outerloop/climbboard.py +6 -5
  20. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/src/outerloop/contract.py +4 -6
  21. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/src/outerloop/github.py +96 -1
  22. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/src/outerloop/harness.py +27 -1
  23. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/src/outerloop/inbox.py +135 -12
  24. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/src/outerloop/init.py +154 -12
  25. outerloop_science-0.2.1/src/outerloop/ledger_branch.py +149 -0
  26. outerloop_science-0.2.1/src/outerloop/ledger_events.py +223 -0
  27. outerloop_science-0.2.1/src/outerloop/ledger_migrate.py +119 -0
  28. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/src/outerloop/orchestrator.py +142 -29
  29. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/src/outerloop/panel.py +35 -3
  30. outerloop_science-0.2.1/src/outerloop/progress.py +317 -0
  31. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/src/outerloop/review_agent_cli.py +14 -10
  32. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/src/outerloop/role_runner.py +2 -1
  33. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/src/outerloop/runstate.py +24 -2
  34. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/src/outerloop/steward.py +60 -66
  35. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/src/outerloop/syscall.py +16 -1
  36. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/src/outerloop/syscall_cli.py +16 -1
  37. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/src/outerloop/tick.py +165 -23
  38. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/src/outerloop/verify_agent_cli.py +12 -6
  39. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/tests/conftest.py +8 -0
  40. outerloop_science-0.2.1/tests/fixtures/base_moved_cc4e5d7.json +33 -0
  41. outerloop_science-0.2.1/tests/fixtures/panel_wake_9ca3d7c.json +25 -0
  42. outerloop_science-0.2.1/tests/ledger_fake.py +90 -0
  43. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/tests/test_app_permissions.py +1 -0
  44. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/tests/test_attempt.py +996 -89
  45. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/tests/test_attempt_review.py +667 -75
  46. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/tests/test_climbboard.py +13 -2
  47. outerloop_science-0.2.1/tests/test_default_claude_model.py +577 -0
  48. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/tests/test_github.py +362 -0
  49. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/tests/test_harness.py +39 -1
  50. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/tests/test_inbox.py +311 -8
  51. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/tests/test_init.py +182 -0
  52. outerloop_science-0.2.1/tests/test_ledger_events.py +650 -0
  53. outerloop_science-0.2.1/tests/test_ledger_migrate.py +139 -0
  54. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/tests/test_messages.py +27 -1
  55. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/tests/test_orchestrator.py +256 -25
  56. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/tests/test_panel.py +39 -0
  57. outerloop_science-0.2.1/tests/test_progress.py +186 -0
  58. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/tests/test_review_agent.py +1 -1
  59. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/tests/test_start.py +81 -0
  60. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/tests/test_steward.py +33 -32
  61. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/tests/test_syscall.py +34 -0
  62. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/tests/test_syscall_cli.py +39 -0
  63. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/tests/test_tick.py +121 -19
  64. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/tests/test_tick_resident.py +112 -2
  65. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/tests/test_version.py +5 -0
  66. outerloop_science-0.2.0rc4/RELEASING.md +0 -38
  67. outerloop_science-0.2.0rc4/src/outerloop/progress.py +0 -170
  68. outerloop_science-0.2.0rc4/tests/test_progress.py +0 -55
  69. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/.gitignore +0 -0
  70. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/.pre-commit-config.yaml +0 -0
  71. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/.python-version +0 -0
  72. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/CONTRIBUTING.md +0 -0
  73. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/LICENSE +0 -0
  74. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/NOTICE +0 -0
  75. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/README.md +0 -0
  76. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/SECURITY.md +0 -0
  77. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/containers/README.md +0 -0
  78. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/containers/agent-py312.def +0 -0
  79. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/docs/assets/icon-dark.svg +0 -0
  80. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/docs/assets/icon-light.svg +0 -0
  81. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/docs/assets/icon.svg +0 -0
  82. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/docs/community.md +0 -0
  83. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/docs/compute.md +0 -0
  84. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/docs/contract.md +0 -0
  85. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/docs/design/agent-protocols.md +0 -0
  86. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/docs/design/agent-substrate.md +0 -0
  87. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/docs/design/base-reintegration.md +0 -0
  88. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/docs/design/consolidation.md +0 -0
  89. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/docs/design/dispatcher.md +0 -0
  90. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/docs/design/eval-cache.md +0 -0
  91. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/docs/design/external.md +0 -0
  92. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/docs/design/github-app-auth.md +0 -0
  93. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/docs/design/headline.md +0 -0
  94. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/docs/design/judge-placement.md +0 -0
  95. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/docs/design/lifecycle.md +0 -0
  96. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/docs/design/onboarding.md +0 -0
  97. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/docs/design/orchestrator-verify.md +0 -0
  98. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/docs/design/public-surface.md +0 -0
  99. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/docs/design/research-lines.md +0 -0
  100. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/docs/design/research-loop-buildout.md +0 -0
  101. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/docs/design/research-loop.md +0 -0
  102. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/docs/design/resident-tick.md +0 -0
  103. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/docs/design/review-placement.md +0 -0
  104. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/docs/design/reviewer-infra.md +0 -0
  105. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/docs/design/role-cli.md +0 -0
  106. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/docs/design/session-watcher.md +0 -0
  107. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/docs/reviewer.md +0 -0
  108. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/docs/validation/author-syscalls.md +0 -0
  109. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/examples/review.yml +0 -0
  110. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/pyproject.toml +0 -0
  111. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/scripts/README.md +0 -0
  112. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/scripts/install_claude.sh +0 -0
  113. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/scripts/install_codex.sh +0 -0
  114. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/scripts/install_hermes.sh +0 -0
  115. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/scripts/requeue_moved_successors.sh +0 -0
  116. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/scripts/setup_branch_protection.sh +0 -0
  117. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/scripts/sweep_git_locks.sh +0 -0
  118. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/scripts/tick_chain.sbatch +0 -0
  119. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/src/outerloop/__main__.py +0 -0
  120. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/src/outerloop/appauth.py +0 -0
  121. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/src/outerloop/appmanifest.py +0 -0
  122. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/src/outerloop/compute.py +0 -0
  123. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/src/outerloop/contract_cli.py +0 -0
  124. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/src/outerloop/disk.py +0 -0
  125. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/src/outerloop/dispatch.py +0 -0
  126. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/src/outerloop/evalcache.py +0 -0
  127. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/src/outerloop/housekeeping.py +0 -0
  128. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/src/outerloop/hypothesis.py +0 -0
  129. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/src/outerloop/image.py +0 -0
  130. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/src/outerloop/intake.py +0 -0
  131. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/src/outerloop/launchlog.py +0 -0
  132. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/src/outerloop/limits.py +0 -0
  133. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/src/outerloop/maintain.py +0 -0
  134. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/src/outerloop/maintain_agent_cli.py +0 -0
  135. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/src/outerloop/maintain_post_cli.py +0 -0
  136. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/src/outerloop/markers.py +0 -0
  137. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/src/outerloop/measure.py +0 -0
  138. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/src/outerloop/paths.py +0 -0
  139. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/src/outerloop/posting.py +0 -0
  140. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/src/outerloop/py.typed +0 -0
  141. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/src/outerloop/review.py +0 -0
  142. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/src/outerloop/review_agent.py +0 -0
  143. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/src/outerloop/review_post_cli.py +0 -0
  144. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/src/outerloop/review_summarize_cli.py +0 -0
  145. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/src/outerloop/roles.py +0 -0
  146. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/src/outerloop/rolespec.py +0 -0
  147. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/src/outerloop/style.py +0 -0
  148. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/src/outerloop/verifier.py +0 -0
  149. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/src/outerloop/verify_agent.py +0 -0
  150. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/src/outerloop/verify_post_cli.py +0 -0
  151. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/src/outerloop/watcher.py +0 -0
  152. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/tests/fakes.py +0 -0
  153. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/tests/helpers.py +0 -0
  154. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/tests/test_appauth.py +0 -0
  155. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/tests/test_appmanifest.py +0 -0
  156. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/tests/test_bot_aliases.py +0 -0
  157. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/tests/test_bot_login.py +0 -0
  158. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/tests/test_brief.py +0 -0
  159. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/tests/test_channel_dir.py +0 -0
  160. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/tests/test_codex_harness.py +0 -0
  161. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/tests/test_compute.py +0 -0
  162. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/tests/test_contract.py +0 -0
  163. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/tests/test_contract_cli.py +0 -0
  164. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/tests/test_contract_names.py +0 -0
  165. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/tests/test_disk.py +0 -0
  166. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/tests/test_dispatch.py +0 -0
  167. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/tests/test_evalcache.py +0 -0
  168. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/tests/test_hardening.py +0 -0
  169. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/tests/test_hermes_harness.py +0 -0
  170. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/tests/test_housekeeping.py +0 -0
  171. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/tests/test_image.py +0 -0
  172. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/tests/test_import.py +0 -0
  173. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/tests/test_install_harness.py +0 -0
  174. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/tests/test_intake.py +0 -0
  175. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/tests/test_launchlog.py +0 -0
  176. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/tests/test_lifecycle_cli.py +0 -0
  177. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/tests/test_limits.py +0 -0
  178. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/tests/test_local_compute.py +0 -0
  179. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/tests/test_maintain.py +0 -0
  180. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/tests/test_markers.py +0 -0
  181. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/tests/test_measure.py +0 -0
  182. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/tests/test_measure_and_decide.py +0 -0
  183. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/tests/test_packaging.py +0 -0
  184. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/tests/test_paths.py +0 -0
  185. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/tests/test_posting.py +0 -0
  186. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/tests/test_requeue_moved_successors.py +0 -0
  187. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/tests/test_review.py +0 -0
  188. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/tests/test_review_agent_cli.py +0 -0
  189. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/tests/test_review_hardening.py +0 -0
  190. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/tests/test_review_policy.py +0 -0
  191. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/tests/test_review_summarize.py +0 -0
  192. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/tests/test_role_runner.py +0 -0
  193. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/tests/test_rolespec.py +0 -0
  194. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/tests/test_runstate.py +0 -0
  195. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/tests/test_sweep_git_locks.py +0 -0
  196. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/tests/test_tick_chain_successors.py +0 -0
  197. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/tests/test_tiers.py +0 -0
  198. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/tests/test_verifier.py +0 -0
  199. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/tests/test_verify_agent.py +0 -0
  200. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/tests/test_verify_agent_cli.py +0 -0
  201. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/tests/test_watcher.py +0 -0
  202. {outerloop_science-0.2.0rc4 → outerloop_science-0.2.1}/uv.lock +0 -0
@@ -6,6 +6,62 @@ Versions follow [SemVer](https://semver.org).
6
6
 
7
7
  ## [Unreleased]
8
8
 
9
+ ## [0.2.1] - 2026-09-25
10
+
11
+ ### Upgrading
12
+
13
+ - No action needed; an author's report-only answer to the panel now updates the PR, and a PR whose panel clears is marked ready for review.
14
+ - No action needed; a PR held only by a base-moved blessing heals on the next tick.
15
+ - No contract change; existing contract files need no edits.
16
+ - The `research-log` ledger branch is created from the default branch on first publish if it is missing.
17
+ - An existing `research-log` branch may carry a stale copy of main's ledger, so check `BENCHMARKS.md` there. If it is missing, run `outerloop migrate-ledger --target OWNER/REPO --main-sha <current main sha> --dry-run`, then repeat without `--dry-run`. If it is stale, add `--force` to both runs; it replaces the whole table and erases confirmed rows, so look at the existing table first.
18
+ - Let open agent PRs finish before upgrading: PRs published by 0.2.0 carry a ledger commit and have no pending record, so their merge is not recorded on `research-log`.
19
+ - No action is needed for authors parked under the old base-moved wording; they receive the corrected fold message once when the kernel next detects that their branch lacks the current base tip.
20
+ - No action is needed for saved gate results without a base commit; they are ignored and the candidate must be measured again.
21
+ - Parked runs keep their recorded author backend and model; resumed panels now inherit from that author. Set an explicit model for any panel lens using another backend.
22
+ - Set `OUTERLOOP_CLAUDE_MODEL=<model>` in `.env` if any Claude role lacks an explicit or inherited model, including the steward when its key is configured.
23
+ - Restart local loops after installing; they do not auto-update or reload `.env`.
24
+ - No action is needed for inbox messages already delivered: kernel messages written before this version stay readable, and any output they quote stays fenced as data.
25
+ - No action is needed for `end` requests already staged: old requests stay valid, and a saved withdrawal is finished by the next tick.
26
+
27
+ ### Fixed
28
+
29
+ - Report-only submissions update the PR report and panel verdict without pushing a commit.
30
+ - Draft PRs are marked ready for review when the latest panel read clears. Blocking draft banners tell the author to address the findings.
31
+ - Research line improvements can be blessed when their measured base contains the current base tip.
32
+ - Messages the kernel writes itself now render as its instructions; output the kernel quotes from elsewhere stays fenced as data.
33
+ - Authors are now told they may fold a moved base with one merge commit, including resolving conflicts within that merge.
34
+ - A submit made after the base moves is saved before any gate measurement or staged experiments run. The author is told to fold the base and submit again, or to submit again after the measurement base is refreshed.
35
+ - After folding the base, an author is told to submit directly and repeat its experiment only if the new base changes its hypothesis. PR updates and saved snapshots retain the measured base in their history, and a saved gate result is reused only for the same base and code.
36
+ - Updates brought in from the base no longer count as the author's changes when checking a resumed PR's allowed files. Authors receive a reason when an attempt ends but its open PR leaves the run parked for further work.
37
+ - Authors are woken and automatic merging is held when their PR branch does not contain the current base tip, including when conflicts block merging.
38
+ - Resident tick jobs replace vanished or finished successors and check the successor before handing over. If recovery fails, the current job keeps ticking through the reserved handover time until its time limit.
39
+
40
+ ### Added
41
+
42
+ - Authors can withdraw a superseded open PR with `end --withdraw "<reason>"`; the kernel closes it with the reason and ends the run.
43
+ - `outerloop migrate-ledger --target OWNER/REPO --main-sha SHA [--dry-run] [--force]` imports the ledger from the specified current main commit into `research-log`.
44
+ - Full `outerloop init` requires and writes a Claude model even for a deployment without Claude roles, using `--claude-model`, then the shell's `OUTERLOOP_CLAUDE_MODEL`, then a required interactive prompt. A focused `init --github-app` run preserves existing `.env` settings it does not manage.
45
+
46
+ ### Changed
47
+
48
+ - The sweep rechecks ancestry for PRs held only by a base-moved blessing.
49
+ - Merges performed by the sweep are observed and confirmed in the same tick.
50
+ - Scope checks compare the full candidate tree with its merge-base against the fetched base tip; changes that landed on the base branch never count as the author's, and author edits to the ledger files are refused like any other out-of-scope path.
51
+ - Publish is refused when the candidate shares no history with the base; fetch the base and fold it before submitting again.
52
+ - The leaderboard moves from PR branches and main to the `research-log` branch.
53
+ - Results are pending when published and confirmed when the kernel observes their PR merge, provided the final PR head and merged files match the measurement.
54
+ - The leaderboard shows the main commit at which each result was confirmed; imported rows say their provenance is unknown.
55
+ - PRs carry only the measured files; publication no longer adds a ledger commit.
56
+ - **Breaking:** The built-in Claude model default is gone; set `OUTERLOOP_CLAUDE_MODEL=<model>` in `.env` when a Claude role lacks an explicit or inherited model, including the steward when its key is configured. `outerloop start` refuses a missing Claude setting only in that case, so a deployment with no Claude roles can leave it unset.
57
+ - **Breaking:** Panel lenses without a backend now use the author's backend, and lenses without a model inherit the author's model on that backend. Lenses using another backend require an explicit model, even if `OUTERLOOP_CLAUDE_MODEL` is set.
58
+ - **Breaking:** The review and verify Actions use their model input or fall back to the `OUTERLOOP_CLAUDE_MODEL` Actions variable for Claude. With neither configured, the verifier logs a warning and skips verification with a successful exit.
59
+ - Start, tick checks and running panels now resolve panel models using the same rules. Resumed panels use the parked run's recorded author backend and model.
60
+
61
+ ## [0.2.0] - 2026-09-18
62
+
63
+ **Upgrade note.** After upgrading run `outerloop permissions --open`: the App needs `checks: read` and `actions: read` for check results to reach authors as messages. This release redesigns the run lifecycle. It adds three run states, one inbox, `end`, review top-ups, and wakes that run by default. It also removes the old `AUTORESEARCH_*` names.
64
+
9
65
  Authors now use `message` for public posts, reminders to self and messages to
10
66
  live agents on the same target. Sibling messages keep a sent copy, and inbox
11
67
  headers name both parties with local message numbers. `--reply-to` links a
@@ -22,6 +78,8 @@ tasks to finish.
22
78
 
23
79
  ### Added
24
80
 
81
+ - `OUTERLOOP_CLAUDE_MODEL` configures the shared default for all Claude roles, including deployments whose Vertex project has access to a different model. `OUTERLOOP_AUTHOR_MODEL` still overrides the author default. Vertex auxiliary fast calls default to the session model, avoiding dependencies on models the project has not enabled; `OUTERLOOP_VERTEX_SMALL_MODEL` overrides that default.
82
+
25
83
  - `outerloop init` installs a missing author CLI and records its path; `--no-install-harness` opts out. Claude has a pinned, SHA256-verified installer.
26
84
 
27
85
  - `OUTERLOOP_TICK_HOST=login` (or `--tick-host login`) runs a niced foreground tick loop against Slurm, with one tick lease per state root.
@@ -79,7 +137,7 @@ tasks to finish.
79
137
 
80
138
  - Submit works in review and fast-forwards the PR after a confirmed auto-merge disarm; the measured number is posted first, even if publication is refused. Each review leg measures against its freshly fetched base. Verdicts, findings and publish refusals reach the author as messages. A reply staged during a review leg suppresses its final-text comment. A failed submitted park ends as negative-result only when no author session can resume to receive its verdict; its report and notebook are saved and its issue claim released. Sessions without the tool (no launcher or no resume support) are still measured at finish and may end on the verdict by design. Submit needs no prior launch or report. A session offered submit that stops without it ends unmeasured, or returns to review if it has a PR. Legacy follow-up re-measures retire on their next wake and release their snapshots.
81
139
 
82
- - Authors can post replies through `reply` and launch experiments or sleep while a PR is in review, using the run’s remaining budget. Comments and base moves received while parked reach the author at its next wake. Replies are kept in an outbox for retries, review launches check committed edits, and closing a run holds its wake lease. Review edits are measured and published only on submit, using the same remaining GPU budget as other author work.
140
+ - Authors can post replies through `message` and launch experiments or sleep while a PR is in review, using the run’s remaining budget. Comments and base moves received while parked reach the author at its next wake. Replies are kept in an outbox for retries, review launches check committed edits, and closing a run holds its wake lease. Review edits are measured and published only on submit, using the same remaining GPU budget as other author work.
83
141
 
84
142
  - Wake messages now use one inbox and one renderer. Launch results, gate verdicts, panel findings, review comments and base moves reach the session in the same fenced format, from files kept beside the run's record. Advisory panel findings now reach the author alongside blocking ones. The sibling view is refreshed at every wake of a parked author session. The kernel's wake text states facts; the research advice it used to carry is gone.
85
143
 
@@ -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.0rc4
17
- date-released: "2026-09-15"
16
+ version: 0.2.1
17
+ date-released: "2026-09-25"
@@ -34,3 +34,7 @@ uv run pre-commit run --all-files
34
34
  green is not read.
35
35
  - Imports are absolute (`from autoresearch...`); deps go in with their code +
36
36
  `uv lock`; CHANGELOG under `[Unreleased]`.
37
+ - A PR that changes state read across kernel versions (run records, PR
38
+ branches, ledger files, inbox messages, caches) carries a compatibility
39
+ statement, a legacy fixture, a backfill or tolerance, and an `Upgrading:`
40
+ changelog line (RELEASING.md).
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: outerloop-science
3
- Version: 0.2.0rc4
3
+ Version: 0.2.1
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
@@ -0,0 +1,69 @@
1
+ # Releasing
2
+
3
+ ## Versioning
4
+
5
+ - SemVer 0.x; single source `src/outerloop/__init__.py`; tags `vX.Y.Z`;
6
+ Keep-a-Changelog. Pre-releases use PEP 440 suffixes (`0.1.0.dev0`,
7
+ `0.1.0rc1`) and are tagged the same way (`v0.1.0.dev0`).
8
+
9
+ ## State that outlives a release
10
+
11
+ Some state is written by one kernel version and read by the next: run
12
+ records and their stage keys, PR branches and the publish journal, snapshot
13
+ and line refs, the research-log ledger and its retry intents, inbox messages
14
+ and their deduplication keys, syscall staging files, measurement caches, the
15
+ launch journal, PR-body and comment markers. A PR that changes how any of
16
+ these is written or read includes four things:
17
+
18
+ 1. A compatibility statement in the PR body: which surfaces change, the
19
+ oldest state still read, what happens to runs and PRs in flight on the
20
+ first tick after the upgrade, and whether rolling back is safe.
21
+ 2. A fixture for each surface the PR changes (a run record, an inbox, a
22
+ branch layout), produced by every release whose state the new code still
23
+ reads, exercised through the new code: first pass, a second idempotent
24
+ pass, and a retry after an interruption.
25
+ 3. A backfill or an explicit tolerance for the old state, including missing
26
+ fields and ended runs. If a case is not supported, the PR says so instead
27
+ of leaving it to the operator to discover.
28
+ 4. One `Upgrading:` line in the changelog: "no action needed; the first tick
29
+ does X", or the exact operator command. Automatic migration is claimed
30
+ only when the fixture proves it.
31
+
32
+ Text an agent has already received is state too. Changing a message's
33
+ wording does not reach a parked run unless its deduplication key changes.
34
+
35
+ ## Cutting a release
36
+
37
+ 1. List the merged PRs since the last tag that touch the state above and
38
+ check each has the four items. Collect their `Upgrading:` lines into one
39
+ section at the top of the release's changelog entry.
40
+ 2. PR: bump `__version__`, set `CITATION.cff`'s `version` and `date-released`,
41
+ and move the `[Unreleased]` entries under the new version. Before tagging,
42
+ run the fixtures from step 1 once more against this PR's head, covering a
43
+ run with an open PR, a run whose PR merged, and an ended run. A dev or rc pre-release still bumps the version (PyPI never
44
+ accepts a version twice, so the next one is `.dev1`, `rc2`, ...) but leaves
45
+ `[Unreleased]` in place until the final release.
46
+ 3. `git tag vX.Y.Z && git push origin vX.Y.Z`. The `release` workflow builds
47
+ and publishes `outerloop-science` to PyPI through Trusted Publishing; the
48
+ one-time PyPI setup is described at the top of
49
+ `.github/workflows/release.yml`.
50
+ 4. Once the `release` workflow run for the tag is green (`gh run watch` on
51
+ it), `pip install outerloop-science==X.Y.Z` in a fresh venv, then
52
+ `outerloop --help`. This comes before the GitHub release: publishing it is
53
+ what Discord announces, so nothing is announced that did not install.
54
+ 5. `gh release create vX.Y.Z --generate-notes`, with `--prerelease` for a dev
55
+ or rc tag.
56
+ 6. Announce. Discord's `#announcements` gets the release from the GitHub
57
+ webhook on its own (docs/community.md). For a final release, also write
58
+ the post for X (`@outerloop_sci`) and Bluesky (`@outerloop.science`): one
59
+ or two sentences on what changed for the reader, the install line, the
60
+ link to the release. Dev and rc pre-releases are not posted to X or
61
+ Bluesky; Discord gets them through the webhook like any release.
62
+
63
+ ## Public repo
64
+
65
+ Public since 2026-09-05. Secret scanning and push protection are on, and
66
+ `main` is protected by `scripts/setup_branch_protection.sh` (pull request
67
+ required, the `ci` check, conversations resolved, no force-push, admins
68
+ included). History is immutable now; prevention (gitleaks in pre-commit and
69
+ CI, push protection) is the real defense. `CITATION.cff` is still owed.
@@ -110,6 +110,10 @@ target's artifact structure, declared in the contract:
110
110
  contracts may declare suite aggregates (e.g. mean success rate) and
111
111
  no-regression floors.
112
112
 
113
+ Scope checks compare the full candidate tree with its merge-base against the fetched
114
+ base tip, so changes made only on the base branch do not count as author edits.
115
+ Missing shared history refuses publication; the separate base-tip ancestry check still applies.
116
+
113
117
  What stays absolute regardless of scope: one hypothesis per PR (attributable
114
118
  diffs), full-scope reporting, and **cross-target separation** — separate clones,
115
119
  branches, budgets, and report streams per target (`runs/<target>/`,
@@ -289,7 +293,17 @@ grep + recency + distillation until that provably fails.
289
293
  | `compute` | sbatch/squeue submit-and-poll behind one interface |
290
294
  | `github` | Bot auth and push (orchestrator-side, after sessions end), PR/issue ops |
291
295
  | `limits` | Effective session and job limits — turns, session and job minutes — with each contract wish clamped into our `[floor, ceiling]`; the tick's `OUTERLOOP_MAX_JOB_MINUTES` floors here |
292
- | `progress` / `climbboard` | `progress` writes the human-readable benchmark-progress files into the target repo on each improvement PR; `climbboard` publishes the climb board — every ended attempt and its outcome, plus the ledger and views — to the target's `research-log` branch whenever runs end |
296
+ | `progress` / `climbboard` | `progress` records pending measurements at publish and confirms them when the kernel observes the merge, writing `results/leader.json` and `BENCHMARKS.md` on `research-log`; PRs carry only the measured tree; `climbboard` publishes the climb board — every ended attempt and its outcome, plus the ledger and views — to the target's `research-log` branch whenever runs end |
297
+
298
+ The ledger's main-commit column links confirmed merges. Imported rows say
299
+ "provenance unknown"; an import SHA identifies only the source snapshot.
300
+
301
+ Operators seed an existing target with
302
+ `outerloop migrate-ledger --target OWNER/REPO --main-sha FULL_SHA`.
303
+ The SHA must be the current default-branch tip. The command imports the exact
304
+ ledger file at that SHA, preserving numbers and seeds without claiming a
305
+ measured SHA. `--dry-run` prints the table without writes; `--force` permits
306
+ replacing an existing branch ledger. The copies on main are no longer updated.
293
307
 
294
308
  ## Harness and context engineering
295
309
 
@@ -123,8 +123,11 @@ vetoable self-proposed plans), verifier's adversarial read, human merge.
123
123
 
124
124
  ## Progress webpage
125
125
 
126
- Everything is already in git: `results/leader.json` history, run reports,
127
- plan issues, BENCHMARKS.md. A static generator renders charts (leader
126
+ The generator reads `results/leader.json` history, run reports, and
127
+ `BENCHMARKS.md` from `research-log`, plus plan issues. Results are pending at
128
+ publish and confirmed when the kernel observes the merge. The main-commit
129
+ column identifies confirmed results; imported rows say "provenance unknown".
130
+ PRs carry only the measured tree. A static generator renders charts (leader
128
131
  trajectories per benchmark), run timelines, and report indexes — GitHub
129
132
  Pages on public repos, a private artifact before that. No server, no new
130
133
  state, no new trust surface (the generator reads git, writes HTML).