Drill Gate on LibreChat

Every merge request gets a live preview. Drill Gate breaks the services it depends on (refused, hung, cut mid-reply, HTTP or TCP), then asks GitLab Observability whether the failure was loud, and blocks the merge if it was not. This page is rebuilt from the drill reports of every run.

Built 2026-10-27 12:36 UTC by this pipeline · rebuilt on every main pipeline and every hour · source: mr:drill job artifacts

Real bugs found in LibreChat
2
Both fixed in an MR, each drilled against main
Redis fix: chat working again after a 20 s outage
3.9 s
Main: not back after 90 s
Drill runs on this page
20
5 merge requests, every run kept, red ones too
Runs that blocked a merge for a regression
4
3 of them partly from gate bugs we then fixed; each explained below

Bug 2: a 20-second Redis outage leaves LibreChat down

LibreChat's Redis clients stop reconnecting after 10 attempts (about 18 s) and nothing creates new ones. The drill breaks Redis through a TCP fault, then checks whether chat works again (check 5). The fix in !36 keeps reconnecting.

Seconds until chat works again

Latest Redis drill, the MR and main side by side. Window 90 s.

refuse
fix3.9 s
mainnot back after 90 s
blackhole
fix31.4 s
mainnot run: main still down
reset_after
fix4.2 s
mainnot run: main still down

The bugs

Real LibreChat behaviour, nothing planted. FINDINGS

BugWhat users sawFix
Proxy tunnel ignores timeoutsA model provider that never answers holds the chat up to 300 s, whatever timeout is set!7
Redis clients give up for goodAfter a 20 s Redis outage every chat answers 503 until the app restarts!36

Latest drill of each request path

Each check for the MR, then for main's code drilled beside it. An MR fails only where main passes and the MR does not.

chat

Latest drill: job 17486739462 on !36 · 2026-10-27 00:02 UTC · pass

Fault1 Marked failed2 Error log4 User told5 RecoversBack afterCalls
refusefailmainfailfailmainfailpassmainpasspassmainpass0.9 smain0.9 s7
blackholefailmainfailfailmainfailfailmainfailpassmainpass1.0 smain0.9 s1
reset_afterfailmainfailfailmainfailpassmainpasspassmainpass0.8 smain1.6 s12
model:mock-429failmainfailfailmainfailpassmainpasspassmainpass0.8 smain0.8 s4
model:mock-500failmainfailfailmainfailpassmainpasspassmainpass0.8 smain1.4 s4

chat-redis

Latest drill: job 17486739462 on !36 · 2026-10-27 00:02 UTC · pass

Fault1 Marked failed2 Error log4 User told5 RecoversBack afterCalls
refusepassmainpasspassmainpasspassmainpasspassmainfail3.9 smainnot back95
blackholefailmainn/afailmainn/afailmainn/apassmainn/a31.4 smainnot run48
reset_afterpassmainn/apassmainn/apassmainn/apassmainn/a4.2 smainnot run96

translate

Latest drill: job 17443162204 on !4 · 2026-10-25 00:38 UTC · pass

Fault1 Marked failed2 Error log4 User told5 RecoversBack afterCalls
refusepassmainn/apassmainn/apassmainn/an/amainn/an/amainnot run1
blackholepassmainn/apassmainn/apassmainn/an/amainn/an/amainnot run1
reset_afterpassmainn/apassmainn/apassmainn/an/amainn/an/amainnot run1

Every drill run

When (UTC)Merge requestVerdictWhat happenedJob
2026-10-27 00:02!36 Keep reconnecting to Redis after an outagepassmain stayed down: the app did not work again within 90s after chat-redis x refuse; 2 later case(s) not fired17486739462
2026-10-26 08:09!36 Keep reconnecting to Redis after an outageblockedPartly a gate bug: the drill user logged in again while Redis was refused (fixed in b3f5f086). 1 regression(s): chat-redis x refuse: main passes, this MR fails: 1 request marked failed, 2 correlated error log, 4 user told · main stayed down: the app did not work again within 90s after chat-redis x refuse; 2 later case(s) not fired17460246600
2026-10-26 07:33!36 Keep reconnecting to Redis after an outagepassmain stayed down: the app did not work again within 90s after chat-redis x refuse; 2 later case(s) not fired17459966519
2026-10-26 07:11!36 Keep reconnecting to Redis after an outagesetup errorMain's preview answered the first login with 500 before any fault; not explained; the drill was retried in the next run. baseline run against main failed: setup: cannot log in drill user: 500 An unknown error occurred.17459204232
2026-10-26 07:00!36 Keep reconnecting to Redis after an outageblockedGate bug: a case main never ran was counted as a regression (fixed in ff590902). 1 regression(s): chat-redis x blackhole: main passes, this MR fails: 1 request marked failed, 2 correlated error log, 4 user told · main stayed down: the app did not work again within 90s after chat-redis x refuse; 2 later case(s) not fired17459203628
2026-10-26 06:27!36 Keep reconnecting to Redis after an outageblockedPartly a gate bug: a case main never ran was counted as a regression (fixed in ff590902). The lost check 2 under refuse was real: the fix had removed Redis's only ERROR log. 2 regression(s): chat-redis x refuse: main passes, this MR fails: 2 correlated error log; chat-redis x blackhole: main passes, this MR fails: 1 request marked failed, 2 correlated error log, 4 user told · main stayed down: the app did not work again within 90s after chat-redis x refuse; 2 later case(s) not fired17458651291
2026-10-26 06:25!35 Document the stream keepalive intervalpassMR stayed down: the app did not work again within 90s after chat-redis x refuse; 2 later case(s) not fired · main stayed down: the app did not work again within 90s after chat-redis x refuse; 2 later case(s) not fired17458651579
2026-10-26 05:48!35 Document the stream keepalive intervalsetup errorGate bug: the drill user logged in again while Redis was refused (fixed in b3f5f086). setup: cannot log in drill user: 500 An unknown error occurred.17458018709
2026-10-26 05:10!35 Document the stream keepalive intervalpass8 cases, all pass17457223172
2026-10-26 04:47!35 Document the stream keepalive intervalpass3 cases, all pass17456660837
2026-10-25 18:29!7 fix: apply model response timeouts to proxy CONNECT tunnelspass5 cases, all pass17450450932
2026-10-25 17:25!6 Draft: smoke test - drop the upstream model error log (do not merge)blocked4 regression(s): chat x refuse: main passes, this MR fails: 2 correlated error log; chat x reset_after: main passes, this MR fails: 2 correlated error log17450004904
2026-10-25 17:24!7 fix: apply model response timeouts to proxy CONNECT tunnelspass5 cases, all pass17450103639
2026-10-25 00:38!4 feat: translate a message (POST /api/translate)pass3 cases, all pass17443162204
2026-10-25 00:13!4 feat: translate a message (POST /api/translate)blocked3 cases, 1 failing17442914529
2026-10-24 23:57!4 feat: translate a message (POST /api/translate)blocked3 cases, 1 failing17442832000
2026-10-24 20:26!4 feat: translate a message (POST /api/translate)blocked3 cases, 2 failing17441249432
2026-10-24 20:01!4 feat: translate a message (POST /api/translate)blocked3 cases, 1 failing17441042721
2026-10-24 19:38!4 feat: translate a message (POST /api/translate)blocked3 cases, 2 failing17440926086
2026-10-24 19:07!4 feat: translate a message (POST /api/translate)blocked3 cases, 3 failing17440548570

Where Drill Gate loses

A pre-registered mutation eval. On random error-handling mutants, unit tests win: only 2 of 273 sites run when the provider fails. On those 2, both caught both. RESULTS

24 random mutants
Unit tests5 of 24
Drill Gate0 of 24
2 sites a provider failure runs
Unit tests2 of 2
Drill Gate2 of 2

At deploy and after

Nine DevSecOps stages, each with a receipt

StageWhat Drill Gate usesReceipt
PlanDuo planner writes the drill plan; incident responder opens the issue!4, #1
CreateDuo fixer commits the fix, two-commit budget!4
VerifyLive drill on a preview, compared with main!6
PackageDrill kit published to the package registrypackage:kit
SecureSecret Detection; keyless Google Cloud accesssecret_detection
Release10% canary, promote or roll backpipeline 2986406989
ConfigureOne-include CI/CD component and setup scripttemplates/drill-gate.yml
MonitorGitLab Observability judges every checkhourly watch
GovernRequired approval; fixer budget; eval pre-registeredPROTOCOL.md