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.
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/.gitignore +7 -0
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/.pre-commit-config.yaml +3 -0
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/CHANGELOG.md +383 -8
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/CITATION.cff +2 -2
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/CLAUDE.md +3 -3
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/PKG-INFO +67 -67
- outerloop_science-0.4.0/README.md +133 -0
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/RELEASING.md +4 -0
- outerloop_science-0.4.0/SECURITY.md +98 -0
- outerloop_science-0.4.0/docs/assets/outerloop-apple-touch-icon.png +0 -0
- outerloop_science-0.4.0/docs/assets/outerloop-favicon.png +0 -0
- outerloop_science-0.4.0/docs/assets/outerloop-favicon.svg +11 -0
- outerloop_science-0.4.0/docs/community.md +48 -0
- outerloop_science-0.4.0/docs/concurrency.md +45 -0
- outerloop_science-0.4.0/docs/contract.md +200 -0
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/docs/design/accelerators.md +10 -7
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/docs/design/agent-environment.md +40 -3
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/docs/design/agent-protocols.md +1 -1
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/docs/design/agent-substrate.md +2 -2
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/docs/design/architecture.md +48 -34
- outerloop_science-0.4.0/docs/design/compute-cloud.md +204 -0
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/docs/design/dispatcher.md +23 -20
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/docs/design/eval-cache.md +2 -2
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/docs/design/external.md +2 -2
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/docs/design/headline.md +4 -4
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/docs/design/lifecycle.md +12 -11
- outerloop_science-0.4.0/docs/design/model-gateway.md +154 -0
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/docs/design/multi-cluster.md +95 -94
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/docs/design/orchestrator-verify.md +13 -7
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/docs/design/research-lines.md +7 -6
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/docs/design/research-loop-buildout.md +2 -2
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/docs/design/resident-tick.md +33 -44
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/docs/design/review-placement.md +10 -9
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/docs/design/reviewer-infra.md +4 -4
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/docs/design/role-cli.md +5 -3
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/docs/design/scaling.md +3 -3
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/docs/design/session-watcher.md +8 -8
- outerloop_science-0.4.0/docs/endpoints.md +141 -0
- outerloop_science-0.4.0/docs/getting-started.md +159 -0
- outerloop_science-0.4.0/docs/how-it-works.md +232 -0
- outerloop_science-0.4.0/docs/index.md +18 -0
- outerloop_science-0.4.0/docs/install.md +226 -0
- outerloop_science-0.4.0/docs/javascripts/figures.js +22 -0
- outerloop_science-0.4.0/docs/messages.md +179 -0
- outerloop_science-0.4.0/docs/operate.md +110 -0
- outerloop_science-0.4.0/docs/reference/cli.md +251 -0
- outerloop_science-0.4.0/docs/reference/contract.md +571 -0
- outerloop_science-0.4.0/docs/reference/environment.md +646 -0
- outerloop_science-0.4.0/docs/reference/inbox.md +122 -0
- outerloop_science-0.4.0/docs/reference/syscalls.md +210 -0
- outerloop_science-0.4.0/docs/reviewer.md +188 -0
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/docs/roadmap.md +17 -9
- outerloop_science-0.4.0/docs/session-capture.md +82 -0
- outerloop_science-0.4.0/docs/storage.md +214 -0
- outerloop_science-0.4.0/docs/stylesheets/figures.css +141 -0
- outerloop_science-0.4.0/docs/stylesheets/site.css +10 -0
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/docs/validation/author-syscalls.md +1 -1
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/examples/review.yml +13 -6
- outerloop_science-0.4.0/mkdocs.yml +135 -0
- outerloop_science-0.4.0/overrides/.icons/bi/circle-half.svg +3 -0
- outerloop_science-0.4.0/overrides/.icons/bi/moon.svg +3 -0
- outerloop_science-0.4.0/overrides/.icons/bi/search.svg +3 -0
- outerloop_science-0.4.0/overrides/.icons/bi/sun.svg +3 -0
- outerloop_science-0.4.0/overrides/.icons/lab/github.svg +1 -0
- outerloop_science-0.4.0/overrides/main.html +45 -0
- outerloop_science-0.4.0/overrides/partials/logo.html +6 -0
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/pyproject.toml +7 -0
- outerloop_science-0.4.0/scripts/docs/build.sh +11 -0
- outerloop_science-0.4.0/scripts/docs/hooks.py +163 -0
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/scripts/install_bridge.sh +2 -2
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/scripts/install_claude.sh +1 -1
- outerloop_science-0.4.0/scripts/install_codex.sh +103 -0
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/scripts/install_hermes.sh +4 -4
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/scripts/requeue_moved_successors.sh +2 -2
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/scripts/sweep_git_locks.sh +1 -1
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/scripts/tick_deploy.sh +6 -3
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/scripts/tick_resident.sh +1 -1
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/src/outerloop/__init__.py +1 -1
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/src/outerloop/attempt.py +466 -134
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/src/outerloop/brief.py +132 -77
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/src/outerloop/cli.py +123 -14
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/src/outerloop/climbboard.py +29 -7
- outerloop_science-0.4.0/src/outerloop/codex_requirements.toml +3 -0
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/src/outerloop/compute.py +14 -6
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/src/outerloop/contract.py +185 -20
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/src/outerloop/disk.py +1 -1
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/src/outerloop/dispatch.py +171 -12
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/src/outerloop/github.py +197 -19
- outerloop_science-0.4.0/src/outerloop/guidance_pack.py +63 -0
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/src/outerloop/harness.py +255 -76
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/src/outerloop/harness_cli.py +169 -20
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/src/outerloop/harness_pins.py +10 -0
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/src/outerloop/harnesses.toml +3 -2
- outerloop_science-0.4.0/src/outerloop/hermes_capture.py +67 -0
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/src/outerloop/housekeeping.py +1 -1
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/src/outerloop/image.py +11 -1
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/src/outerloop/inbox.py +18 -2
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/src/outerloop/ledger_branch.py +4 -2
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/src/outerloop/ledger_events.py +6 -3
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/src/outerloop/ledger_migrate.py +3 -2
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/src/outerloop/maintain.py +1 -1
- outerloop_science-0.4.0/src/outerloop/markers.py +38 -0
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/src/outerloop/measure.py +143 -42
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/src/outerloop/operator_limits.py +5 -2
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/src/outerloop/orchestrator.py +357 -65
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/src/outerloop/panel.py +12 -2
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/src/outerloop/posting.py +92 -16
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/src/outerloop/progress.py +35 -4
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/src/outerloop/review.py +31 -2
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/src/outerloop/review_agent.py +4 -2
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/src/outerloop/review_post_cli.py +15 -24
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/src/outerloop/role_runner.py +60 -0
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/src/outerloop/runstate.py +30 -6
- outerloop_science-0.4.0/src/outerloop/session_evidence.py +521 -0
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/src/outerloop/status.py +21 -1
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/src/outerloop/steward.py +30 -5
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/src/outerloop/syscall.py +82 -14
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/src/outerloop/syscall_cli.py +99 -28
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/src/outerloop/tick.py +56 -55
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/src/outerloop/verifier.py +28 -31
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/src/outerloop/verify_agent.py +46 -2
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/src/outerloop/verify_post_cli.py +12 -19
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/src/outerloop/watcher.py +8 -0
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/conftest.py +12 -0
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/fixtures/README.md +16 -0
- outerloop_science-0.4.0/tests/fixtures/default_contract_head.json +28 -0
- outerloop_science-0.4.0/tests/fixtures/dispatched_pre_gpu_identity/completed/eval-candidate-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa-f69684777d523fe6502ee4ed4d09f98410a56aec/command.txt +1 -0
- {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
- outerloop_science-0.4.0/tests/fixtures/dispatched_pre_gpu_identity/completed/eval-candidate-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa-f69684777d523fe6502ee4ed4d09f98410a56aec/submitted +1 -0
- outerloop_science-0.4.0/tests/fixtures/dispatched_pre_gpu_identity/inflight/eval-candidate-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa-f69684777d523fe6502ee4ed4d09f98410a56aec/command.txt +1 -0
- {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
- outerloop_science-0.4.0/tests/fixtures/dispatched_pre_gpu_identity/inflight/eval-candidate-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa-f69684777d523fe6502ee4ed4d09f98410a56aec/submitted +1 -0
- outerloop_science-0.4.0/tests/fixtures/pre_contract_switches.json +51 -0
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/fixtures/rc1_v021/baselines/main@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.json +1 -1
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/fixtures/rc1_v021/brief.txt +1 -1
- outerloop_science-0.4.0/tests/fixtures/rc1_v021/end-request.json +1 -0
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/fixtures/rc1_v021/ended.json +1 -1
- outerloop_science-0.4.0/tests/fixtures/rc1_v021/eval-provenance/command.txt +1 -0
- outerloop_science-0.4.0/tests/fixtures/rc1_v021/eval-run/eval-candidate-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa-f69684777d523fe6502ee4ed4d09f98410a56aec/command.txt +1 -0
- outerloop_science-0.4.0/tests/fixtures/rc1_v021/eval-run/eval-candidate-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa-f69684777d523fe6502ee4ed4d09f98410a56aec/submitted +1 -0
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/fixtures/rc1_v021/identity.json +1 -1
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/fixtures/rc1_v021/merged.json +1 -1
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/fixtures/rc1_v021/open.json +1 -1
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/fixtures/rc1_v021/pending/owner__repo.json +1 -1
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/fixtures/rc1_v021/pending/owner__repo@agent-01.json +1 -1
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/fixtures/rc1_v021/pr-states.json +1 -1
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/fixtures/rc1_v021/queue.json +1 -1
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/fixtures/rc1_v021/rebind.json +1 -1
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/fixtures/rc1_v021/sessionless.json +1 -1
- outerloop_science-0.4.0/tests/fixtures/session_cost_legacy.json +5 -0
- outerloop_science-0.4.0/tests/fixtures/suite_measurement_legacy.json +1 -0
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/test_attempt.py +704 -102
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/test_attempt_review.py +149 -164
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/test_author_overrides.py +119 -1
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/test_bot_aliases.py +1 -1
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/test_brief.py +13 -8
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/test_climbboard.py +81 -110
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/test_codex_bridge.py +3 -1
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/test_codex_harness.py +80 -3
- outerloop_science-0.4.0/tests/test_codex_hooks.py +276 -0
- outerloop_science-0.4.0/tests/test_codex_host.py +232 -0
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/test_compute.py +7 -7
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/test_contract.py +157 -16
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/test_contract_names.py +42 -3
- outerloop_science-0.4.0/tests/test_contract_switches.py +790 -0
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/test_default_claude_model.py +1 -1
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/test_dispatch.py +248 -7
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/test_endpoints.py +2 -0
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/test_github.py +16 -2
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/test_harness.py +8 -3
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/test_harness_pins.py +190 -7
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/test_hermes_harness.py +47 -2
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/test_inbox.py +125 -149
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/test_install_harness.py +8 -4
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/test_intake.py +1 -1
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/test_ledger_events.py +3 -1
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/test_markers.py +8 -8
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/test_measure.py +148 -9
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/test_measure_and_decide.py +64 -5
- outerloop_science-0.4.0/tests/test_operator_message.py +56 -0
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/test_orchestrator.py +387 -362
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/test_panel.py +11 -0
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/test_posting.py +71 -0
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/test_requeue_moved_successors.py +4 -4
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/test_review_agent.py +21 -1
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/test_role_runner.py +22 -0
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/test_runstate.py +22 -2
- outerloop_science-0.4.0/tests/test_session_evidence.py +690 -0
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/test_start.py +17 -11
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/test_status.py +12 -1
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/test_steward.py +109 -19
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/test_syscall.py +119 -192
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/test_syscall_cli.py +67 -23
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/test_tick.py +293 -190
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/test_tick_resident.py +6 -3
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/test_verifier.py +16 -9
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/test_verify_agent.py +24 -0
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/test_version.py +1 -1
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/test_watcher.py +4 -4
- outerloop_science-0.4.0/uv.lock +1471 -0
- outerloop_science-0.3.0rc2/README.md +0 -133
- outerloop_science-0.3.0rc2/SECURITY.md +0 -37
- outerloop_science-0.3.0rc2/docs/community.md +0 -54
- outerloop_science-0.3.0rc2/docs/compute.md +0 -26
- outerloop_science-0.3.0rc2/docs/contract.md +0 -40
- outerloop_science-0.3.0rc2/docs/endpoints.md +0 -252
- outerloop_science-0.3.0rc2/docs/install.md +0 -1036
- outerloop_science-0.3.0rc2/docs/reviewer.md +0 -54
- outerloop_science-0.3.0rc2/scripts/install_codex.sh +0 -104
- outerloop_science-0.3.0rc2/src/outerloop/markers.py +0 -48
- outerloop_science-0.3.0rc2/tests/fixtures/dispatched_pre_gpu_identity/completed/eval-candidate-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa-f69684777d523fe6502ee4ed4d09f98410a56aec/command.txt +0 -1
- outerloop_science-0.3.0rc2/tests/fixtures/dispatched_pre_gpu_identity/completed/eval-candidate-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa-f69684777d523fe6502ee4ed4d09f98410a56aec/submitted +0 -1
- outerloop_science-0.3.0rc2/tests/fixtures/dispatched_pre_gpu_identity/inflight/eval-candidate-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa-f69684777d523fe6502ee4ed4d09f98410a56aec/command.txt +0 -1
- outerloop_science-0.3.0rc2/tests/fixtures/dispatched_pre_gpu_identity/inflight/eval-candidate-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa-f69684777d523fe6502ee4ed4d09f98410a56aec/submitted +0 -1
- outerloop_science-0.3.0rc2/tests/fixtures/rc1_v021/end-request.json +0 -1
- outerloop_science-0.3.0rc2/tests/fixtures/rc1_v021/eval-provenance/command.txt +0 -1
- outerloop_science-0.3.0rc2/tests/fixtures/rc1_v021/eval-run/eval-candidate-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa-f69684777d523fe6502ee4ed4d09f98410a56aec/command.txt +0 -1
- outerloop_science-0.3.0rc2/tests/fixtures/rc1_v021/eval-run/eval-candidate-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa-f69684777d523fe6502ee4ed4d09f98410a56aec/submitted +0 -1
- outerloop_science-0.3.0rc2/uv.lock +0 -910
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/.python-version +0 -0
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/CONTRIBUTING.md +0 -0
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/LICENSE +0 -0
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/NOTICE +0 -0
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/containers/README.md +0 -0
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/containers/agent-py312.def +0 -0
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/docs/assets/icon-dark.svg +0 -0
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/docs/assets/icon-light.svg +0 -0
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/docs/assets/icon.svg +0 -0
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/docs/design/base-reintegration.md +0 -0
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/docs/design/consolidation.md +0 -0
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/docs/design/github-app-auth.md +0 -0
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/docs/design/judge-placement.md +0 -0
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/docs/design/meta.md +0 -0
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/docs/design/onboarding.md +0 -0
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/docs/design/public-surface.md +0 -0
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/docs/design/research-loop.md +0 -0
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/docs/design/roles.md +0 -0
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/scripts/README.md +0 -0
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/scripts/setup_branch_protection.sh +0 -0
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/scripts/tick_chain.sbatch +0 -0
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/src/outerloop/__main__.py +0 -0
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/src/outerloop/appauth.py +0 -0
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/src/outerloop/appmanifest.py +0 -0
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/src/outerloop/author_overrides.py +0 -0
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/src/outerloop/bridge_install.py +0 -0
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/src/outerloop/bridge_runtime/pyproject.toml +0 -0
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/src/outerloop/bridge_runtime/uv.lock +0 -0
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/src/outerloop/codex_bridge.py +0 -0
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/src/outerloop/contract_cli.py +0 -0
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/src/outerloop/endpoint_wait.py +0 -0
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/src/outerloop/endpoints.py +0 -0
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/src/outerloop/evalcache.py +0 -0
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/src/outerloop/gpu_lanes.py +0 -0
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/src/outerloop/hermes_install.py +0 -0
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/src/outerloop/hypothesis.py +0 -0
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/src/outerloop/init.py +0 -0
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/src/outerloop/instance.py +0 -0
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/src/outerloop/intake.py +0 -0
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/src/outerloop/job_names.py +0 -0
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/src/outerloop/launchlog.py +0 -0
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/src/outerloop/limits.py +0 -0
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/src/outerloop/maintain_agent_cli.py +0 -0
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/src/outerloop/maintain_post_cli.py +0 -0
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/src/outerloop/paths.py +0 -0
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/src/outerloop/provenance.py +0 -0
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/src/outerloop/py.typed +0 -0
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/src/outerloop/rebind.py +0 -0
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/src/outerloop/review_agent_cli.py +0 -0
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/src/outerloop/review_summarize_cli.py +0 -0
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/src/outerloop/roles.py +0 -0
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/src/outerloop/rolespec.py +0 -0
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/src/outerloop/style.py +0 -0
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/src/outerloop/verify_agent_cli.py +0 -0
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/fakes.py +0 -0
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/fixtures/author_route_legacy.json +0 -0
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/fixtures/author_route_missing_model.json +0 -0
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/fixtures/author_route_missing_route.json +0 -0
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/fixtures/base_moved_cc4e5d7.json +0 -0
- {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
- {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
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/fixtures/dispatched_pre_gpu_identity/completed/eval-candidate-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa-f69684777d523fe6502ee4ed4d09f98410a56aec/stdout +0 -0
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/fixtures/dispatched_pre_gpu_identity/identity.json +0 -0
- {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
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/fixtures/hermes_resume_legacy.json +0 -0
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/fixtures/hermes_sample_20260924.json +0 -0
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/fixtures/launches-before-provenance.jsonl +0 -0
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/fixtures/panel_wake_9ca3d7c.json +0 -0
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/fixtures/rc1_v021/eval-provenance/job.sh +0 -0
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/fixtures/rc1_v021/eval-run/eval-candidate-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa-f69684777d523fe6502ee4ed4d09f98410a56aec/exit-code +0 -0
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/fixtures/rc1_v021/eval-run/eval-candidate-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa-f69684777d523fe6502ee4ed4d09f98410a56aec/job.sh +0 -0
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/fixtures/rc1_v021/eval-run/eval-candidate-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa-f69684777d523fe6502ee4ed4d09f98410a56aec/stdout +0 -0
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/fixtures/rc1_v021/generate.py.txt +0 -0
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/fixtures/rc1_v021/launches.jsonl +0 -0
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/fixtures/rc1_v021/line.bundle +0 -0
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/helpers.py +0 -0
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/ledger_fake.py +0 -0
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/test_app_permissions.py +0 -0
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/test_appauth.py +0 -0
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/test_appmanifest.py +0 -0
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/test_bot_login.py +0 -0
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/test_channel_dir.py +0 -0
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/test_contract_cli.py +0 -0
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/test_disk.py +0 -0
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/test_endpoint_wait.py +0 -0
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/test_evalcache.py +0 -0
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/test_gpu_lanes.py +0 -0
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/test_hardening.py +0 -0
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/test_hermes_author.py +0 -0
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/test_housekeeping.py +0 -0
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/test_image.py +0 -0
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/test_import.py +0 -0
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/test_init.py +0 -0
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/test_instance.py +0 -0
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/test_launchlog.py +0 -0
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/test_ledger_migrate.py +0 -0
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/test_lifecycle_cli.py +0 -0
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/test_limits.py +0 -0
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/test_local_compute.py +0 -0
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/test_maintain.py +0 -0
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/test_messages.py +0 -0
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/test_operator_end.py +0 -0
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/test_operator_limits.py +0 -0
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/test_packaging.py +0 -0
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/test_paths.py +0 -0
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/test_progress.py +0 -0
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/test_rebind.py +0 -0
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/test_review.py +0 -0
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/test_review_agent_cli.py +0 -0
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/test_review_hardening.py +0 -0
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/test_review_policy.py +0 -0
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/test_review_summarize.py +0 -0
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/test_rolespec.py +0 -0
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/test_sweep_git_locks.py +0 -0
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/test_tick_chain_successors.py +0 -0
- {outerloop_science-0.3.0rc2 → outerloop_science-0.4.0}/tests/test_tiers.py +0 -0
- {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#
|
|
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 (
|
|
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
|
|
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
|
|
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 (
|
|
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
|
|
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
|
|
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
|
|
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
|
|
@@ -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
|
-
- **
|
|
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 `
|
|
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
|
|
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
|