diff --git a/docs/TEST_INTEGRITY.md b/docs/TEST_INTEGRITY.md index 43ab3c6..e5cc717 100644 --- a/docs/TEST_INTEGRITY.md +++ b/docs/TEST_INTEGRITY.md @@ -1,5 +1,28 @@ # Test Integrity Notes +## 2026-10-03 — Owner-configured concurrency + +```yaml +test_integrity_note: + change_type: new_tests + scenarios: + - id: SCN-runtime-continuation-concurrency + given: "Seven eligible identities and an approved 48-turn daily cap" + when: "The owner raises concurrency to seven, starts a bounded controller, then pauses" + then: "Seven pending starts occur before completion; a tighter limit restricts candidates; invalid settings refuse; pause preserves cap, concurrency and charged attempts" + observable_outcomes: + - "Pending launch count, policy capacity, ledger attempts and refusal codes" + determinism_controls: + - "Hermetic Git repository, fixed clock, controlled promises and no provider calls" + anti_cheat_rationale: + prevents: + - "Treating sequential starts as concurrency or resetting usage on configuration" + - "Tick limits exceeding owner-approved policy" + relaxation: + did_relax_any_assertion: false + if_true_explain_spec_basis: "" +``` + ## 2026-10-03 — Visible automatic-work stops ```yaml diff --git a/docs/spec_changes/2026-10-03-continuation-concurrency.md b/docs/spec_changes/2026-10-03-continuation-concurrency.md new file mode 100644 index 0000000..606b0ee --- /dev/null +++ b/docs/spec_changes/2026-10-03-continuation-concurrency.md @@ -0,0 +1,16 @@ +# Owner-configured continuation concurrency + +The owner can configure `torch continuation enable --concurrency 7 --yes`. +The default remains three; valid settings are integers from one through seven. +An explicit tick `--limit` may tighten but never exceed the approved policy. +Each refill reads current policy; lowering capacity does not cancel active turns. +Omitted configuration fields preserve the approved daily cap and concurrency. +Configuration never resets the attempt ledger or bypasses physical identity guards. + +An already-running older controller cannot hot-load this change. Replace its +timer, not its active service, and allow its native turns and controller lock to +finish before the new controller takes over. No concurrent controllers may +dispatch through the same project lock. + +Scenario SCN-runtime-continuation-concurrency proves seven simultaneous pending +starts, tighter tick limits, invalid-policy refusal and preserved usage on pause. diff --git a/site/console.js b/site/console.js index 7835193..1bbcbeb 100644 --- a/site/console.js +++ b/site/console.js @@ -1041,7 +1041,7 @@ function renderAttention(groups) { function render(snapshot) { const continuation = snapshot.continuation; setText('#continuation-status', continuation?.available - ? `Automatic turns: ${continuation.attempts}/${continuation.maxTurnsPerDay} used today (UTC); ${continuation.remainingTurns} left. ${continuation.stopReason === 'daily-turn-cap' + ? `Automatic turns: ${continuation.attempts}/${continuation.maxTurnsPerDay} used today (UTC); ${continuation.remainingTurns} left. Concurrency policy: up to ${continuation.maxConcurrency ?? 3}. ${continuation.stopReason === 'daily-turn-cap' ? 'No further automatic starts: the owner-controlled daily cap is reached. Running turns may finish.' : continuation.stopReason === 'paused' ? 'Owner policy is paused; no new automatic starts.' : 'Policy permits new eligible turns; this does not verify timer installation.'} ${continuation.held?.length ?? 0} unchanged-work hold(s) need Manager coordination. This is not measured token or cost usage.` : 'Automatic continuation policy is unavailable; do not assume the fleet can start more work.'); diff --git a/src/cli.mjs b/src/cli.mjs index 6a169fc..49fca6a 100644 --- a/src/cli.mjs +++ b/src/cli.mjs @@ -98,7 +98,7 @@ Usage: torch setup [--parent ] [--dry-run] [--yes] [--json] torch up [--fresh] [--only ] [--dry-run] [--yes] [--json] torch recover-runtime --area --unit --invocation [--expected-session --expected-updated-at