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