Second instance on one account: settings-file selector and per-instance job names - #443
Merged
Merged
Conversation
…ob names keyed on the settings file Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
There was a problem hiding this comment.
Round 1 — reviewed head 3eadea8e — reviewer summarizer:hermes/gpt-5.6-terra over coverage+credentials+deployment+general+lifecycle+prose.
terra
Advisory findings from outerloop — the code owner decides. Reply to disagree; the outerloop:no-review label opts this PR out.
Verdict: 1 blocking, 1 advisory.
1 finding attached to the lines below.
Advisory (non-blocking):
- Queue status hides scheduler jobs for selected settings files. [lifecycle] Instance jobs are now named outerloop-resident-<suffix> and outerloop-tick-<suffix>, but this matcher accepts only the unsuffixed names, so a selected instance’s own resident and tick jobs are omitted from its queue view. (
src/outerloop/climbboard.py:893; high confidence)
Merged two findings. Rejected as duplicates: the coverage and general whitespace-selector reports make the same scripts/tick_deploy.sh:17 claim as credentials and are merged under [coverage+credentials+general]; deployment and prose supplied no findings.
…ws a second instance's own jobs Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Lets an operator run a second, fully separate Outerloop instance on the same cluster account, for example a sandbox target with different role settings, next to a production fleet.
What changes
OUTERLOOP_ENV_FILE(process environment only): an absolute path to the operator settings file. Default unchanged (~/.config/outerloop/.env); same trust rules. Used by start, init, status, harness commands, the deploy step and the resident loop, and carried through the chain's resubmits. An empty value means the default.outerloop-residentandouterloop-tick, whatever the root; any other settings file gets a stable 12-hex suffix on both. Start, stop, status, self-heal, the chain script and printed hints all use the instance's names, so two instances never see or cancel each other's jobs. Tick lease and heartbeat are per state root.Compatibility (RELEASING.md)
Legacy default settings, including settings files with no
OUTERLOOP_ROOTline (the root passed at start and carried in the job environment), keepouterloop-residentandouterloop-tick; no migration or operator action, and the first upgraded tick keeps recognizing the running chain. Persisted state formats are unchanged, including in-flight runs and PRs. Rolling back the default fleet is safe; stop additional instances before rolling back to a version without instance isolation.Tests
The production case above (no root in the settings file, non-default root) keeps both names, mutation-checked; a selected settings file gets stable suffixed names; a path resolving to the default file is the default instance; an empty selector is the default; the selector survives both resubmit paths; stop/status/self-heal only touch their own instance; lease and heartbeat per root. Gate: 2635 passed, 6 skipped; ruff, format, mypy clean.
Built by codex from my brief; my cross-review caught that identity must not be inferred from the state root (a live deployment's settings file does not name it) and the empty-selector edge.
🤖 Generated with Claude Code