Leaked CA keys, receipts, and migrations · Morning Gist
Saturday, October 313 stories · 10 min
Leaked CA keys, receipts, and migrations
Three accounts of checking your work: a CA compromise outrunning trust stores, PRs that record what they verified, and Stripe migrating its own payments.
Picked from 74 new articles across 34 sources · arrow keys for other days
Today in 30 seconds
30s left
Forged certificates appeared within an hour of eMudhra's weak CA keys leaking. Cloudflare finds over half of large-network probes still trust the broken chain. story 1 ↓
Imprint requires every pull request to list what was checked. A daily loop mines the gaps into 4–6 fix-up PRs per code area. story 2 ↓
Stripe moved $1B of its own vendor payments onto Global Payouts in four waves. Most failures came from bad recipient data. story 3 ↓
Stripe's other lesson: test transaction size under load as well as volume, and design around what the receiving side can see. story 3 ↓
1/3Cloudflare· Maxime Guerreiro· Oct 30
Cloudflare finds forged certificates and slow patching after eMudhra's weak CA keys leaked
Eight of certificate authority eMudhra's signing keys turned out to be tiny numbers that anyone could recover. Cloudflare patched its own systems within hours and found forged certificates, but no interception. Many visitors' clients remain unpatched.
Why it matters · It's a measured case study of how slowly a trust-store fix spreads in practice, and why a static list of trusted roots can't keep up with a real compromise.
Know this first
Context from the editor, not the article · 36 sec
1 · Certificate authorities and intermediates
A certificate authority (CA) vouches for websites by signing their certificates. Clients trust a short list of root CAs, which sign intermediate certificates that do the day-to-day signing. If someone gets an intermediate's private key, they can mint certificates for any domain, and clients that trust that chain will accept them.
2 · Certificate Transparency
Certificate Transparency (CT) requires CAs to publish every certificate in public append-only logs. A log returns a signed certificate timestamp (SCT) as a receipt. Browsers that enforce CT reject certificates without valid SCTs, so a quietly forged certificate fails there. Many non-browser clients don't check CT.
3 · Past CA compromises
2/3Will Larson (Irrational Exuberance)· Oct 30
Imprint makes every pull request include a file listing what was checked
Will Larson's team at Imprint now blocks pull requests until an automated agent writes a file saying what it verified and what it couldn't. A nightly job reads those files to find and fix gaps in tooling.
Why it matters · Making "what we didn't check" a required record gives you a stream of data about weak spots in tests and tooling, whether the author is an agent or a person.
Know this first
Context from the editor, not the article · 32 sec
1 · Heads-up: this is about AI agents
The "harness" Larson keeps mentioning is the wrapper that runs an AI coding agent: it gives the model tools, instructions and a loop. Most of the article is about steering such agents. That falls outside this digest's usual scope. It's included for the parts about the quality process.
2 · Larson and Imprint
Will Larson writes the engineering-leadership blog Irrational Exuberance and leads engineering at Imprint, a fintech company. This post follows an earlier one on the "small-change pattern", which keeps each unit of work small.
3 · Ratchets in engineering
A ratchet is a check that only lets quality move one way. A classic example is a CI rule saying lint warnings can drop but never rise. The verification pattern borrows that idea and applies it to the agent's working process.
3/3Stripe· Oct 30
Stripe moves its own $1B in vendor payments onto Global Payouts
Stripe moved its US and UK vendor payments from one-off bank integrations to its own payouts API in four waves. It found that bad recipient data caused most failures, and that per-payment limits were too low.
Why it matters · It's a short migration case study with a few lessons that carry over: check inputs before money moves, design for what the receiver can see, and load-test transaction size as well as count.
Know this first
Context from the editor, not the article · 32 sec
1 · How vendor payments usually work
Companies record invoices in an ERP (enterprise resource planning) system, then pay through per-bank integrations or by typing payments into bank web portals. Each bank has its own file formats, contracts and security rules, so adding a country means building and certifying another integration.
2 · ACH, wires and returns
ACH is the US batch bank-transfer network: cheap, but it settles over days. Wires are faster and suit large sums. A bad account detail often shows up only when the bank sends the payment back days later, called a "return".
3 · Reconciliation
Reconciliation means matching each payment that leaves the bank to the invoice it pays, on both the sender's and receiver's books. When references go missing along the way, someone has to match payments to invoices by hand.
DigiNotar (2011), TÜRKTRUST and TrustWave each misused or lost control of signing ability. In each case only a limited set of attackers or organizations could issue bad certificates. Clients were protected by removing or distrusting the CA in software updates.
Share of probes accepting the eMudhra chain, by browser, with jumps where the probe setup changed.1 / 2
What happened
On October 19, 2026, it emerged that eight 1 signing keys of eMudhra, a 2 (CA, an organization whose signatures make clients trust a site's certificate), were tiny numbers: 4, 56, 66, 115, 155, 156, 230 and 237. Each should have been a roughly 115-digit secret. Anyone could recover them from the public certificates almost instantly and sign a certificate for any domain. Any client that still trusts these keys and doesn't enforce 3 (CT, public logs every real certificate must appear in) would accept it. Earlier CA compromises such as DigiNotar put signing power in a few hands. This one put it in everyone's.
eMudhra blames a key-generation script it hasn't published, and it is leaving the public CA business. The role of its auditors and cross-signers is still unexplained.
Cloudflare's own systems
Within hours, Cloudflare patched the outbound proxies that connect to customers' servers. These are built on 4, its in-house proxy framework, and they handle most of its outgoing connections. A code search found every other system trusting the keys within four hours. All high-priority systems are now patched.
Logging added to Pingora caught about 22,000 handshakes using the weak keys in a week. Two-thirds went to test sites, and most of the rest went to origins using self-issued certificates. About 160 carried certificates naming unrelated domains, some for IoT devices, with validity periods over two years. These looked like servers' default certificates rather than interception: they failed hostname checks, and the same certificate reached many Cloudflare locations. Every verifying handshake was refused. Still, one forged certificate was dated less than an hour after Mozilla's bug report went public.
Are visitors patched?
A fraction of Cloudflare's challenge (bot-check) pages fired background requests to a test host serving an eMudhra-signed certificate, alongside a control. That produced about 50 million probes over a week, with a caveat: the traffic is bot-heavy, and only clients that run JavaScript send probes.
The results:
Current mainstream browsers are mostly patched. Bots and old browsers mostly aren't.
30–40% of 5 clients still accept the weak chain.
On large networks, more than half of probes still accept it.
Patching showed up over the first weekend, then flattened.
One apparent drop in macOS Chrome acceptance turned out to be a new bot detection reclassifying traffic.
What's next
The advice is to patch, using Dennis Jackson's crowdsourced instructions, especially on macOS. Cloudflare argues trust stores must stop being static root lists and should take fast updates for revocation and CT keys, as projects like 6 aim to do.
What happened
On October 19, 2026, it came out that eight 1 signing keys belonging to eMudhra, a 2 (CA, an organization whose signatures make browsers trust a website's certificate), were absurdly weak. Cloudflare's Maxime Guerreiro puts it this way: eMudhra was trusted to pick a 115-digit secret number and picked 4. The other seven secrets were 56, 66, 115, 155, 156, 230 and 237.
The article doesn't name the key algorithm. A 115-digit secret is about the size of a private key on the P-384 elliptic curve, though. On that curve the public key is the secret multiplied by a fixed public point, so an attacker can try 1, 2, 3, … and compare each result with the published public key. That would recover these keys almost instantly, which fits the article's statement that anyone could pull the private keys out of the public certificates.
That's what sets this incident apart from earlier ones. When DigiNotar, TÜRKTRUST and TrustWave were compromised, only a limited set of attackers or organizations could issue fraudulent certificates. Here anyone can derive the keys and sign a certificate for any domain. Any client that still trusts these intermediates and doesn't enforce 3 (CT, public logs that every legitimate certificate must appear in) will accept it.
eMudhra has said it is leaving the public CA business. It blames a mistake in a key generation script but hasn't published the script. One odd detail: eMudhra signed a certificate revocation list (4, a CA's published list of withdrawn certificates) with what might have been a correctly generated key, then "corrected" it to be signed with the weak key. Cloudflare says that, and the role of eMudhra's auditors and cross-signers (other CAs whose signatures chain eMudhra up to trusted roots), still needs explaining.
Patching Cloudflare
Within hours of October 19, Cloudflare patched the most exposed component: the proxies that connect to customers' origin servers. These are built on 5, Cloudflare's in-house proxy framework, and they handle most of the company's outbound connections. They now reject the weak eMudhra keys. In parallel, an automated search of the source code listed every other system that trusted these keys within four hours. Each system got a ticket with a preliminary assessment. High-impact systems were patched immediately, and low-impact ones were due by the end of the following week. All high-priority systems are now patched, and a few low-impact tickets are still open.
Looking for exploitation
Because Pingora carries the vast majority of outgoing TLS connections, Cloudflare added logging for any server certificate chaining to the weak keys. Anyone trying to intercept Cloudflare's traffic with them would trip it. The logging was fully rolled out by October 21.
Over about a week the logging caught roughly 22,000 handshakes involving the weak keys:
About two-thirds were fetches of test sites such as emudhra.we-have-a-problem.com.
Most of the rest went to origins that seem to have issued themselves a certificate under the weak intermediate.
About 160 stood out. Their 6 (SANs, the domains a certificate covers) named other organizations' domains, unrelated to the 7 (SNI, the hostname the client asked for). Some of those domains belonged to consumer IoT devices. These certificates were created after the leak, and some were valid for more than two years, which is longer than any public CA may issue.
Every handshake configured to verify certificates was refused. Cloudflare concludes the 160 oddities were servers' own default certificates, not interception, for two reasons. They named the wrong domains, so they would have failed hostname checks anyway. And in several cases the same certificate reached many Cloudflare locations, so it came from the server itself, not from something sitting on one network path.
The finding that matters is speed. One forged certificate was dated October 20 at 18:19 UTC, less than an hour after Mozilla's bug report went public. Cloudflare has seen no interception of its connections. It notes this doesn't rule out carefully targeted attacks, for which it relies on the usual indirect signs of compromise. None have shown up so far.
Measuring whether visitors patched
Cloudflare can't test a visitor's trust store directly without breaking connections. Instead, a fraction of its challenge pages (the bot-check interstitials) fire two background requests. One goes to ca1.cloudflarecaptcha.com, which serves an eMudhra-signed certificate. The other goes to ca2.cloudflarecaptcha.com, which started out as a control with a normal certificate. If the ca1 request succeeds, that client still trusts the weak keys.
The setup changed several times, which shows up as jumps in the charts (all UTC):
Oct 23, 15:30: the control was switched to an eMudhra certificate without (the CT log receipts). Acceptance differed somewhat, but not much.
That added up to about 50 million probes in a week. There's a big caveat: challenge-page traffic is heavily skewed toward bots, many of them unconfirmed, and only clients that run JavaScript send probes at all.
Results
Up-to-date mainstream browsers are mostly patched. Bots and old browsers mostly aren't. Embedded browsers such as 10 lag, with 30–40% still accepting the weak chain. Probes showed clear patching over the first weekend, during the monitoring gap, and little movement since.
One apparent improvement turned out to be an artifact. On October 29, a new bot detection reclassified a flood of traffic claiming to be Chrome 150–154 on macOS. Acceptance dropped in the "no bot signals" group and rose by a matching amount in the "bot signals" group. Chrome 150–154 on Linux is the one cohort where acceptance keeps falling, and Cloudflare calls that suggestive, not conclusive.
Broken down by network (11, autonomous system number, which identifies an ISP or other large network), more than half of probes from large networks still accept the compromised chain, with or without bot signals, and the trend has been flat since the weekend. Guerreiro argues that bots are still software that needs updates. If they reflect how software gets updated in general, "the picture is quite dire."
Trade-offs and what's open
The measurement is clever but indirect. The population is bot-heavy, the setup changed several times mid-study, and non-JavaScript clients (curl, IoT firmware, many API clients) are invisible to it, even though they are likely among the least patched. Unanswered questions remain: what the key-generation script actually did, why the CRL was re-signed with a weak key, and why audits didn't catch it.
The advice is to patch. Dennis Jackson runs a crowdsourced site with per-platform instructions, and Cloudflare singles out macOS developers. Cloudflare customers using WARP or Tunnel should follow the company's earlier post. Longer term, Cloudflare argues trust stores can't stay static root lists. It already uses quick revocation in some products and backs projects like 12, which push revocation data and CT log keys to clients quickly.
Remember
Forged certificates using the leaked keys appeared less than an hour after Mozilla's bug report became public.
More than half of probes from large networks still trust the broken chain, and patching flattened after the first weekend.
A bot-detection change briefly looked like patching. Reclassified traffic can fake a trend in measurement data.
The loop: implement, open a pull request with a verification file, review, respond, then daily maintenance feeds back in.
Will Larson, who leads engineering at the fintech company Imprint, describes a "verification loop" his team now uses to build software. One caveat: most of the work is done by an AI coding agent, which Larson calls the "1". That puts the post at the edge of this digest's scope. The quality-process design is the useful part.
A required record, not a new check
The name confuses people, Larson says. The verification pattern adds no new tests or linters. Instead, each pull request has to produce a file, verifications/{pr_num}.md, listing every step taken to check the change and what couldn't be checked. A pull request can't leave draft until that file exists.
His reason: you can't tell whether checks actually ran. Too many pull requests reached 2 (the automated build-and-test pipeline) failing lints that could have run locally. A required record makes the process visible. And across many pull requests, the "couldn't verify" sections add up to a running list of weak spots in the tooling. Larson treats that list as the improvement roadmap.
The loop
Implement a fix, for example for a new error spotted in the logs.
Verify locally and open a pull request. The verification file is mandatory.
Get review from an automated reviewer, and sometimes from humans.
Accept or reject comments. Bad ones are dismissed with /dismiss {reason}, which leaves a record.
Daily maintenance: update tool configuration where verifications struggled, file issues for recurring gaps, and adjust the reviewer's guidance based on which comments were dismissed.
Step 5 closes the ratchet. The records from steps 2 and 4 become changes to the process. Larson's one result: each code area (frontend, backend, data, native) starts the day with 4–6 pull requests from this loop. He gives no defect-rate or CI data.
Covering what the files miss
If a job's container crashes, no verification file appears and the gap goes unseen. A separate "3", adapted from Teddy Riker's Designing for Agents, lets the system report broken CI and environment problems directly.
Centralize or explore
Larson frames this as 4. Teams experimenting on their own can raise the ceiling, while a central setup raises the floor. He calls conflicting guidance "5" and runs the loop centrally, with one set of guidance per area. He admits the internal skepticism is fair and says exploration must continue.
Still open: whether the self-reported records are checked against CI logs, and what the nightly pull requests cost in human review time.
Will Larson, who leads engineering at the fintech company Imprint, describes the next step in how his team develops software. They call it a verification loop. Every pull request must now carry a written record of how its changes were checked. A daily job then mines those records to improve the tooling. A caveat up front: the "1" doing most of this work is an AI coding agent. The article is mostly about steering agents, which sits at the edge of this digest's scope. The quality-loop design is the part worth reading.
What the pattern is, and isn't
Larson says the name causes confusion. When teams hear "verification pattern" they ask what new mechanism will check the code, since tests and linters already exist. The answer is that it adds none. He compares it to 2 prompting, where you make the system spell out its reasoning step by step so you can steer it toward the result you want. Here the steering is a required document. Each pull request must produce a file at verifications/{pr_num}.md. It lists every step taken to verify the change, and also what the agent was unable to verify.
Why require a document when the agent might already run these checks? Larson's point is that you can't tell whether it did. His evidence is mundane: too many pull requests reached 3 (continuous integration and deployment, the automated build-and-test pipeline) still failing basic lints that could have run locally. Requiring the agent to say "I ran the linter" or "I couldn't" turns a hidden process into a visible one.
The second benefit matters more to him. Across hundreds of pull requests, the "couldn't verify" sections pile up into a steady flow of data about where verification is weak. Larson calls that list the roadmap for improving the system.
The five-step loop
Step 5 is what makes the loop self-reinforcing. Steps 2 and 4 produce structured records, and step 5 turns those records into changes to the process itself. That is the ratchet: every gap found becomes a candidate fix, so verification should only get better over time.
Results
Larson's only number: each major code area (frontend, backend, data and native mobile) starts the day with 4 to 6 pull requests to review from the nightly process. He says this is "working pretty well". The article gives no figures on defect rates, CI failure rates, how many of those pull requests get merged, or what reviewing them costs.
A second channel for meta-failures
The loop can't see failures that happen before a verification file gets written. If the container running the job crashes partway through, no file appears, and nothing is there to mine. To cover this, Imprint uses a separate "5", following Teddy Riker's essay Designing for Agents. Through it the system reports problems with CI and its own environment, above the level of any single pull request. Larson calls the two techniques complementary: verification files catch gaps in checking a specific change, and the feedback tool catches broken infrastructure.
Centralize or let teams explore?
The closing section is a leadership argument. Larson frames tooling adoption as an explore-versus-exploit trade-off. Letting every team build its own setup explores, which can raise the ceiling by finding better ideas. Centralizing exploits, which raises the floor by giving everyone the same review and tooling. A related question he calls "extremely open" is whether local exploration over-fits to one team's preferences and erodes consistency across the codebase.
His stance is firm on one point. He calls conflicting guidance "6" and is pushing to remove duplicate guidance on any topic, so there's one consistent source per area. Imprint runs the loop centrally, building a single continually improving body of guidance for each code area. He acknowledges internal skepticism about how far the centralizing should go and calls it warranted: he expects the best techniques a year from now to be mostly unknown today, so some exploration has to continue.
What's left open
The article is short and leaves several things unanswered:
No outcome data. There's no evidence yet that the loop raises quality, beyond a count of pull requests generated.
A self-reported record. The file says what the agent claims it ran. The article doesn't say whether claims are checked against CI logs.
Review load. It's unclear how 4–6 nightly pull requests per area affect human review time.
Applying it to people. The idea of requiring an "unverified" section in each pull request carries over to human authors, but Larson doesn't discuss that.
Remember
Requiring a written list of what wasn't verified turns hidden process failures into data you can act on.
The loop is only self-reinforcing because a daily job feeds those records back into tooling and review guidance.
Crashes that happen before the record is written need a separate reporting channel, or they stay invisible.
Stripe's diagram of the payout send flow from its own systems through Global Payouts to vendors' banks.
Stripe pays nearly 20,000 vendor invoices a year across more than 70 markets. It has moved most of its US and UK vendor payments onto 1, its own product for sending money to recipients without Stripe accounts. By October 2026 the product had carried over $1 billion to more than 3,400 vendors. This is a vendor writing about its own product, but a few of the lessons apply to any payments system.
What it replaced
Payments used to go through direct integrations between Stripe's 2 (enterprise resource planning system, where invoices live) and individual banks. Where no integration existed, staff entered payments by hand in bank portals. Each new market took up to six weeks of integration work. Diagnosing a failed payment meant searching several bank portals and the ERP. Global Payouts puts a single API in front of local transfers, international wires and 3 (cryptocurrencies pegged to a fiat currency). An internal 4 maps Stripe's ERP records onto that API.
The rollout
In February 2026, Stripe sent one low-dollar 5 (the US batch bank-transfer network) or wire payment through each US payment flow. From March it ran four waves, raising payment amounts only after nearly all payouts in the previous wave had succeeded. By June the new system carried the vast majority of US vendor payments by count and value.
Three lessons
Validate before money moves. Most failures came from bad recipient data, not bank-side issues. A wrong postal code might surface only days later, when the bank returned the payment. The API now checks required fields up front and says which one is wrong, so staff fix most problems in minutes.
The receiver needs context too. Inside Stripe, each payment carried a reference number and invoice metadata, so it was traceable end to end. The vendor's bank statement often couldn't show who had paid or which invoice it covered. Stripe added customisable 6, the text that appears on the recipient's statement.
Test transaction size, not just volume. Some payments went over the system's per-payment limits and fell back to manual handling. Stripe raised ACH and wire limits on its 7 to $100 million, so large payments keep the same approval and reconciliation path as everything else.
Results and gaps
Setting up a new market now takes one week instead of up to six. Finance staff save an estimated 20–30 hours a month on reporting and reconciliation. The payout success rate is 99.9%, though the post gives no baseline to compare it with. The harder work is still ahead: cross-border payments, cross-currency payments and stablecoin payouts.
Stripe pays nearly 20,000 vendor invoices a year in more than 70 markets. By October 2026 it had moved most of its US and UK vendor payments onto 1, a product it sells for sending money to people who don't have Stripe accounts. Over $1 billion has gone to more than 3,400 vendors this way. This is a vendor post about Stripe's own product, so read it as a customer case study written by the seller. Still, three of its lessons apply to any payments system, and it describes how the migration was run.
The system being replaced
Stripe used to pay vendors through direct integrations between its 2 (enterprise resource planning system, where invoices and accounts payable live) and individual banks. Where no integration existed, staff typed payments into bank web portals by hand. Every bank relationship had its own technical, contractual and security requirements, and building one for a new market took up to six weeks. When a payment failed, operations and finance staff had to search several bank portals and the ERP to find out what went wrong before they could resend it.
Global Payouts puts one API in front of that. Through it a business can pay recipients in more than 160 countries by local bank transfer, international wire, or 3 (a cryptocurrency pegged to a fiat currency such as the dollar). In Stripe's own setup, an internal 4 turns ERP vendor and bank-account records into the API's "recipient" and "payout method" objects.
How the rollout was staged
The migration followed a familiar pattern for risky changes:
February 2026: canary payments. Stripe sent one low-dollar 5 or wire payment through each US payment flow. ACH is the US batch bank-transfer network. Each distinct path was proven with little money at risk.
March 2026: four waves. Payment amounts went up only once nearly all eligible payouts in the previous wave had succeeded. The gate was based on how much money was at stake, not just how many payments ran, which is relevant to Lesson 3.
By June 2026: Global Payouts carried the vast majority of Stripe's domestic US vendor payments, by both count and value.
The post doesn't say what the success threshold for each wave was, how failures were rolled back, or whether the old bank integrations stayed running in parallel.
Lesson 1: validate recipient data before money moves
Bank payments fail for many reasons, including insufficient funds, bank limits and restricted accounts. During the migration, though, Stripe found that most failures came from recipient data problems. The old integrations didn't reliably reject incomplete or wrong details when a payment was submitted. A mistake as small as a wrong postal code might surface only days later, when the bank returned the payment or the vendor complained.
The fix was to move the most common causes of failure earlier in the flow. The API now checks that required fields are present and valid before any money moves, and its error message names the field that needs fixing. Stripe says operations staff now fix most problems in minutes, where before they had to retrace a failed payment days afterwards.
The general idea is that in a system where an error reports back late and asynchronously, every check you can run at submission time is worth a lot. A bank return is like an exception thrown three days after the function returned, and handled by a different team.
Lesson 2: the receiver's view counts too
Inside Stripe, every payment now has a unique reference number and carries its invoice data as metadata, so it can be traced from initiation to settlement through one API. The vendor's bank statement, however, often showed only that money had arrived, without saying who sent it or which invoice it paid. The payment was easy to trace for the sender and hard to recognise for the receiver.
Stripe added customisable 6, the short text that appears on the recipient's bank statement, so senders can include something recognisable such as an invoice number. The lesson is that your observability isn't enough if the other side of the transaction has to reconcile from what the bank shows them.
Lesson 3: test the size of each transaction, not just how many
Global Payouts was built for tens of thousands of payments. Some of Stripe's vendor payments were larger than the system's per-payment limits, and those fell back to manual handling, outside the automated flow. Stripe raised ACH and wire limits on its 7 to $100 million per payment. Those large payments now go through the same approval, ERP recording, funding, reconciliation and reporting steps as everything else, without a side channel.
Scale has more than one dimension. A test of throughput alone would have missed this.
Results
As reported by Stripe:
Metric
Before
After
Time to set up payouts in a new market
up to 6 weeks
1 week
Finance/treasury time on reporting and reconciliation
—
~20–30 hours/month saved (estimated)
Payout success rate
not given
99.9%
Volume
—
>$1B to >3,400 vendors
There is no "before" success rate, so the 99.9% can't be read as an improvement of any particular size. The hours saved are labelled an estimate.
What's left and what's unclear
Global Payouts is generally available in the US and UK. Stripe's harder cases are still ahead: cross-border and cross-currency payments, vendors whose address and bank are in different countries, payments in a currency other than the recipient account's currency, and stablecoin payouts. These are where data validation and reconciliation usually get harder, and the post gives no results for them yet. It also leaves out the orchestration layer's design, how idempotency and retries are handled, and what kinds of failures make up the remaining 0.1%.
Remember
Most of Stripe's payment failures came from bad recipient data, so checking inputs at submission beat handling bank returns days later.
Tracing payments end to end on the sender's side didn't help vendors identify incoming money; statement descriptors filled that gap.
Rollout waves were gated on money at risk, and per-payment limits had to rise to $100M.
Oct 23, 16:30 to Oct 27, 10:00: an unrelated rollback of the challenge platform stopped the probes.
Oct 27, 16:37: Cloudflare noticed it hadn't been sending the "G3 9", a certificate some clients need to build the chain. It added that to both endpoints and removed SCTs from both. The article doesn't describe G3 further.
Oct 27, 16:49: ca2 was switched to chain up to the AAA Certificate Services root instead.
Oct 27, 18:18: probing went from 1% to 10% of challenge pages on non-paying zones.
Implement. Pick something to fix, chosen either by a person or by an automated system. One example is a new error appearing in the logs.
Open a pull request after local verification. A pull request can't move from draft to ready until its verification file exists. This gate is what makes the pattern enforceable rather than advisory.
Collect feedback. An automated code-review tool reviews every pull request, and humans may review too.
Incorporate or reject feedback. Low-quality review comments are dismissed explicitly with a /dismiss {reason} reply, which leaves a machine-readable record of rejected advice.
Maintain, daily. A scheduled job does three things:
It updates the "feature maps" and tool configuration, based on what changed in the code and where verifications ran into trouble, and opens a pull request with those updates. A skill from poteto's 4 does this; the article doesn't explain what a feature map contains.
It reads all the verification files, finds recurring gaps, and files issues to close them.
It checks which review comments were accepted and which were dismissed, then tightens the review tool's guidance to match.