doug
DashboardScoreboardQueueDocsGitHubAbout
Menu
DashboardScoreboardQueueDocsGitHubAbout
Sign in

the reader is live · scoring its own pull requests

Most PRs don’t need you.

Doug reads every pull request once, routes the few that need a human, and clears the rest. Every merge starts a clock against this repository’s own reverts. When Doug is wrong, it says so — in public.

Get startedSee the queueGitHub App · never blocks · FSL source
Doug· check runneutral

#84 · Restore the WorkOS sign-in front door

Flagged · risk 0.58 · diff read

Risk
0.58
Flag line
0.30
Read
validated diff reader
Findings
1 high · 4 medium · 1 low

Needs you. Risk is above this repository's flag line, so Doug is asking for a human read. It does not block: this check is neutral and the merge button is unchanged.

Findings

  • –high · If NEXT_PUBLIC_WORKOS_REDIRECT_URI is unset, malformed, or has a path other than exactly '/auth/callback', configuredWorkOSRedirectUri() returns null and every request matched by the proxy returns a constant 503. This turns a config drift into a total outage of all proxied routes rather than degrading only sign-in. · reader:config-dependent-outage
  • –medium · requestHostMatches compares only against the single configured redirect host. Cloud Run serves both the deterministic and hash *.run.app URLs, and custom domains/health checks may present other hosts; any mismatch yields a 307 to the canonical origin, which can loop or break internal probes if the forwarded host never equals the configured host (e.g., host header rewritten by the LB). · reader:redirect-loop
  • –medium · The proxy builds `new NextRequest(url, { method, headers })` without forwarding the body or duplex stream. If handleAuthkitProxy uses authRequest to continue/rewrite the request, POST/PUT payloads (server actions, form submissions) can be lost or fail. · reader:request-body-loss
  • ▸ 3 more findings

adjudicated 20 · pending 114 · as of 2026-09-03

deep reads 43/200 this cycle

What lands on every PR in coldworkshq/doug. Live.
open
167
need you
59
cleared
108
flag line
0.30

The open queue, pinned by risk

65% cleared without a human

One pull request, start to finish

Read once. Route. Then wait and see.

Everything to the left of the merge is what a reviewer does. Everything to the right is what no reviewer does: keep the verdict, and find out whether it was right.

  1. open

    A PR opens

    Or a push lands. The GitHub App takes the webhook and queues one job. Nothing else in your pipeline changes.

  2. read

    Doug reads the diff

    Title, files, patch — capped at 100k characters in a fixed order, and the check says when the cut fell short. No author, no dates.

  3. route

    Needs you, or cleared

    Scored against the flag line you set for that repository. One neutral check, one sticky comment. Never a red X.

  4. d0

    Merge starts the clock

    The verdict becomes a dated row that nobody can edit — threshold, findings, and what the reader was shown, pinned.

  5. d14 · d60

    Graded against production

    At each window the row is adjudicated: reverted, or survived. The scoreboard counts it either way.

  6. publish

    The number goes out

    The miss rate publishes on its pre-committed date with its N, whatever it says. Until then it renders as a dash.

Three rules, in writing

Built so nobody wants to switch it off.

Route, never block

Doug orders attention. It holds no merge hostage, gates no pipeline, and adds zero seconds to a cleared PR.

Never writes code

A reviewer that also writes is marking its own homework. Doug decides where eyes go — it never generates a fix.

Will publish its miss rate

Every escaped defect Doug cleared will be counted, dated, and published on the locked cadence. If the number is bad, you'll see it here first.

The cost of reviewing everything

A review on every PR costs a review on every PR.

Coding agents multiplied pull requests. Tools that answer with a full model review of each one — /code-review on every branch, a bot on every diff — scale their spend with exactly that number, and still leave a person reading comments on all of them. Doug spends one bounded read per PR, then spends your attention only above your flag line.

Per pull requestA model review of everythingDoug
What a human readsThe comments, on 100% of PRs.The PRs above your flag line. On this repository today: 59 of 167.
Model spend per PRA full agentic read of the branch, as large as the branch is. Run it twice, pay twice.One read of the diff, capped at 100k characters at a fixed effort. The look-up passes that follow run a cheaper model.
Where the spend showsOn a bill, later.On the check run itself: “deep reads 143/200 this cycle.” The meter is the surface you already read.
When it runsWhen someone remembers to run it.On every push, as a GitHub check. Nobody has to remember, and nobody can forget.
The merge buttonWhatever the tool decides that day.Untouched. The check is neutral, every time, by design.
When the read failsYou re-run it, or it ships unread.The deterministic tier scores it without a model and the check says so. A downgrade is never silent.
After the mergeNothing. The comments were the product.A 14- and 60-day clock, graded against this repository's own reverts, published on a date.

Doug is not model-free. With the reader on, every PR costs a read; the deterministic tier is what runs when it is off or fails. The saving is bounded spend and routed attention, not a skipped model call.

What the reader is given

  • the diff itself
  • the PR title
  • the files it touches

What the reader is not told

  • who wrote it
  • human or agent
  • when it was opened
  • who approved it
  • what happened next

The judgment about the code is made without knowing who wrote it. That claim is narrow on purpose: it covers the read, not the whole of Doug.

Doug does see authorship elsewhere. The deterministic fallback — used when a read fails — scores a PR higher when a bot opened it, and the queue tells you who wrote each one, because you need that to route. What it never does is let the reader grade the code against the author’s reputation.

What’s actually measured

0.69/ 0.67

Ranking AUC on sentry and grafana, pre-registered before a single model call. The best deterministic baseline scored 0.59 and 0.52 — on grafana every metadata method we tried lands at or below random. Reading the diff is the first thing that survived a second repo.

That’s the 30,000-character probe reader, not the one running on your PRs — the shipped reader hasn’t been measured by it.

Published miss rate

—

Not yet. The live counters — adjudicated, pending, first due — sit on the scoreboard. The number lands here with a date next to it, good or bad.

Others learn what reviewers say

Doug grades what production did, remembers it, and will tell your agents before they type.

landing

Every merge starts a clock

Every merge starts a clock. At 14 and 60 days the verdict is graded against what actually happened — reverted, or survived the window. The scoreboard starts at zero and says so.

accruing

Remembers it

Every verdict is a ledger row — dated, immutable, waiting to be graded. A repo running Doug for a year holds a calibrated risk record of itself that no point-in-time reviewer can replicate.

planned · no dates promised

Tells your agents

The graded history, served to coding agents before they type: “this migration shape reverted here 7 of 9 times — the two that survived used dual-write.” Ships when there is adjudicated data to serve, not before.

Watch the queue thin out.

167 scored PRs, 59 worth your time, and the receipts behind every score.

Open the queueStar on GitHub
doug · routes, never blocksA Coldworks product · FSL-1.1-ALv2 · coldworkshq/doug