OhMyBug

Bugarium

The bugs that keep coming back

A field guide to the species of defect the hunt finds in real code changes: what goes wrong, what it is not, and who saw it first. Each page collects the stories hunters chose to publish about it.

Just hatchedTest pins a state nothing producesdiscovered by @sks24git

Hatching now

logic/correctness · 42 specieslogiccorrectness42 speciestests/ci · 32 speciestestsci32 speciesconcurrency/state · 15 speciesconcurrencystate15 speciesinput/serialization · 13 speciesinputserialization13 speciesobservability · 11 speciesobservability11 speciesconfig/deploy · 5 speciesconfigdeploy5 speciesdocumentation/contracts · 5 speciesdocumentationcontracts5 speciesothers · 5 speciesothers5 speciesnew species forming · 109 groupsIndeterminate input answered as definite · hatchingAssertion insensitive to the change · 90% of the way to a voteAtomic work committed in pieces · 90% of the way to a voteCode and schema change deployed apart · 90% of the way to a voteDoc cites line number that drifts · 90% of the way to a voteFinalisation only on one exit path · 90% of the way to a voteMarker read instead of real state · 90% of the way to a voteSuperseded work accepted as current · 90% of the way to a votenew species109 formingFix applied to one copy only · 377 sightingsFix applied to one copy onlyHand-typed copy of the rule drifts · 281 sightingsHand-typed copy of the rule driftsIndirect check misses the real property · 123 sightingsIndirect check misses the real propertyNew Member Missing From Parallel Registry · 88 sightingsNew Member Missing From Parallel RegistryShared Signal Given One Cause · 79 sightingsShared Signal Given One CauseProbe Failure Reads As No · 46 sightingsProbe Failure Reads As NoMutable Label As Identity · 40 sightingsMutable Label As IdentityBest-Effort Step Aborts Required Work · 34 sightingsBest-Effort Step Aborts Required WorkPaired case left unchanged by fix · 29 sightingsPaired case left unchanged by fixShared Helper Changed For One Caller · 27 sightingsShared Helper Changed For One CallerLimit Before Filter · 24 sightingsLimit Before FilterAssumed property the producer never guarantees · 22 sightingsAssumed property the producer never guaranteesSurface form matched instead of meaning · 22 sightingsSurface form matched instead of meaningFirst Matching Branch Drops Second Fact · 19 sightingsFirst Matching Branch Drops Second FactControl Flow Keyed On Message Text · 18 sightingsControl Flow Keyed On Message TextGuard scope exceeds the operation's scope · 18 sightingsGuard scope exceeds the operation's scopeShared data narrowed for one consumer · 18 sightingsShared data narrowed for one consumerOne fact derived in two places · 16 sightingsOne fact derived in two placesGeneric Check Fires Before Specific Error · 15 sightingsGeneric Check Fires Before Specific ErrorMissing value takes the do-nothing branch · 15 sightingsMissing value takes the do-nothing branchFailed Prerequisite Treated As Passed · 14 sightingsFailed Prerequisite Treated As PassedRejected Remembered Value Blocks Recovery · 14 sightingsRejected Remembered Value Blocks RecoveryGroup Property From One Member · 14 sightingsGroup Property From One MemberSearch window smaller than the data · 14 sightingsSearch window smaller than the dataInclusive versus exclusive end confused · 13 sightingsInclusive versus exclusive end confusedQuantity Written In Wrong Unit · 13 sightingsQuantity Written In Wrong UnitBranch guarded by an impossible condition · 12 sightingsBranch guarded by an impossible conditionEffect committed before the refusing check · 12 sightingsEffect committed before the refusing checkCheck Skipped When Field Missing · 11 sightingsCheck Skipped When Field MissingAge Measured From Now Not Event · 11 sightingsAge Measured From Now Not EventNarrow Catch Skips Promised Fallback · 11 sightingsNarrow Catch Skips Promised FallbackClear touches one copy of several · 11 sightingsClear touches one copy of severalHandler fires beyond its triggering case · 11 sightingsHandler fires beyond its triggering caseTwo Time Zones In One Flow · 9 sightingsTwo Time Zones In One FlowDead Guard By Construction · 9 sightingsDead Guard By ConstructionLimit Compared In Wrong Unit · 7 sightingsLimit Compared In Wrong UnitRemoved Call Had Hidden Dependents · 7 sightingsRemoved Call Had Hidden DependentsCatch Targets Exception Never Thrown · 6 sightingsCatch Targets Exception Never ThrownMid-lifecycle status change not handled · 5 sightingsMid-lifecycle status change not handledSettings Can Set But Never Unset · 5 sightingsSettings Can Set But Never UnsetPartial Patch Clears Omitted Fields · 4 sightingsPartial Patch Clears Omitted FieldsFailed refresh erases last known value · 3 sightingsFailed refresh erases last known valueHelpers Tested, Entry Point Untested · 469 sightingsHelpers Tested, Entry Point UntestedCondition Tested For One Outcome · 242 sightingsCondition Tested For One OutcomeGuard ships with no failing test · 135 sightingsGuard ships with no failing testTest name promises more than checked · 103 sightingsTest name promises more than checkedImplementation Stubbed Everywhere · 97 sightingsImplementation Stubbed EverywhereOnly Some Listed Cases Tested · 96 sightingsOnly Some Listed Cases TestedTest Data Too Small To Tell · 65 sightingsTest Data Too Small To TellFixture never creates the triggering condition · 64 sightingsFixture never creates the triggering conditionSelf Derived Expected Value · 54 sightingsSelf Derived Expected ValueAssertion Satisfied Elsewhere · 53 sightingsAssertion Satisfied ElsewhereTest Depends On Machine Environment · 44 sightingsTest Depends On Machine EnvironmentProducer And Consumer Never Tested Together · 41 sightingsProducer And Consumer Never Tested TogetherGuard scans less than it claims · 35 sightingsGuard scans less than it claimsTest Relies On Real Timing · 33 sightingsTest Relies On Real TimingGuard matches one spelling of many · 32 sightingsGuard matches one spelling of manySubstring Check Matches Sibling Word · 26 sightingsSubstring Check Matches Sibling WordFixture makes both branches identical · 25 sightingsFixture makes both branches identicalTest Checks Type Not Value · 22 sightingsTest Checks Type Not ValueMock Ignores Call Arguments · 21 sightingsMock Ignores Call ArgumentsTest Iterates A Hand-Copied List · 20 sightingsTest Iterates A Hand-Copied ListTest Still Expects The Old Value · 19 sightingsTest Still Expects The Old ValueTrigger filter omits the guarded files · 18 sightingsTrigger filter omits the guarded filesAbsence-Only Check Proves Nothing · 16 sightingsAbsence-Only Check Proves NothingTest Sets Flag Code Never Reads · 16 sightingsTest Sets Flag Code Never ReadsProduction default never tested · 15 sightingsProduction default never testedMock call verified, result never checked · 14 sightingsMock call verified, result never checkedRule tested on one path only · 14 sightingsRule tested on one path onlyEquality Checked In One Direction · 10 sightingsEquality Checked In One DirectionCheck passes over an empty set · 10 sightingsCheck passes over an empty setTest pins a state nothing produces · 10 sightings · just hatchedNEWTest pins a state nothing producesAssertion Cannot Fail · 8 sightingsAssertion Cannot FailMock accepts what production rejects · 7 sightingsMock accepts what production rejectsKey Omits A Dimension · 98 sightingsKey Omits A DimensionOuter timeout too short for retries · 77 sightingsOuter timeout too short for retriesMissed Cache Invalidation After Write · 72 sightingsMissed Cache Invalidation After WriteResult Mixes Reads From Different Times · 67 sightingsResult Mixes Reads From Different TimesBusy Flag Cleared Only On Success · 66 sightingsBusy Flag Cleared Only On SuccessCheck-Then-Create Race · 38 sightingsCheck-Then-Create RaceRelease After Call That Can Fail · 38 sightingsRelease After Call That Can FailGuard read outside the write's transaction · 26 sightingsGuard read outside the write's transactionTimeout Leaves Work Running · 16 sightingsTimeout Leaves Work RunningTimeout Missing On One Step · 15 sightingsTimeout Missing On One StepBusy Flag Bound To Wrong Event · 11 sightingsBusy Flag Bound To Wrong EventTimeout Read As Definite Failure · 10 sightingsTimeout Read As Definite FailureRetry repeats a too-short timeout · 6 sightingsRetry repeats a too-short timeoutTwo Clocks In One Decision · 4 sightingsTwo Clocks In One DecisionIn-flight entry recorded too late · 2 sightingsIn-flight entry recorded too lateEmpty states lose their meaning · 75 sightingsEmpty states lose their meaningMissing Field Silently Takes Default · 28 sightingsMissing Field Silently Takes DefaultGuard And Consumer Normalise Differently · 28 sightingsGuard And Consumer Normalise DifferentlyNon-Empty Mistaken For Valid · 21 sightingsNon-Empty Mistaken For ValidText escaped for the wrong context · 20 sightingsText escaped for the wrong contextCross-Field Rule Unchecked · 15 sightingsCross-Field Rule UncheckedCheck accepts forms the rule rejects · 15 sightingsCheck accepts forms the rule rejectsDelimiters counted instead of parsed · 10 sightingsDelimiters counted instead of parsedTwo ends disagree on valid forms · 8 sightingsTwo ends disagree on valid formsLocale Number Format Breaks Delimited File · 6 sightingsLocale Number Format Breaks Delimited FileNaN Comparison Passes Threshold Check · 5 sightingsNaN Comparison Passes Threshold CheckBoolean flag read by truthiness · 4 sightingsBoolean flag read by truthinessSibling endpoints return different shapes · 4 sightingsSibling endpoints return different shapesUnearned Completion Report · 87 sightingsUnearned Completion ReportTotal computed over the wrong records · 82 sightingsTotal computed over the wrong recordsMissing measurement read as zero · 77 sightingsMissing measurement read as zeroOriginal error never reaches the log · 47 sightingsOriginal error never reaches the logMetric counted at attempt, not effect · 29 sightingsMetric counted at attempt, not effectThreshold Set Without Measuring Real Traffic · 15 sightingsThreshold Set Without Measuring Real TrafficPartial result reported as complete · 15 sightingsPartial result reported as completeSilence accepted as proof of absence · 13 sightingsSilence accepted as proof of absencePartial Success Reported As Total Failure · 6 sightingsPartial Success Reported As Total FailureFrozen Metric Served As Current · 4 sightingsFrozen Metric Served As CurrentOnce-only notice repeats per replica · 3 sightingsOnce-only notice repeats per replicaAccepted Setting Silently Inert · 46 sightingsAccepted Setting Silently InertRelated Constants Defined Independently · 12 sightingsRelated Constants Defined IndependentlyNew Critical Path Lacks Kill Switch · 7 sightingsNew Critical Path Lacks Kill SwitchStored Config Read As Running Value · 5 sightingsStored Config Read As Running ValueStray file committed by blanket staging · 3 sightingsStray file committed by blanket stagingDocumented guarantee not kept by code · 1696 sightingsDocumented guarantee not kept by codeRepeated text corrected in some copies · 319 sightingsRepeated text corrected in some copiesShared error text fits one cause · 52 sightingsShared error text fits one causeHardcoded Number In User-Facing Text · 19 sightingsHardcoded Number In User-Facing TextComment lists fewer members than exist · 15 sightingsComment lists fewer members than existSecond entry point skips the check · 166 sightingsSecond entry point skips the checkOld Rows Missing New Required Field · 27 sightingsOld Rows Missing New Required FieldWhole-Record Write Without Version Check · 17 sightingsWhole-Record Write Without Version CheckLatest Failed Record Hides Valid One · 15 sightingsLatest Failed Record Hides Valid OneInternal error details sent to client · 14 sightingsInternal error details sent to client12345128SPECIES

Why the bugs look like this

Every species here was caught in a real diff. Its body tells you where it lives — its family. Its coat hints at how it bites. In each habitat the most-sighted species got the coat that matches its bite, and later relatives wear the nearest free one. Only when every face of a family is worn does a new relative share one.

Coats

logic/correctness · 42

tests/ci · 32

concurrency/state · 15

input/serialization · 13

observability · 11

config/deploy · 5

documentation/contracts · 5

others · 5

How a species is born

Every species here began as a bug nobody had named. Publish the story of your catch, and you may be one of the hunters who name the next one — the ? wedge on the map is the room left for it.

  1. Publish a story.After a hunt, two sentences: the trap, and what happened when it fired, plus the lesson. The story is what gets read, never your code.
  2. It is sorted.Each new story is filed under the species it matches, or read for its mechanism; stories that share a mechanism no species covers yet are gathered into a group.
  3. 10 catches, 10 changes.When a group holds 10 stories about 10 different code changes, five names and definitions are drafted for it.
  4. Its hunters vote.Everyone whose story is in the group has 24 hours to pick a name and a mascot no other species wears. Once every one of them has voted, it hatches at once; if nobody votes, a draw decides among the top three.
  5. It hatches.The species is published, and every hunter whose catch founded it is named on its page as a discoverer.