ReaperCI Documentation

ReaperCI documentation

Release capacity validation - 2026-07-11

Scope

The documented single-node release profile was executed on the Windows development client against a new isolated SQLite database. The harness used the production migrations, CI queue service, concurrent claim path, retained-log storage, and authenticated HTTP SSE handler. It did not connect to the running development hub.

Defect found and closed

The first exact-profile run exposed SQLITE_BUSY when five workers claimed queued builds simultaneously. ReaperCI now serializes only the short SQLite read-and-update claim transaction. Build execution remains concurrent. A scaled five-claim regression profile runs in the normal Go test suite.

Hosted Linux CI then reproduced the same primary SQLite result code while a separate commit-status service held the writer slot. Queue claims now also use a bounded, context-aware retry for SQLITE_BUSY across service boundaries. The focused claim and provider-lifecycle regressions each passed 20 consecutive runs before delivery.

Passing exact profile

Command:

go run ./cmd/reaperci-loadtest

Result:

{
  "repositories": 100,
  "servers": 30,
  "queuedBuilds": 45,
  "runningBuilds": 5,
  "buildLogBytes": 104857600,
  "simultaneousEventClients": 100,
  "minimumEventsSeenPerClient": 1656,
  "databaseBytes": 106250240,
  "seedDuration": "3.9677ms",
  "queueDuration": "129.4112ms",
  "claimDuration": "13.4572ms",
  "logDuration": "6.628042s",
  "totalDuration": "7.1264943s"
}

The 45 queued plus 5 running builds account for all 50 requested builds. Every one of the 100 authenticated SSE clients observed the ready event, all 50 queue events, 5 running events, and 1,600 retained-log events.

Boundary

This closes the repository's reproducible state/event capacity gate. Linux amd64/arm64 runtime smoke, cross-tenant managed isolation, live disk-full behavior, and separate-host restore drills remain distinct release evidence.