feat(orchestrator): soft occupancy threshold requests handoff early (S11 partial)

Coordinator.Soft (default 0.55, ORCHESTRA_OCCUPANCY_SOFT) makes rotate()
and TurnDecision request a handoff advisory-only once occupancy crosses
the soft threshold, well before Hard forces a release/rotation.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01W1rkJ2hBMybnJctPbcy4tT
This commit is contained in:
kami
2026-07-27 23:40:46 +04:00
parent 8b4955a687
commit 84d09ce114
5 changed files with 116 additions and 4 deletions
+11 -2
View File
@@ -273,8 +273,17 @@ Fixed so far:
correct admit token accepted, same-id-different-token rejected as a
hijack, same-id-same-token (legitimate restart) still succeeds.
Not yet started: Codex/opencode Stop-hook-equivalent scripts, S8, S11. See
`AUDIT.md` for the full plan.
- **S11 (partial — soft threshold only)** — added `Coordinator.Soft`
(default 0.55, `ORCHESTRA_OCCUPANCY_SOFT` override). Both `rotate()` and
`TurnDecision` now request a handoff once occupancy crosses `Soft`, well
before `Hard` forces one; `TurnDecision` returns `prepare_handoff` for this
advisory case without requiring a turn boundary, leaving the task leased.
Covered by a new `TestTurnDecision` subtest. **Not done:** milestone
rotation, thrash detection, agent-initiated `ROTATE` — see AUDIT.md's S11
section for why those are bigger than a threshold check.
Not yet started: Codex/opencode Stop-hook-equivalent scripts, S8, S11's
milestone/thrash/agent-`ROTATE` pieces. See `AUDIT.md` for the full plan.
**Phase 0 done (2026-07-27):** this box has live TCP reachability to the real
herdr instance at `192.168.1.105:9245` — verified by hand (raw JSON-RPC