Evidence ledger
One row per claim in Time cannot go backwards, and other lies production believed: who published it, what grade it carries, when it was written, when the link was last checked, and the quote or figure it rests on. Nothing in the guide is cited from memory, so anything not in this table is not in the guide.
One row per claim. Tier grades follow the skill's eight-tier vocabulary. Checked dates are the day the source was read in this session (2026-09-05).
Access note for this session
This research session ran inside a remote environment with a network allowlist. Reachable and
fetched directly: github.com, raw.githubusercontent.com, pkg.go.dev, cloud.google.com,
plus PDFs pulled from GitHub-hosted mirrors. The following canonical hosts were blocked by the
egress policy: blog.cloudflare.com, azure.microsoft.com, engineering.fb.com,
developers.google.com, aws.amazon.com, martin.kleppmann.com, aphyr.com,
cse.buffalo.edu, web.archive.org. For sources on those hosts, content was read through
multiple independent search-index extractions in this session, cross-checked against each
other and against fetchable primary documents that quote them (for example, the Go monotonic
proposal quotes and links the Cloudflare postmortem directly). Every quote taken from a
blocked-host source below is marked [via extraction] and was confirmed by at least two
independent extractions. No quote below is reproduced from memory.
Consequence for the evidence mix: no conference-talk tier source could be fetched (USENIX and
YouTube are both blocked), so this guide carries zero talk cards; the talks that exist are
pointed to from the hunt section instead.
| # | Org | Title | Tier | Published | Checked | URL | Claim I take from it | Supporting quote or figure |
|---|---|---|---|---|---|---|---|---|
| 1 | Cloudflare | How and why the leap second affected Cloudflare DNS | postmortem | 2017-01-01 | 2026-09-05 [via extraction] | https://blog.cloudflare.com/how-and-why-the-leap-second-affected-cloudflare-dns/ | The root cause was an assumption about time itself, not a coding slip | "the root cause of the bug that affected our DNS service is the belief that time cannot go backwards" |
| 2 | Cloudflare | (same) | postmortem | 2017-01-01 | 2026-09-05 [via extraction] | https://blog.cloudflare.com/how-and-why-the-leap-second-affected-cloudflare-dns/ | Blast radius and timeline | "at peak approximately 0.2% of DNS queries" affected, "less than 1% of all HTTP requests" errored; most affected machines patched in 90 minutes, worldwide fix by 06:45 UTC |
| 3 | Cloudflare | (same) | postmortem | 2017-01-01 | 2026-09-05 [via extraction] | https://blog.cloudflare.com/how-and-why-the-leap-second-affected-cloudflare-dns/ | Failure mechanism | upstream performance values computed from wall-clock subtraction went negative during the leap second; the weighted selection code fed the negative number to Go's rand.Int63n(), which panics on a negative argument |
| 4 | Microsoft | Summary of Windows Azure Service Disruption on Feb 29th, 2012 | postmortem | 2012-03-09 | 2026-09-05 [via extraction] | https://azure.microsoft.com/en-us/blog/summary-of-windows-azure-service-disruption-on-feb-29th-2012/ | The date bug and its mechanism | the guest agent "calculated the valid-to date by simply taking the current date and adding one to its year", producing February 29, 2013, an invalid date; certificate creation failed, VMs stalled in initialization |
| 5 | Microsoft | (same) | postmortem | 2012-03-09 | 2026-09-05 [via extraction] | https://azure.microsoft.com/en-us/blog/summary-of-windows-azure-service-disruption-on-feb-29th-2012/ | The cascade multiplier was the health machinery, not the bug | after three consecutive VM initialization failures the host was marked for "human investigate" (HI) state as suspected hardware failure; the bug was identified 2 hours 38 minutes after it first triggered |
| 6 | Linux kernel | commit 6b43ae8a: ntp: Fix leap-second hrtimer livelock | source | 2012 (merged) | 2026-09-05 fetched | https://github.com/torvalds/linux/commit/6b43ae8a619d17c4935c3320d2ef9e92bdeed05d | The kernel's own leap second insertion path could deadlock the machine | commit message describes the NTP-lock vs timekeeping-lock livelock between do_adjtimex() and the leap-second hrtimer; Reported-by/Tested-by: Sasha Levin, Diagnosed-by: Thomas Gleixner |
| 7 | Linux kernel | commit 4873fa07: timekeeping: Fix leapsecond triggered load spike issue | source | 2012-07 (merged) | 2026-09-05 fetched | https://github.com/torvalds/linux/commit/4873fa070ae84a4115f0b3c9dfabc224f1bc7c51 | After the June 2012 leap second, CLOCK_REALTIME timers fired early and applications spun | "timers based on CLOCK_REALTIME are either expiring a second early or late"; "The reported immediate workaround - $ date -s \"date\" - is causing a call to clock_was_set()" |
| 8 | Linux kernel | commit 5baefd6d: hrtimer: Update hrtimer base offsets each hrtimer_interrupt | source | 2012-07 (merged) | 2026-09-05 fetched | https://github.com/torvalds/linux/commit/5baefd6d84163443215f4a99f6a20f054ef11236 | Why the fix was subtle: a race window between setting time and updating offsets | "Any interrupt which arrives in that window will see the new time but operate on stale offsets"; "guarantees that timers are not expired early" |
| 9 | Go project | issue #12914: time: use monotonic clock to measure elapsed time | source | 2015-10-13 | 2026-09-05 fetched | https://github.com/golang/go/issues/12914 | The gap was known 15 months before the outage | "Go's standard library doesn't provide any API to access a monotonic clock source" (tsuna, opening comment); milestone Go1.9, Proposal-Accepted |
| 10 | Go project | Proposal: Monotonic Elapsed Time Measurements in Go (design/12914-monotonic.md) | adr | 2017-01-26 | 2026-09-05 fetched | https://github.com/golang/proposal/blob/master/design/12914-monotonic.md | The design problem, stated | "Comparison and subtraction of times observed by time.Now can return incorrect results if the system wall clock is reset between the two observations." |
| 11 | Go project | (same) | adr | 2017-01-26 | 2026-09-05 fetched | https://github.com/golang/proposal/blob/master/design/12914-monotonic.md | The outage is cited as the motivating incident | "A Go program measuring a negative elapsed time during a leap second caused CloudFlare's recent DNS outage." |
| 12 | Go project | (same) | adr | 2017-01-26 | 2026-09-05 fetched | https://github.com/golang/proposal/blob/master/design/12914-monotonic.md | Why the two-API design was rejected: correlated failure | "The most common clock reset in a well-run production setting is the leap second, which occurs simultaneously on all systems. When it does, all the copies of the program across the entire distributed system fail simultaneously, defeating any redundancy the system might have had." |
| 13 | Go project | (same) | adr | 2017-01-26 | 2026-09-05 fetched | https://github.com/golang/proposal/blob/master/design/12914-monotonic.md | Scale of silent fixes | "about 30% of the calls to time.Now (by source code appearance, not dynamic call count) are used for measuring elapsed time and should use the system monotonic clock"; corpus analysis: "71% unaffected", "29% fixed in event of wall clock time warps" |
| 14 | Go project | Go 1.9 release notes (doc/go1.9.html, release-branch.go1.9) | vendor | 2017 | 2026-09-05 fetched | https://github.com/golang/go/blob/release-branch.go1.9/doc/go1.9.html | The shipped behavior | "The time package now transparently tracks monotonic time in each Time value, making computing durations between two Time values a safe operation in the presence of wall clock adjustments." |
| 15 | Go project | package time documentation, Monotonic Clocks section | vendor | current | 2026-09-05 fetched | https://pkg.go.dev/time | The design rule in one sentence, and its boundary | "the wall clock is for telling time and the monotonic clock is for measuring time"; marshaling methods strip the monotonic reading because it has "no meaning outside the current process" |
| 16 | Rust project | issue #56612: Instant::now can go backward | source | 2018-12-07 | 2026-09-05 fetched | https://github.com/rust-lang/rust/issues/56612 | The same failure re-appears in another runtime, from hardware this time | opened by goffrie: Instant::now() returned decreasing values on Windows (QueryPerformanceCounter unreliable on some multi-core systems), panicking with "specified instant was later than self" |
| 17 | Rust project | PR #56988: std: Force Instant::now() to be monotonic | source | merged 2019-01-08 | 2026-09-05 fetched | https://github.com/rust-lang/rust/pull/56988 | Rust's first answer: paper over the platform in the runtime | alexcrichton: "We tried relying on OS/hardware/clock implementations, but those seem buggy enough that we can't rely on them in practice"; approach mirrors Firefox's |
| 18 | Rust project | PR #89926: Make Instant::{duration_since, elapsed, sub} saturating and remove workarounds | source | merged 2022-02-13 | 2026-09-05 fetched | https://github.com/rust-lang/rust/pull/89926 | The workaround itself became the cost; reversed after three years | the8472: "Currently we must choose between two poisons. One is high worst-case latency and jitter of Instant::now() due to explicit synchronization; see #83093 for benchmarks, the worst-case overhead is > 100x. The other is sporadic panics on specific, rare combinations of CPU/hypervisor/operating system due to platform bugs." |
| 19 | Kubernetes | client-go tools/leaderelection/leaderelection.go | source | current | 2026-09-05 fetched | https://github.com/kubernetes/client-go/blob/master/tools/leaderelection/leaderelection.go | Production leader election ships with the clock caveat written into the package comment | "This implementation does not guarantee that only one client is acting as a leader (a.k.a. fencing)"; timestamps are captured locally, tolerating arbitrary clock skew but remaining sensitive to skew rate; tolerated rate ratio approximated by the LeaseDuration to RenewDeadline ratio |
| 20 | Martin Kleppmann | How to do distributed locking | blog | 2016-02-08 | 2026-09-05 [via extraction] | https://martin.kleppmann.com/2016/02/08/how-to-do-distributed-locking.html | A lease plus a process pause violates mutual exclusion; the fix is a fencing token checked by the resource | a client can acquire a lease, pause (GC, page fault), and resume after expiry while another client holds the lock; a fencing token is a monotonically increasing number issued with the lock, and the storage service rejects writes carrying a token lower than one already seen; Redlock is criticized for depending on timing assumptions and lacking fencing tokens |
| 21 | CockroachDB | docs/design.md (time and HLC sections) | adr | maintained, read 2026 | 2026-09-05 fetched | https://github.com/cockroachdb/cockroach/blob/master/docs/design.md | How a database orders transactions on commodity clocks | "Each cockroach node maintains a hybrid logical clock (HLC)"; a transaction reads with an uncertainty interval up to "t+ε ... (ε is the maximum clock offset)"; conflicting data inside the interval "cause the transaction to abort and retry"; with better clocks it could "wait out the maximum clock offset after committing, but before returning to the client" as Spanner does |
| 22 | Cockroach Labs | Runbook template, clock-management.md | vendor | maintained, read 2026 | 2026-09-05 fetched | https://github.com/cockroachlabs/cockroachdb-runbook-template/blob/main/system-overview/clock-management.md | The operational contract: bounded offset or death | "The default maximum clock offset value is 500 ms."; a node detecting drift over 80% of max offset vs a majority of peers "spontaneously shuts down the node to guarantee database read consistency"; "Only use NTP sources that implement smearing or slewing of leap second" |
| 23 | Spanner: Google's Globally-Distributed Database (OSDI 2012) | paper | 2012-10 | 2026-09-05 fetched (PDF via Papers We Love mirror) | https://github.com/papers-we-love/papers-we-love/blob/main/datastores/spanner-google%27s-globally-distributed-database.pdf | The measured cost of bounded uncertainty | "ε is typically a sawtooth function of time, varying from about 1 to 7 ms over each poll interval. ε is therefore 4 ms most of the time."; applied drift rate 200 microseconds/second; poll interval 30 s; commit wait measured at about 5 ms; "bad CPUs are 6 times more likely than bad clocks" | |
| 24 | Making every (leap) second count with our new public NTP servers | blog | 2016-11-30 | 2026-09-05 fetched | https://cloud.google.com/blog/products/gcp/making-every-leap-second-count-with-our-new-public-ntp-servers | The smear, quantified | "we'll run the clocks 0.0014% slower across the ten hours before and ten hours after the leap second, and 'smear' the extra second across these twenty hours"; "For timekeeping purposes, December 31 will seem like any other day." (Michael Shields, Technical Lead, Time Team) | |
| 25 | Leap Smear (Public NTP documentation) | vendor | current | 2026-09-05 [via extraction] | https://developers.google.com/time/smear | The proposed standard smear, and its adoption | recommended standard is a 24-hour linear smear from noon to noon UTC; the frequency change is about 11.6 ppm, within the thermal error of most quartz oscillators; Amazon uses this smear in AWS; Google previously used 20 hours and changed to align | |
| 26 | Meta | It's time to leave the leap second in the past | blog | 2022-07-25 | 2026-09-05 [via extraction] | https://engineering.fb.com/2022/07/25/production-engineering/its-time-to-leave-the-leap-second-in-the-past/ | A second large operator smears differently, and wants the mechanism abolished | Meta smears the leap second over 17 hours starting at 00:00:00 UTC based on tzdata; UTC has been adjusted 27 times since leap seconds were introduced; "Introducing new leap seconds is a risky practice that does more harm than good" (Obleukhov and Byagowi) |
| 27 | AWS | ClockBound (README) | source | maintained, read 2026 | 2026-09-05 fetched | https://github.com/aws/clock-bound | Bounded uncertainty as a commodity API | "The window of uncertainty (the Clock Error Bound) is defined by two timestamps (earliest, latest) within which true time exists"; "the clock error bound grows in between clock updates"; designed to pair with the Amazon Time Sync Service |
| 28 | AWS | Amazon Time Sync Service microsecond-accurate time announcement | vendor | 2023-11 | 2026-09-05 [via extraction] | https://aws.amazon.com/about-aws/whats-new/2023/11/amazon-time-sync-service-microsecond-accurate-time/ | Vendor claim: microsecond-level sync on supported EC2 instances | the service "synchronizes time within microseconds of UTC" using the Nitro System and GPS-disciplined reference clocks; clock accuracy claimed in the low double-digit microsecond range within the guest OS (vendor claim, not independently measured here) |
| 29 | Kulkarni, Demirbas, Madeppa, Avva, Leone | Logical Physical Clocks and Consistent Snapshots in Globally Distributed Databases | paper | 2014-05 | 2026-09-05 [via extraction; mechanism corroborated by fetched CockroachDB design.md, which cites and implements it] | https://cse.buffalo.edu/tech-reports/2014-04.pdf | The HLC construction CockroachDB builds on | HLC combines the causality tracking of logical clocks with proximity to physical NTP time, so one timestamp can both order causally-related events and identify consistent snapshots |
| 30 | Kyle Kingsbury (aphyr) | The trouble with timestamps | blog | 2013-10 | 2026-09-05 [via extraction] | https://aphyr.com/posts/299-the-trouble-with-timestamps | Last-write-wins on wall-clock timestamps discards concurrent writes; skewed clocks make the discard arbitrary | Jepsen's analyses of LWW stores demonstrate acknowledged-write loss under concurrency even with synchronized clocks; with skewed clocks, the "winning" write is chosen by whichever node's clock reads later (figures vary by test and are not re-quoted here because the primary page could not be fetched in this session) |
What could not be verified in this session
- The full comment thread of golang/go#12914 (the GitHub issue UI returned only the opening post to this session's fetcher). The opening date, milestone, and acceptance labels were fetched; the proposal document carries the design argument.
- Exact merge dates for the three Linux kernel commits (the commit pages rendered without visible dates to this session's fetcher). The July 2012 dating of commits 4873fa07 and 5baefd6d is corroborated by the patch postings on kernel mailing lists surfaced in search and by contemporaneous press coverage of the 2012-06-30 leap second.
- Talk-tier sources (USENIX, YouTube, Strange Loop hosts all blocked). Named in the hunt section rather than cited.