Fixing EPA SWMM 5.2.4, One Proven Defect at a Time = Hydrocouple Review

Fixing EPA SWMM 5.2.4, One Proven Defect at a Time

The rounded-bottom bug, how far it reaches, and a fixed 5.2.4 built from the HydroCouple code review

Prepared for Robert (Bob) Dickinson · October 19, 2026

In October 2026 Caleb Buahin set an AI agent on EPA SWMM 5.2.4 and on the 5.3.0 legacy engine that OpenSWMM maintains. The resulting review (HydroCouple/swmm-code-review, posted to EPA as issue #235) holds 200 defects, 99 of which change simulation results. Every defect comes with a write-up, a minimal input file, a test that checks the right answer from first principles, and fixes for 5.3.0 and 6.0.0. It does not fix 5.2.4, the engine EPA distributes in its installer today.

Corinne Wiesner-Friedman’s video picked one of the 200: a misplaced parenthesis in the hydraulic radius of the RECT_ROUND shape, in the code since at least 2014. This document explains that bug, counts the test models it touched, and describes a fixed 5.2.4 built from the review. Every fix that can be carried onto EPA’s source is in it, and each one stays only because that defect’s own test went from failing to passing on the patched build.

Measure Result
Defects in the review 200 (99 change results)
Present in stock 5.2.4 (its test fails or crashes) 168
Fixed in 5.2.4 and proven by their own tests 126, including 71 of the 91 result-changing ones
Not carried, each with a recorded reason 42
Commits on the fixed branch 127 (126 fixes and 1 regression repair)
Regressions across all 200 tests None
EPA regression decks that use RECT_ROUND 0 of 73
Your 1729 corpus: files with a RECT_ROUND conduit 51 of 3,814 (49 under dynamic wave)
…changed by the NUM-03 fix alone 22 files, 19 distinct models; 16 by more than 10 %
…where the fix changes a warning count, or continuity by 0.5 point None (largest continuity move 0.446 point)
EPA regression decks changed by the full fix set 51 of 72 runnable; 12 by more than 10 %

2. The bug in the video (review ID NUM-03)

The geometry and the code

RECT_ROUND is a rectangle sitting on a circular-arc bottom. With the default bottom radius (Geom3 = 0) the arc radius r is half the width, so the bottom is a half circle, and ordinary flows spend most of their time inside it. For a circular segment with central angle θ = 2·acos(1 − y/r), the flow area is A = r²(θ − sin θ)/2 and the wetted perimeter is P = rθ, so the hydraulic radius is

R = A / P = (r/2) · (1 − sin θ / θ)

This is the line in EPA SWMM 5.2.4, src/solver/xsect.c line 2062, inside rect_round_getRofY():

// — find hyd. radius of circular section

theta1 = 2.0*acos(1.0 – y/xsect->rBot);

return 0.5 * xsect->rBot * (1.0 – sin(theta1)) / theta1;

The closing parenthesis comes one term too late, so the whole bracket is divided by θ and the code computes (r/2)(1 − sin θ)/θ. The fix moves one character:

return 0.5 * xsect->rBot * (1.0 – sin(theta1) / theta1);

A few lines above it, rect_round_getRofA() computes the same quantity correctly as A/P. Kinematic wave, the normal-flow limit, full-flow capacity and the NORMAL outfall all use that correct function. Only dynamic wave’s friction term, reached through getHydRad() in dwflow.c, calls the broken one. Above the round bottom both functions agree, so the error lives entirely in the lower half circle.

Figure 1. Hydraulic radius inside the round bottom of a 3 ft × 4 ft RECT_ROUND (r = 2 ft), plotted from the two formulas. The 5.2.4 value is too large near the invert, reaches zero at y = 0.29 r (0.586 ft here), and is far too small above that.

Depth y (ft) 5.2.4 R (ft) A / P (ft) Ratio Friction overstated
0.25 0.1512 0.1618 0.934 (R too large: friction understated)
0.50 0.0054 0.3136 0.017 224×
1.00 0.0640 0.5865 0.109 19×
1.50 0.1957 0.8164 0.240 6.7×
1.90 0.2959 0.9672 0.306 4.8×

Friction slope varies as R^(−4/3), so the overstatement factor is (A/P ÷ code R)^(4/3).

What it does to a model

The review’s test deck is two 500 ft RECT_ROUND 3 ft × 4 ft conduits with n = 0.013 and slope 0.001, a constant 6.24 cfs inflow, a NORMAL outfall, and dynamic wave routing for 2 hours. That is steady uniform flow, so every depth should equal Manning’s normal depth for the round bottom, 1.001 ft. It was run on EPA’s v5.2.4 source built as is, and again with only this one parenthesis moved:

Quantity (end of run) Stock 5.2.4 Fixed Normal-flow answer
Depth at J1 (ft) 1.625 1.001 1.001
Depth at J2 (ft) 1.739 1.001 1.001
Flow in C2 (cfs) 6.240 6.240 6.24
Velocity in C2 (ft/s) 1.640 2.535 2.535
Flow routing continuity error −1.513 % −1.362 % —

Figure 2. Node depths from the binary output at a 1-minute report step. Stock 5.2.4 settles 62 % above normal depth at J1 and 74 % above at J2; the fixed build settles on 1.001 ft at both.

Stock 5.2.4 holds J1 62 % above normal depth and J2 74 % above it, and the water moves 35 % slower than it should. Nothing warns. The continuity error barely moves, because continuity balances volumes and this bug lives in the momentum equation; a modeler checking continuity would see a clean run.

Switching the same deck to kinematic wave makes the point from the other side: stock 5.2.4 then gives 1.001 ft and 2.536 ft/s in both conduits, and its output file is byte-identical to the fixed build’s. The same conduit gives the right answer under one routing method and the wrong one under the other.

3. How many test models did it touch?

EPA’s, OpenSWMM’s and the review’s own decks

None of EPA’s 73 regression decks (swmm-nrtestsuite v2.5.0-dev, the set EPA’s own build checks run) contains a RECT_ROUND conduit. Built with only this one fix, 5.2.4 gives byte-identical output on all 72 decks that write an output file; the 73rd, update_v5111/ncdc_format.inp, writes none on either build. OpenSWMM’s 176 test decks do not use the shape either. Of the review’s 351 decks, the only one that does is its own NUM-03 deck.

A regression suite can only catch a bug in code it runs, and nothing in EPA’s suite runs this line. That goes a long way toward explaining how a one-character error lasted twelve years.

Bob’s 1729 corpus

Your corpus, SWMMBobSWMM6/1729-SWMM5-Models-2030 at commit 70b8f6e, holds 3,814 .inp files (3,151 distinct contents). Fifty-one of them define at least one RECT_ROUND conduit, 49 of those under dynamic wave. Some were built to exercise the shape: user1 through user5 converted to RECT_ROUND, the every-shape and all-closed-shapes variants, and extran1_rect_round. All 51 were run on stock 5.2.4 and on 5.2.4 with only the NUM-03 parenthesis moved, and compared the output files.

Outcome on stock 5.2.4 Files Distinct models
Runs; output changes with the NUM-03 fix alone 22 19
Runs; output byte-identical (RECT_ROUND conduits present, result untouched) 5 5
Does not run: input error 5.2.4 rejects (ERROR 205, 207, 209, 235, 173, 184) 19 18
Does not run: rain or tide file it names is not in the repository (ERROR 317, 361) 4 4
Longer than 5 minutes per run; not compared 1 1

Figure 6. Each of the 19 distinct corpus models the fix changes, measured as in Figure 5. Sixteen move by more than 10 % somewhere, and in 11 some element’s peak itself moves by more than 10 %. Appendix C gives the numbers, with continuity.

So yes: the corpus contains the bug’s trigger many times over. The user*_rect_round decks move by 37 to 99.5 % of some element’s own peak, Greenville (all features) by 122.5 %, and the Interceptor training model, present in three folders, by 109.1 %.

Running the corpus on 5.2.4 by itself, though, could not have found it. Every one of the 22 changed runs completes normally. The fix changes no warning count in any of them, and the flow routing continuity error moves by a median of 0.009 percentage points (at most 0.446, in user1_rect_round). Nothing in a 5.2.4 report says a depth is 55 % too high. The bug shows only against a separate answer: Manning’s normal depth, the same deck under kinematic wave, or an engine with the line fixed.

A SWMM5-against-SWMM6 comparison over the corpus would not have found it either. The review reports that OpenSWMM 6.0.0’s C++ engine ported the same line and prints the same wrong numbers (6.0.0 was not rerun for this document), so the two engines agree with each other on these models. Agreement between engines that share a formula is not evidence the formula is right.

The corpus can catch bugs like this with one addition: a reference answer for each model. Two are cheap. A uniform-flow deck, like the review’s, should give the same depth under dynamic and kinematic wave, so a gap points at the dynamic-wave path. And every corpus model can now be run against the fixed build, with attribute524.sh naming the review IDs behind any change.

4. From one bug to 168

The review sorts its 200 defects into six groups. A defect counts as present in 5.2.4 when its test fails or crashes on stock 5.2.4; the review’s own verdict table says so, and a build of stock 5.2.4 made for this work reproduced that table on all 200 tests.

Group In review Present in 5.2.4 Fixed here Not carried
Numerical (NUM) 57 52 45 7
Conceptual (CON) 23 21 14 7
Boundary conditions (BND) 19 18 12 6
Input, report and output files (IO) 62 55 43 12
Crashes and undefined behaviour (CRASH) 21 16 12 4
Toolkit API (API) 18 6 0 6
Total 200 168 126 42

Thirty-two of the 200 do not exist in 5.2.4: they are regressions introduced during 5.3.0 work, or they live in 5.3.0’s larger toolkit API. Eight run the other way. They exist only in 5.2.4, because 5.3.0 had already fixed them, so the review wrote no patch for them; those eight were ported by hand from the 5.3.0 code.

Figure 3. The 168 defects present in stock 5.2.4, by review group. Blue: fixed and proven by the defect’s own test. Gray: not carried (Appendix A lists each with its reason). The first three groups are the ones that change results: 71 of their 91 defects are fixed.

5. How the fixed 5.2.4 is built

The one rule: a fix is in the build only if its own test flips on that same build. On stock 5.2.4 the defect’s test prints FAIL or the sanitizer reports a crash; the fix stays only if, on a build of the patched tree with AddressSanitizer and UndefinedBehaviorSanitizer, the same test prints PASS. Each fix that passes becomes one git commit. Each fix that does not is reverted and written into a ledger with the reason.

Figure 4. The pipeline. Every path into the branch goes through the gate; nothing reaches the output without its own test passing.

Three stages

  • Stage 0, hand ports. The eight defects that exist only in 5.2.4 are fixed with exact-match edits copied from the 5.3.0 code (each edit insists its target text occurs exactly once, so a moved tag fails loudly instead of patching the wrong line): Preissmann slot area in the momentum equation (NUM-54), the storage-depth Newton solve using the wrong index (NUM-55), Modified Horton’s maximum infiltration volume (NUM-56), transect radii built with 1.49 instead of 1.486 (NUM-57), washoff below the runoff cutoff losing its load (NUM-58), node-only models never routed (NUM-59), and two crashes (CRASH-20, CRASH-21). They run first because some of them move 5.2.4 toward the code the review’s patches assume.
  • Stage 1, the review’s patches. Each 5.3.0 patch is applied exactly to a copy of the 5.3.0 tree it was written for, then carried into 5.2.4 by a three-way merge, so the only change carried is the patch’s own. If the line merge conflicts, a second merge compares C tokens instead of lines, because 5.3.0 was reformatted and if ( x ) versus if (x) is not a real difference. Anything still in conflict is reverted and recorded.
  • Stage 2, regression repair. The 32 tests that pass on stock 5.2.4 are rerun on the patched tree. Porting NUM-56 gave 5.2.4 a new infiltration state variable, and with it a 5.3.0 bug stock 5.2.4 never had: hot start files did not save that variable (IO-44). Stage 2 caught it and carried the review’s fix through the same gate. The run refuses to finish while any such regression remains.

What the gate caught along the way

  • A clean merge is not a fix. Several 5.3.0 patches merge into 5.2.4 without a conflict and then fail to compile, because they refer to fields or names that exist only in 5.3.0. Others could compile and still fix nothing. Only the defect’s own test decides.
  • Fuzzy patching guesses. Applying the patches with a fuzz factor was tried first and dropped, because a fuzzy patch can land a hunk in the wrong place without saying so.
  • Building 5.2.4 on Linux has three traps. Ubuntu’s gcc turns on _FORTIFY_SOURCE, and 5.2.4’s input tokenizer then aborts with “buffer overflow detected” on every model, a false alarm. gcc’s undefined-behaviour sanitizer leaves out the float-to-int overflow check unless it is named, and without it two crash tests falsely pass on stock. 5.2.4 includes omp.h, which some clang installs lack.

The proof

Check Result
Stock 5.2.4 against the review’s own 5.2.4 verdicts 200 of 200 agree (149 fail, 19 crash, 32 pass)
The 126 kept fixes, on the final tree All 126 pass
The 32 tests that pass on stock, on the final tree All 32 still pass
The 42 defects not carried, on the final tree 37 still fail, 5 still crash, as expected
Regressions None
Second run from the scripts stored in the skill, from empty folders Same ledger; byte-identical runswmm; about 6 minutes on 2 cores

6. What the full fix set changes in real decks

Running EPA’s 73 regression decks through stock 5.2.4 and the fully fixed build, and comparing every reporting period of every conduit and node against that element’s own peak:

Figure 5. Largest difference anywhere in each deck, stock 5.2.4 against the fully fixed build, measured with the corinne-testing out-diff script (every period, conduits and nodes, each normalized to its own peak in the stock run). One further deck writes no output on either build.

Twenty-one decks are byte-identical and 31 change by less than 0.1 %. Twelve change by more than 10 % somewhere: CoS-Reduced-Inlets, CoS-Reduced-Outlets, user1 through user5, Example7-Inlets, Example7-Final, events_example, catchment_as_outfall and extran8a (Appendix B gives the numbers). A large number here does not mean the fixed build is wrong; it means the deck exercises a fixed defect.

To say which defect, the skill walks the branch one commit at a time and reruns the deck after each. For EPA’s Example1, which moves up to 8.3 % of a conduit’s own peak, only two of the 127 commits change the output at all: CON-15 (at most 0.13 %) and CON-16 (up to 8.32 % of a conduit’s peak and 5.38 % of a node depth). CON-16 is the review’s finding that 5.2.4 books subarea runoff as the end-of-step rate times the time step rather than as the water that actually left. Any statement that a model “changed by X %” should name its commits the same way.

7. Using it

The work is packaged as the skill swmm5-fixed-engine, which carries every script verbatim, the pinned source revisions, and the expected numbers above so any rerun can be checked against them. The build bundle sent with this document (swmm524-fixed-build.tgz) holds the result.

Command What it does
make_fixed_swmm5.sh WORK Fetch the four pinned repositories, build and gate every fix, prove it on all 200 tests, build release engines, run the EPA deck census, export the patch series
compare524.py STOCK FIXED model.inp OUT Run one model on both engines twice each (determinism), stop at byte-identical output, otherwise report what moved and the every-period distribution
attribute524.sh FIXED_TREE model.inp OUT Walk the branch one commit (one review ID) at a time and list the commits that change the model’s output
In swmm524-fixed-build.tgz Contents
swmm524-fixed-524.bundle The fixed-524 branch on top of EPA v5.2.4 (7952ca8), 127 commits, one per review ID
patches/ The same 127 commits as patch files
ledger.tsv All 168 defects present in 5.2.4: kept, or why not
proof.txt The 200-test verdicts on the final tree
census.tsv EPA’s 73 decks, stock against fixed
runswmm-stock / runswmm-fixed Linux x86-64 command-line engines, same arguments as EPA’s (inp, rpt, out)

8. What this does not show

  • No field data. “Fixed” means the defect’s own first-principles test now passes. It does not mean any model now matches observations better.
  • The 42 defects not carried are still in the fixed build, and so is anything the review did not find.
  • Only Linux builds were tested (gcc 13.3). A Windows build of this branch through EPA’s CMake and Microsoft’s compiler has not been tried.
  • The fixes were judged by tests and byte comparisons. No person has yet reviewed the 127 commits line by line.
  • The deck census measures size of change, not direction of improvement; for each deck that question belongs to the defects its commits fix.
  • The corpus check covers SWMMBobSWMM6/1729-SWMM5-Models-2030 at commit 70b8f6e, not the older SWMMEnablement/1729-SWMM5-Models. Of its 51 RECT_ROUND files, 23 do not run on stock 5.2.4 and 1 was not compared, so the bug’s effect on those 24 is unknown.
  • The corpus numbers are the largest change anywhere in each model, isolated to NUM-03 by building 5.2.4 with that fix alone; they say nothing about the other 125 fixes in those models.

Appendix A. The 42 defects not carried

Conflict: the 5.3.0 change overlaps 5.2.4 code that differs, by line and by token. Does not compile: the merged change refers to names that exist only in 5.3.0. Test still fails: it compiled but its own test did not pass. Not applicable: it changes only 5.3.0’s command-line program. Each can be ported by hand the way the eight 5.2.4-only defects were, and must pass the same gate.

ID Outcome Defect (the review’s title)
NUM-09 Conflict A junction drained only by outlets never changes depth under dynamic wave routing
NUM-30 Conflict Pervious runoff routed to the impervious area disappears when PctZero = 100
NUM-35 Conflict An upper-zone ET fraction above 1 makes lower-zone ET negative
NUM-40 Conflict The monthly rainfall adjustment is applied when a rain record is read ahead, not in the month the rain falls
NUM-43 Conflict Temperature-based (Hargreaves) evaporation is NaN above the polar circles
NUM-44 Conflict In leap years, month/day dates for street sweeping and DAYOFYEAR rules are matched one day early
NUM-46 Conflict Pollutant left behind when a node or link dries out is counted twice in Final Stored Mass
CON-01 Test still fails The surcharge band of a closed storage unit holds water its volume never books
CON-05 Conflict The rain falling on a covered rain barrel disappears from the water balance
CON-06 Does not compile Snow plowed to another subcatchment changes volume by the ratio of the two subcatchments’ areas
CON-08 Conflict A MASS-type pollutant load at a node with no flow is booked as inflow and then thrown away
CON-14 Conflict Water released by a LID underdrain is counted as removed and as delivered, so pollutant mass is created
CON-18 Conflict The Preissmann slot area shrinks as the head rises and does not match the slot width
CON-23 Conflict A rain gage that only a control rule reads is never updated
BND-07 Does not compile A culvert on an adverse slope loses inlet control and gets it at its outlet instead
BND-08 Conflict With ponding allowed, a junction ponds at its rim and ignores its surcharge depth
BND-09 Conflict The run stops 1 s early and loses its last reporting period for many end times
BND-14 Conflict Runoff sent to a subcatchment with zero area disappears
BND-15 Conflict A negative evaporation adjustment larger than the base rate makes evaporation add water
BND-16 Conflict An evaporation time series uses the next entry’s rate when the run starts between two entries
IO-06 Conflict Values past the 40th token on an input line are dropped without a message
IO-17 Conflict Subcatchment data placed above [SUBCATCHMENTS] is lost or misapplied
IO-21 Conflict A time pattern with a missing or extra factor is accepted without a message
IO-23 Conflict A unit hydrograph group without a rain gage line is accepted and silently uses gage 0
IO-26 Conflict Wind speed from a user-prepared climate file is not converted from km/hr in SI models
IO-28 Conflict A transect is only built when an NC line or a known section header follows it
IO-30 Conflict Control-rule VARIABLE and EXPRESSION names are looked up by prefix
IO-34 Conflict Rule actions give links settings outside their valid range
IO-37 Conflict USE HOTSTART, RAINFALL and RUNOFF files must be writable to be read
IO-42 Does not compile A truncated or mismatched hot start file is applied without an error
IO-56 Does not compile The Flow Classification Summary counts time a conduit is dry as “Norm Ltd”
IO-59 Conflict Flows of 100,000 or more run into the neighbouring column of the Node Inflow Summary
CRASH-06 Conflict A SWEEP_START or SWEEP_END value of 24 or more characters overflows a stack buffer
CRASH-17 Conflict swmm_getError and swmm_getName write one byte past the caller’s buffer
CRASH-18 Conflict SMO_getSystemResult() reads into an unallocated buffer when the period is out of range
CRASH-19 Conflict The output reader dereferences a NULL handle right after testing for it
API-01 Conflict Forcing values set before swmm_start are accepted, then wiped by swmm_start
API-02 Conflict A refused out-of-order call blocks the project or aborts the run
API-12 Conflict swmm_getValue(swmm_MAXROUTESTEP) always returns the minimum routing step
API-14 Conflict Gage rainfall set through the API is ignored for a gage that shares its time series with another gage
API-16 Conflict The output reader returns another element’s results for an out-of-range index, period or attribute
API-18 Not applicable The command line programs exit with status 0 when the run fails

Appendix B. EPA decks that change by more than 10 %

Largest difference at any conduit or node in any reporting period, as a fraction of that element’s own peak in the stock run, and the largest change in any element’s peak.

Deck Largest difference Largest peak change
update_v52/CoS-Reduced-Inlets 198.7 % 35.1 %
update_v52/CoS-Reduced-Outlets 144.1 % 101.0 %
user/user1 85.9 % 70.0 %
user/user5 84.3 % 19.0 %
user/user2 65.5 % 19.5 %
user/user3 54.6 % 41.8 %
update_v52/Example7-Inlets 54.3 % 41.7 %
update_v5111/events_example 42.9 % 12.6 %
update_v52/Example7-Final 29.0 % 8.6 %
update_v5111/catchment_as_outfall 26.7 % 4.1 %
user/user4 21.5 % 10.2 %
extran/extran8a 14.2 % 14.2 %

Appendix C. Corpus models changed by the NUM-03 fix alone

SWMMBobSWMM6/1729-SWMM5-Models-2030 at commit 70b8f6e, sorted by largest difference. Largest difference and peak change are measured as in Appendix B; continuity is the flow routing continuity error from each run’s report. (×n) marks a model present as n byte-identical copies in different folders.

Model RECT_ROUND conduits Largest difference Peak change Continuity error (%), stock → fixed
Greenville_all_SWMM5_Features.inp 1 of 223 122.5 % 23.0 % 6.294 → 6.289
Exercise8_Interceptor.inp (×3) 8 of 943 109.1 % 9.1 % 0.654 → 0.642
user2_rect_round.inp 12 of 83 99.5 % 99.5 % 0.312 → 0.301
user4_rect_round.inp 12 of 209 70.7 % 43.8 % 0.036 → 0.054
user1_rect_round.inp 12 of 59 58.7 % 37.5 % -0.446 → 0.000
user5_rect_round.inp 12 of 273 55.0 % 34.6 % -2.017 → -2.027
user1_all_closed_shapes.inp 1 of 59 53.3 % 26.7 % -0.228 → -0.177
user4_all_closed_shapes.inp 1 of 209 49.4 % 23.4 % 0.059 → 0.053
user1_every_shape.inp 1 of 59 42.0 % 34.2 % -0.053 → -0.043
user3_rect_round.inp 12 of 134 37.0 % 0.9 % -0.020 → -0.008
user4_every_shape.inp 1 of 209 34.7 % 6.8 % 0.057 → 0.055
user5_every_shape.inp 1 of 273 34.2 % 18.6 % -1.914 → -1.905
user5_all_closed_shapes.inp 1 of 273 33.4 % 33.4 % -2.020 → -2.021
user2_every_shape.inp 1 of 83 18.0 % 0.3 % 0.251 → 0.250
Greenville_all_SWMM5_Features_SI_Units.inp 1 of 223 12.0 % 11.8 % 5.706 → 5.706
extran1_rect_round.inp (×2) 9 of 9 10.4 % 2.7 % -0.117 → -0.119
user2_all_closed_shapes.inp 1 of 83 8.3 % 0.2 % 0.269 → 0.268
user3_every_shape.inp 1 of 134 5.0 % 0.1 % -0.002 → -0.002
user3_all_closed_shapes.inp 1 of 134 4.9 % 1.1 % -0.012 → -0.012

Sources

Use of AI

This document, the fixed build and the skill were produced with Claude, Anthropic’s AI model, in a Claude Code session on October 19, 2026, under the direction of Robert (Bob) Dickinson, who asked for the fixed engine, the skill and this write-up, supplied Corinne Wiesner-Friedman’s post, and asked the corpus question; responsibility for the work is his. Claude found and read the review, wrote the scripts that carry the review’s 5.3.0 patches onto 5.2.4 and gate them, wrote the eight hand ports and the IO-44 repair, built and ran every engine, extracted and ran the 1729-corpus models, made the figures, and wrote this text. The defects, their tests and the 5.3.0 patches are Caleb Buahin’s review. The checks are mechanical: each fix rests on the review’s own test going from fail to pass, the final tree was run against all 200 tests, outputs were compared byte for byte or period by period, and the whole build was repeated from the stored scripts with identical results. No person has yet reviewed the 127 commits line by line, and nothing here has been compared with observed data.

Leave a Comment

Translate »
Scroll to Top