GitLab Transcend · Path B · Uptime Kuma 2.5.7

SECONDKEY

A bad change can pass every test. Second Key checks every merge request with evidence, decides with code, not a model, and leaves one decision to a human: turning the second key for that exact commit.

The path of one merge requestlive on gitlab.com
01 MERGE REQUESTopened02 EVIDENCEtests · mutation · fuzz03 VERDICTcode, not a model04 SIGNEDin-toto · cosign05 SECOND KEYa human, this commit06 VERIFYevery merge since release07 RELEASEonly if verified08 DEPLOYadmitted image
secondkey · prooffrom proof/
001 LOAD POLICY................... v4
002 REPLAY RECORDED EVIDENCE...... 69 MRS
003 REAL UPSTREAM BUGS FLAGGED.... 17/30
004 TESTS-PASS RULE STOPPED....... 1/30
005 SEEDED FAULTS FLAGGED......... 15/16
006 CLEAN CHANGES SENT TO REVIEW.. 6/12
007 UPSTREAM PRS REPLAYED......... 10
008 ENERGY VS FULL SUITE.......... -86%
009 AGENT SESSIONS ON REAL MRS.... 22
010 WHO TURNS THE KEY............. A HUMAN

Live on Cloud Run ↗ Releases ↗Agent sessions ↗

00 / At a glance

Caught what tests
let through

real upstream bugs flagged
fixes Uptime Kuma shipped, undone by a rule sealed before the run
the usual rule stopped
merge when the MR's own tests pass, same MRs
good changes sent to review
the price of the catches, on 20 good changes
less CI energy
same 6 commits, risk-proportional vs full suite; 70-73% less carbon
01 / Thirty real bugs

Bugs Uptime Kuma
already fixed

Thirty upstream bug fixes from the 2.x line, each undone on main by reverting its code (its regression tests stay), chosen by a rule that was committed and tagged reintro-sealed before the first merge request. Each went through the live pipeline. Merge-when-tests-pass stopped 1 (4 with every test re-run); Second Key flagged 17, 16 of them with every test green. A reviewer picking changes at random at Second Key's review rate would flag that many with probability 0.012.

MRUPSTREAM FIX, UNDONETESTSSECOND KEY
!57fix: Revert "feat(dns): add configurable timeout for DNS monitorpassedREVIEW
!58fix: Domain expiry doesn't seem to update #7189 (#7198)passedREVIEW
!59fix: prometheus metrics have two series for a single monitor whepassedREVIEW
!60fix(discord): timezone with `dayjs.utc()` (#7520)passedGO
!61fix(real-browser): always close browser context (#7820)passedREVIEW
!62fix: reduce rate-limit log spam when quota is healthy (#7599)passedREVIEW
!63fix: Revert back to single SQLite connection by default (#7346)passedREVIEW
!64fix: Revert "add sorting to status pages" (#7194)passedGO
!65fix: allow mqtts:// in MQTT monitor (#7290)passedGO
!66fix(monitor-list): cannot display monitor name in full width (#7passedGO
!67fix: removal of uptime ratio and avg. response time from promethpassedGO
!68fix: show certificate expiry on status page for TCP monitors (#6passedREVIEW
!69fix: monitor graph gaps for sub-millisecond TCP pings (#7159)passedGO
!70fix: move afterCreate to initial mariadb pool config (#7718)passedREVIEW
!71fix: Add bearer token support to WebSocket upgrade monitor (#743passedGO
!72fix(uptime): ensure correct handling of missing time buckets in failedBLOCK
!73fix: double // in badgeUrl breaking Badge generator functionalitpassedGO
!74fix(notification): ensure applyExisting is not saved to databasepassedREVIEW
!75fix: use UptimeCalculator for avg-response badge endpoint (#7886passedREVIEW
!76fix: omit resolver port from DNS monitor service URL (#7516)passedREVIEW
!77fix: Update Home Assistant notification help text for HA 2024 SepassedGO
!78fix: clearing heartbeats on paused monitors leaves them paused (passedGO
!79fix: Remove forced DOWN status in group monitor (#7045)passedGO
!80fix: RSS service status description is wrong (#7641)passedREVIEW
!81fix: accepted status codes custom range discarded on tag creatiopassedGO
!82fix: Add `busy_timeout` to sqlite to avoid error `SQLITE_BUSY: dpassedREVIEW
!83fix(domain-expiry): clarify unsupported RDAP warning (#7588)passedREVIEW
!84fix: isParentActive return type to boolean (#7121)passedREVIEW
!85fix: add timeout functionality to kafka (#7472)passedREVIEW
!86fix: preserve saved protocol when loading Globalping ping monitopassedGO
02 / Two rules, same merge requests

Judge them twice

16 deliberately broken merge requests and 12 clean ones went through the live pipeline. Switch between the rule most projects use and Second Key's verdict. The usual rule stops 4 of 16 of the broken ones and never bothers a clean change, so it is a fair baseline; Second Key flags 15 of 16, and its price is review load.

4/16seeded faults stopped or flagged 0/12clean changes held up
!3ROUND 1
checkStatusCode upper bound exclusive
GO
tests passed: merged
!4ROUND 1
flatStatus maps MAINTENANCE to DOWN
GO
tests passed: merged
!5ROUND 1
number <= operator becomes <
BLOCK
tests failed
!6ROUND 1
evaluator swaps AND and OR
BLOCK
tests failed
!7ROUND 1
system-service check builds a shell command
GO
tests passed: merged
!8ROUND 1
status page preload loses script-context escaping
GO
tests passed: merged
!9ROUND 1
deleteMonitor handler without checkLogin
GO
tests passed: merged
!10ROUND 1
fake GitLab token committed in config
GO
tests passed: merged
!11ROUND 1
uptime-calculator test loses assertions
GO
tests passed: merged
!12ROUND 1
parseTimeObject reads hours as minutes
GO
tests passed: merged
!13ROUND 1
certificate hostname check always passes
BLOCK
tests failed
!14ROUND 1
retry delay says 30 seconds, code waits 30 minutes
GO
tests passed: merged
!15ROUND 1
document the push route query parameters
GO
!16ROUND 1
clarify the numeric operator comment
GO
!17ROUND 1
README wording fix
GO
!18ROUND 1
unit test for checkStatusCode
GO
!19ROUND 1
rename a local variable in the push route
GO
!20ROUND 1
JSDoc for flatStatus
GO
!34ROUND 2
PENDING to DOWN no longer notifies
GO
tests passed: merged
!35ROUND 2
JSON query == compares with !=
BLOCK
tests failed
!36ROUND 2
condition groups always use AND
GO
tests passed: merged
!37ROUND 2
/metrics served without apiAuth
GO
tests passed: merged
!38ROUND 2
clarify a comment in the DNS monitor
GO
!39ROUND 2
unit test for isImportantForNotification
GO
!40ROUND 2
name the default push message
GO
!41ROUND 2
CONTRIBUTING wording fix
GO
!42ROUND 2
slightly wider button padding
GO
!43ROUND 2
normalise the status page slug in one expression
GO
03 / Where the line is drawn

The threshold
is a choice

The current policy replayed on the 28 recorded MRs at every GO threshold. Blockers do not depend on it; the curves show what the score buys. These MRs calibrated the policy once, so this describes the trade-off rather than testing it.

seeded faults flaggedclean changes passed
0%50%100%01224364860GO threshold (score)today: GO ≤ 24GO ≤ 0: 16 of 16GO ≤ 6: 16 of 16GO ≤ 12: 16 of 16GO ≤ 18: 16 of 16GO ≤ 24: 16 of 16GO ≤ 30: 13 of 16GO ≤ 36: 12 of 16GO ≤ 42: 11 of 16GO ≤ 48: 10 of 16GO ≤ 54: 8 of 16GO ≤ 60: 8 of 16GO ≤ 0: 0 of 12GO ≤ 6: 4 of 12GO ≤ 12: 4 of 12GO ≤ 18: 6 of 12GO ≤ 24: 6 of 12GO ≤ 30: 7 of 12GO ≤ 36: 9 of 12GO ≤ 42: 10 of 12GO ≤ 48: 11 of 12GO ≤ 54: 12 of 12GO ≤ 60: 12 of 12
04 / Real pull requests

Uptime Kuma's own
history

Every held-out upstream PR that applies to 2.5.7 was replayed through the live pipeline; whether it was later reverted or fixed was hidden from the gate. On the sealed held-out backtest (history and diff signals only) it flagged 1 of 4 later-bad PRs and sent 113 of 229 good ones to review.

MRUPSTREAM PRLATERVERDICTSCORE
!23#6736later reverted or fixedREVIEW25
!24#6990later reverted or fixedREVIEW40
!25#7950fineGO19
!26#7911fineGO11
!27#7285fineGO18
!28#7844fineGO5
!29#7856fineREVIEW25
!30#7864fineGO11
!31#7026fineGO10
!32#7846fineREVIEW50
05 / The second key

Agents check.
A human decides.

Six steps, on gitlab.com and Google Cloud. Agents read, explain and propose fixes; the verdict is code; the key is a person's note naming the commit. On !87 the gate blocked a removed login check, the flow opened !88 restoring that line, and the same gate gave the fix GO.

01
MR OPENED

Evidence runs in CI: only the tests the change can reach, mutation, fuzzing, scans.

02
VERDICT

Deterministic code reads the evidence: GO, NEEDS_REVIEW or BLOCK, signed for this commit.

03
EXPLAINED

A Duo flow writes the Evidence Note. On BLOCK it files the issue and opens a fix MR, judged by the same gate.

04
THE KEY

A key holder turns the second key for exactly this commit, after its evidence is signed.

05
VERIFIED

On merge, every merge since the last release is re-verified: signature, diff, key.

06
ROLLED OUT

Cloud Run: 5%, 25%, 100%, each step held only inside the SLO; a breach restores the recorded revision.

06 / Energy

Only the evidence
the change needs

The same six commits run twice: risk-proportional evidence (blue) and the full suite (grey), measured per job with Eco CI. 491.3 J against 3468.72 J.

07-dns-comment
!38 vs !44
65.78 J
572.85 J
08-notification-test
!39 vs !45
18.55 J
604.75 J
09-push-default-message
!40 vs !46
151.49 J
526.23 J
10-contributing-wording
!41 vs !47
9.15 J
609.65 J
11-button-padding
!42 vs !48
111.96 J
503.17 J
12-status-page-router-slug
!43 vs !49
134.37 J
652.07 J
07 / DevSecOps stages

9 of 9 stages,
each with a link

08 / What it misses

Said out loud