<!-- mobian-agent-page publisher="dailydev" canonical="https://daily.dev/posts/ongoing-by-tim-bray-un-racing-issues-8unaqlzyq" -->

---
title: ongoing by Tim Bray · Un-Racing Issues | daily.dev
description: Tim Bray recounts fixing a nasty data race in his Quamina Go library, detailing a detour through Erlang-style channel accumulators, a misleading unit test that...
canonical: https://daily.dev/posts/ongoing-by-tim-bray-un-racing-issues-8unaqlzyq
twitter:card: summary_large_image
twitter:site: @dailydotdev
og:type: website
og:site_name: daily.dev
og:title: ongoing by Tim Bray · Un-Racing Issues | daily.dev
og:description: Tim Bray recounts fixing a nasty data race in his Quamina Go library, detailing a detour through Erlang-style channel accumulators, a misleading unit test that...
og:url: https://daily.dev/posts/ongoing-by-tim-bray-un-racing-issues-8unaqlzyq
og:image: https://api.daily.dev/og/posts/8uNAQlzYQ.png
og:image:alt: ongoing by Tim Bray · Un-Racing Issues
og:image:width: 1200
og:image:height: 630
og:locale: en
---

> ## Documentation Index
> Fetch the complete documentation index at: https://daily.dev/llms.txt
> Use this file to discover all available pages before exploring further.

# ongoing by Tim Bray · Un-Racing Issues

**[ongoing by Tim Bray](https://daily.dev/sources/tbray)** · 5 min read · 1 upvotes · 2 comments

## Summary

Tim Bray recounts fixing a nasty data race in his Quamina Go library, detailing a detour through Erlang-style channel accumulators, a misleading unit test that masked the real performance cause, and lessons about trusting profilers. He also reflects on his decision to stop accepting Claude-authored PRs going forward, citing discomfort with AI's externalities and his own inability to fully trust or understand a chunk of AI-generated code already merged into the project, while still accepting AI-found vulnerability reports.

## Full article

daily.dev links to this article rather than hosting it. Read it at the original source: <https://www.tbray.org/ongoing/When/202x/2026/09/01/Un-Racing>

## Questions this post answers

### Why did my Go concurrency unit test make read and write goroutines run the same number of operations but finish at very different speeds?

Read-only operations can run far faster than update operations (in one case twenty times faster), so if a test runs equal iteration counts on both without synchronization, the read thread finishes almost instantly while the write thread keeps running alone. This can cause misleading performance symptoms, such as a stream of adds and deletes with no interleaved reads producing bloated, slow-to-match NFA structures, which then shows up incorrectly as a mutex contention problem in profiling.

_Developers chasing concurrency test flakiness can find debugging writeups like this on daily.dev._

### Should I keep accepting AI-generated pull requests for my open source project?

One long-time open source maintainer decided to stop accepting Claude-authored pull requests going forward, despite acknowledging that AI models write decent code and are good at finding vulnerabilities, because he no longer trusts or fully understands a roughly 500-line chunk of AI-generated code and tests computing epsilon closures for NFAs that had passed his own review. He still accepts AI-found vulnerability reports as an exception, having used a Claude scan that surfaced 14 issues of varying severity.

_Maintainers weighing AI contributions against code trust follow debates like this on daily.dev._

## Community discussion

Top comments from developers on daily.dev.

**@agustinbarrientos** · 0 upvotes

> Try asserting that both goroutines remain active during the contested phase. Equal operation counts can still hide unequal lifetimes. I'd also record each goroutine's active duration so the imbalance is visible without reading the profiler.

**@leonidbugaev** · 0 upvotes

> The equal-count goroutines are the part I'd have trusted too. Readers finished 20x faster so the writers were just hammering adds and deletes, and the profiler was honestly talking about that bloated NFA, not the mutexes.

## Similar posts on daily.dev

- [Review the actual change, not the file list](https://daily.dev/posts/review-the-actual-change-not-the-file-list-vqdenkeyp) · Medium · 0 upvotes · 0 comments

---

Tags: [#testing](https://daily.dev/tags/testing), [#golang](https://daily.dev/tags/golang), [#ai-coding](https://daily.dev/tags/ai-coding)

[View this post on daily.dev](https://daily.dev/posts/ongoing-by-tim-bray-un-racing-issues-8unaqlzyq)

```json
{"@context":"https://schema.org","@graph":[{"@type":"Organization","@id":"https://daily.dev/#organization","name":"daily.dev","url":"https://daily.dev","logo":{"@type":"ImageObject","url":"https://daily.dev/apple-touch-icon.png","width":180,"height":180},"sameAs":["https://twitter.com/dailydotdev","https://github.com/dailydotdev","https://www.linkedin.com/company/daily-dev-ltd"]},{"@type":"WebSite","@id":"https://daily.dev/#website","url":"https://daily.dev","name":"daily.dev","publisher":{"@id":"https://daily.dev/#organization"},"potentialAction":{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https://daily.dev/search?q={search_term_string}"},"query-input":"required name=search_term_string"}}]}
{"@context":"https://schema.org","@type":"TechArticle","headline":"ongoing by Tim Bray · Un-Racing Issues","url":"https://daily.dev/posts/ongoing-by-tim-bray-un-racing-issues-8unaqlzyq","mainEntityOfPage":{"@type":"WebPage","@id":"https://daily.dev/posts/ongoing-by-tim-bray-un-racing-issues-8unaqlzyq"},"datePublished":"2026-09-02T00:09:51.136Z","dateModified":"2026-09-02T00:16:55.546Z","description":"Tim Bray recounts fixing a nasty data race in his Quamina Go library, detailing a detour through Erlang-style channel accumulators, a misleading unit test that...","image":"https://media.daily.dev/image/upload/s--foaA6JGU--/f_auto/v1722860399/public/Placeholder%2004","thumbnailUrl":"https://media.daily.dev/image/upload/s--foaA6JGU--/f_auto/v1722860399/public/Placeholder%2004","isAccessibleForFree":true,"articleSection":"ongoing by Tim Bray","inLanguage":"en","publisher":{"@type":"Organization","name":"daily.dev","url":"https://daily.dev","logo":{"@type":"ImageObject","url":"https://daily.dev/apple-touch-icon.png","width":180,"height":180}},"author":{"@type":"Organization","name":"ongoing by Tim Bray","logo":"https://media.daily.dev/image/upload/logos/placeholder.jpg","url":"https://daily.dev/sources/tbray"},"commentCount":2,"discussionUrl":"https://daily.dev/posts/ongoing-by-tim-bray-un-racing-issues-8unaqlzyq","interactionStatistic":[{"@type":"InteractionCounter","interactionType":{"@type":"LikeAction"},"userInteractionCount":1},{"@type":"InteractionCounter","interactionType":{"@type":"CommentAction"},"userInteractionCount":2}],"keywords":"testing,golang,ai-coding","timeRequired":"PT5M"}
{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https://daily.dev"},{"@type":"ListItem","position":2,"name":"ongoing by Tim Bray","item":"https://daily.dev/sources/tbray"},{"@type":"ListItem","position":3,"name":"ongoing by Tim Bray · Un-Racing Issues"}]}
{"@context":"https://schema.org","@type":"WebPage","@id":"https://daily.dev/posts/ongoing-by-tim-bray-un-racing-issues-8unaqlzyq","comment":[{"@type":"Comment","text":"Try asserting that both goroutines remain active during the contested phase. Equal operation counts can still hide unequal lifetimes. I’d also record each goroutine’s active duration so the imbalance is visible without reading the profiler.","datePublished":"2026-09-03T21:24:26.517Z","url":"https://daily.dev/posts/8uNAQlzYQ#c-em0HlUCxl","author":{"@type":"Person","name":"Agustin Barrientos","url":"https://daily.dev/agustinbarrientos","image":"https://media.daily.dev/image/upload/s--5ayxQnqn--/f_auto/v1788281802/avatars/avatar_wQYYVe5Tbj0NJ7C7qPoa8?_a=BAMAMicg0"}},{"@type":"Comment","text":"The equal-count goroutines are the part I’d have trusted too. Readers finished 20x faster so the writers were just hammering adds and deletes, and the profiler was honestly talking about that bloated NFA, not the mutexes.","datePublished":"2026-09-02T07:00:20.161Z","url":"https://daily.dev/posts/8uNAQlzYQ#c-dg0UHfHwA","author":{"@type":"Person","name":"Leonid Bugaev","url":"https://daily.dev/leonidbugaev","image":"https://lh3.googleusercontent.com/a/ACg8ocLhMgurwTmJElWaH9A8Ju8cHvZxgMCDt009jEYkmFCyUGAoaGSw=s96-c"}}]}
{"@context":"https://schema.org","@type":"FAQPage","@id":"https://daily.dev/posts/ongoing-by-tim-bray-un-racing-issues-8unaqlzyq#faq","mainEntity":[{"@type":"Question","name":"Why did my Go concurrency unit test make read and write goroutines run the same number of operations but finish at very different speeds?","acceptedAnswer":{"@type":"Answer","text":"Read-only operations can run far faster than update operations (in one case twenty times faster), so if a test runs equal iteration counts on both without synchronization, the read thread finishes almost instantly while the write thread keeps running alone. This can cause misleading performance symptoms, such as a stream of adds and deletes with no interleaved reads producing bloated, slow-to-match NFA structures, which then shows up incorrectly as a mutex contention problem in profiling. Developers chasing concurrency test flakiness can find debugging writeups like this on daily.dev."}},{"@type":"Question","name":"Should I keep accepting AI-generated pull requests for my open source project?","acceptedAnswer":{"@type":"Answer","text":"One long-time open source maintainer decided to stop accepting Claude-authored pull requests going forward, despite acknowledging that AI models write decent code and are good at finding vulnerabilities, because he no longer trusts or fully understands a roughly 500-line chunk of AI-generated code and tests computing epsilon closures for NFAs that had passed his own review. He still accepts AI-found vulnerability reports as an exception, having used a Claude scan that surfaced 14 issues of varying severity. Maintainers weighing AI contributions against code trust follow debates like this on daily.dev."}}]}
```

