John asked for a pause in a group's Rules, e.g. a model paused in its
vendor's peak hours. A time rule could only send those turns to another
member first: the paused-for model stayed behind it for failover, went
first when the other was unready, and was kept by affinity mid-turn.
What changed:
- provider: Rule.Pause (`"pause": true`, typed `pause=<model>`). It holds
by time/days and agents only; cleanRules and ParseRule refuse any other
condition, and refuse a pause with none. Pause rules are not send-to rules:
MatchesBesidesIntent, ruledEntry and Ruled() leave them out.
PausedOut(g, ms, agent, at) drops members a pause holds for, from the
group's own rules and each nested group's (a group named = all its
models; a model named = wherever a nested group has it, #625).
- gateway: serve and embeddings run PausedOut on ruleClock before planning,
on every request. Every member paused -> 503 naming each rule
(pausedError). The trace's GroupRef carries Paused.
- GUI: the rule editor's "send to" is now an app-menu action button (send
to / pause); a pause hides the request conditions (clearing them),
keeps hours, days and agents, and isn't saved without one. The group
card's rule reads "→ pause <model>", and the Routing trace says which
model was paused by which rule. Strings in zh, zh-TW, ja, de.
- CLI/TUI: `magpie group rule add <g> pause=<model> time=… days=…`.
- docs: gateway-routing.md step 2; start.html en/zh/ja "Hours and days".
Run:
- gofmt -l clean; go vet -tags nogui ./...; GOOS=linux and GOOS=windows
go vet -tags nogui on gateway, provider, tui, root; go build ./...
- go test -tags nogui ./... under a temp HOME with pinned caches: all ok.
- rules_pause_test.go (3 tests) fails with the PausedOut call in serve
removed (the paused model answers mid-turn, as a fallback, and the
all-paused case returns 200). grouprule_pause_test.go covers clean,
parse/Line, Ruled, Pauses and nested PausedOut.
- GUI: routing-pause.test.cjs in Chromium and WebKit, en/zh at 1100px
and en/zh/zh-TW/ja/de at 420px: 14/14; all 7 Chromium cases fail on
the old routing.js. routing-*, group-*, i18n-keys, gui-ja, gui-de,
click-scroll: 618 pass, 4 fail under --test-concurrency=4
(routing-blocked, -idle-frame, -side-calls, -wb-refused), all of which
pass run alone; routing-side-calls failed 1 of 6 alone and passes
with the old routing.js too, so it is a load flake not touched here.