feat(pool): the pool - stacks, admission, the runner and the scheduler

The allowlists and the instrument checks (mcp_connected, db_answered,
exercised), the stack keys, Stacks and Admission, the Runner that runs one
claude or opencode process per pass, and the Scheduler with its retries,
rate-window pauses, the prompt-prefix warm-up, the seats and the board.
One thread per pass; each worker runs on its own copy of the job.

Every pass runs under the supervisor, so a timeout or an abort takes its
whole tree down; a timed-out pass reports exit -9, a SIGKILLed child's
code. The helpers the lenses run are this binary's `sql` and `totp`.
:Process gains an Append stream for the OpenCode meta line.

The tests cover the pool and its share of the commits-mode, seat-pool and
several-drivers checks, a fake claude under the supervisor included.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Jorijn van der Graaf 2026-10-31 08:55:00 +01:00
commit 554a5ddd48
Signed by: jorijnvdgraaf
GPG key ID: 2937E59CDCC1BCFB
8 changed files with 2132 additions and 4 deletions

View file

@ -13,7 +13,7 @@ using namespace Crafter;
namespace {
// The umbrella, then the partitions in import order: each after the ones
// it imports, which is also the order the module map in AGENTS.md uses.
constexpr std::array<std::string_view, 29> Interfaces = {
constexpr std::array<std::string_view, 30> Interfaces = {
"interfaces/Crafter.Review",
"interfaces/Crafter.Review-Unicode",
"interfaces/Crafter.Review-Json",
@ -41,10 +41,11 @@ namespace {
"interfaces/Crafter.Review-Seats",
"interfaces/Crafter.Review-SeatPool",
"interfaces/Crafter.Review-OpenCode",
"interfaces/Crafter.Review-Pool",
"interfaces/Crafter.Review-Freeze",
"interfaces/Crafter.Review-Driver",
};
constexpr std::array<std::string_view, 26> Implementations = {
constexpr std::array<std::string_view, 27> Implementations = {
"implementations/Crafter.Review-Text",
"implementations/Crafter.Review-Crypto",
"implementations/Crafter.Review-Platform",
@ -69,6 +70,7 @@ namespace {
"implementations/Crafter.Review-Seats",
"implementations/Crafter.Review-SeatPool",
"implementations/Crafter.Review-OpenCode",
"implementations/Crafter.Review-Pool",
"implementations/Crafter.Review-Freeze",
"implementations/Crafter.Review-Driver",
};
@ -80,7 +82,7 @@ namespace {
// One per directory under tests/, each an ordinary main() that links the
// library: exit 0 passes, nonzero fails, 77 skips.
constexpr std::array<std::string_view, 18> Tests = {
constexpr std::array<std::string_view, 20> Tests = {
"Crypto",
"Text",
"Platform",
@ -99,6 +101,8 @@ namespace {
"SeatPool",
"Drivers",
"OpenCode",
"Runner",
"Scheduler",
};
// The version the binary reports: CI sets it from the tag, a checkout