refuseCtx now emits llama-server's exceed_context_size_error shape (task rule 1:
only top-level key is "error"); the v2.3 replacement ctxguard_test.go passes and
make smoke still finds "prompt too large". But the protected v2.1 copied test
ctxguard_router_test.go still asserts the old top-level "max" field, which rule 1
forbids alongside "error" — the two protected files demand mutually-exclusive
bodies and the gate cannot pass with the task-required shape. README work
(context-guard body, a new "Clients that manage their own slots" section, and the
three route keys in the config table) is correct but left uncommitted alongside
the code for review; the owner must hand over a ctxguard_router_test.go that reads
error.n_ctx instead of a top-level "max".
Implemented-By: OpenCode session (model recorded in docs/implementer-log.md)
route.go gains Route.Affinity/Queue with PerRoute(), Queues() and affinity
validation (checkRoutes moved here; config.go calls it once). limiter.Track
counts a request without holding or refusing it; a release hands the slot to a
waiter only while in flight <= parallel. The proxy leases a PerRoute() route
under an empty fingerprint (the row keeps the real one) and uses Track when
Queues() is false.
Implemented by Ornith (OpenCode); owner review removed a release-on-first-flush
workaround for a race in the owner's given test (see implementer log).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Config keeps broadcast (one) and adds broadcasts (a list); exactly one must
be present. Wake.Addresses() returns Broadcast then Broadcasts; checkWake
errors on both-set, neither-or-empty, and non-host:port entries. Waker sends
to every address in order, logging/past a failure so one dead address does
not stop the others, and returns false only when none could be sent.
Implemented-By: OpenCode session (model recorded in docs/implementer-log.md)
Implemented /props learning in internal/health/health.go (added Status.NCtx/Status.Slots, PerSlotCtx, and a best-effort GET <base>/props appended to the poll after /v1/models; 0/unknown on any failure without failing the poll) and exposed them in internal/admin/admin.go HostView. Copied internal/health/props_test.go and the replacement internal/proxy/helpers_test.go byte-identical to docs/plans/v2/_files/.
Implemented-By: OpenCode session (model recorded in docs/implementer-log.md)
cmd/crossbar/main.go calls admin.Handler with the new 6-arg signature, passing nil for the not-yet-wired leases/limiter/store/drainer (task 07 wires them) so go vet and go test ./... pass on cmd/crossbar. This is a compile fix, not the task-07 wiring; noted in the implementer-log.
Implemented-By: OpenCode session (model recorded in docs/implementer-log.md)
Tests were run against a private reference implementation: gate ok after every
task in order, smoke ok (stream spread ~1000 ms). The reference is not in the
repository.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>