180 corrections logged · most recent September 25, 2026
When we publish a number that turns out to be wrong, we record it here: what it was,
who it affected, how far off it was, how we caught it, and the check that now stops
it happening again. Entries are not edited to look better afterwards and are not
deleted once fixed.
Every error below was found and fixed by us rather than reported by a reader, which
is how it should work — but if you spot something wrong,
please tell us. See our
methodology for where each figure comes from.
The decimal to fraction calculator gave a wrong fraction for every decimal above 1, and other fraction pages mishandled signs and zero denominators
How far off: 1.5: 5/2 shown, 3/2 correct. −2 1/3: −1.6667 shown, −2.3333 correct.
What went wrong
The decimal to fraction calculator converted the whole value and then added the whole number a second time, so 1.5 showed 5/2 instead of 3/2 and 2.25 showed 17/4 instead of 9/4; its 'GCD used' row always showed 1, and a ±0.0001 tolerance turned 0.3334 into 1/3. The fraction to decimal calculator treated a negative mixed number as the whole plus the fraction (−2 1/3 showed −1.6667 instead of −2.3333), replaced a zero denominator with 1, and called some terminating decimals repeating. The fraction calculator dropped the minus from a negative denominator (1/2 + 1/−4 showed 3/4 instead of −1/4), and the mixed fraction calculator replaced a zero denominator with 1 (2 1/0 + 1 1/3 showed 4 1/3).
Who it affected
Anyone converting a decimal above 1 got a wrong fraction, off by exactly the whole-number part. Negative and zero-denominator entries gave wrong answers instead of an error.
How we found it
Stage 3c: the four pages were moved onto one engine and every old result compared with it over a grid of inputs.
What we changed
All four pages use src/calculators/fractions.ts: exact conversion of the digits typed, lowest terms by gcd, signs by a/(−b) = −(a/b), and division by zero refused with a message.
What stops it recurring
tests/engines/fractions.test.ts pins the conversions, signs, repeating blocks and zero cases; tests/retired-claims.test.ts fails the build if the old examples return.
The percentage calculator reported changes from a negative starting value in the wrong direction; several percent examples were off
How far off: −10 → −5: '50% decrease' shown, 50% increase correct. $109,632 shown, $109,622 correct.
What went wrong
The percentage calculator's percent-change mode divided by the signed old value, so −10 → −5 showed as a 50% decrease (it is a 50% increase). The percent change page said $50,000 growing 17% a year for five years reaches $109,632 (it is $109,622); the percent increase page said a 22% APR balance compounding monthly doubles in 3.3 years (about 3.2, 38 months); the proportion page's 1:8 mixing example was really 1:7, and the proportion calculator returned 0 for a zero denominator instead of refusing it.
Who it affected
Changes from negative values carried the wrong sign and label; the size was right. The other figures were small arithmetic slips.
How we found it
Stage 3c: the six percent pages were moved onto one engine and their typed figures recomputed.
What we changed
src/calculators/percent.ts divides by the absolute old (or accepted) value, returns no result for a division by zero, and computes every example on the pages.
The GPA calculator gave AP and honors bonuses to an F, and grade letters could disagree with the percentage shown
How far off: A (3 credits) plus AP F (4 credits): 2.29 shown, 1.71 correct. Default weighted categories without Homework: 45.00% shown, 56.25% correct.
What went wrong
In high-school mode an F in an honors or AP class scored 0.5 or 1.0 grade points instead of 0.0, although the page's own table showed 0.0, and a straight-A 4.0 showed 'A+'. On all four pages the letter came from the unrounded figure, so 90.00% could be labelled B+ or 80.00% C+. The weighted grade calculator showed points earned instead of the weighted average when the weights did not add to 100%, although the page said it normalised them, and scored a blank grade as zero. Article figures were also off (82.25% called 'comfortably in the B range', a B−; 78% for 77.5%; a 15-point swing that is 17.5).
Who it affected
GPAs that included a failed weighted course were overstated; weighted averages with missing categories were understated.
How we found it
Stage 3c: the four pages were moved onto one engine and every old result compared with it.
What we changed
src/calculators/grades.ts computes GPA, weighted averages and needed scores; the letter follows the figure shown; the 4.0 scale and honors/AP bonuses are labelled as a common convention your school's scale overrides.
What stops it recurring
tests/engines/grades.test.ts tests every letter cut-off at the boundary; tests/retired-claims.test.ts.
The Little League age calculator listed the wrong division ages
How far off: Tee Ball: 4-6 shown, 4-7 per Little League. Major: 10-12 shown, 9-12.
What went wrong
Little League's published ranges (littleleague.org, League Age Determination) put Tee Ball at league ages 4-7 and the Major Division at 9-12 (a local league may narrow it); the page showed 4-6 and 10-12, and a separate 'Coach Pitch' division for 5-8, which is a Minor League option. Two worked examples were wrong: a player turning 10 on March 1, 2026 is league age 10 for 2026, not 9.
Who it affected
A league-age-9 player was not shown as Major-eligible and a league-age-7 player not as Tee Ball-eligible. League ages themselves were always right.
How we found it
Stage 3c: the calculator was moved onto an engine and Little League's own page read on 2026-09-25.
What we changed
src/calculators/date-math.ts holds the August 31 determination date and Little League's division ranges.
What stops it recurring
tests/engines/date-math.test.ts pins the determination date and the division boundaries; tests/retired-claims.test.ts.
Pages affected
/little-league-age-calculator
The age calculators could show a negative number of days for birthdays on the 30th or 31st
How far off: 690 of 16,884 date pairs changed, all births on the 29th-31st.
What went wrong
When a month was too short for the birth day, the day count borrowed from it: born January 31, on March 1 of a common year, the pages showed '1 years, 1 months, -2 days'. The chronological age calculator's total hours was one hour off in daylight-saving zones when the span crossed a clock change. The age page said full Social Security retirement age is 67 for those born 'after 1960' (it is 1960 or later) and gave 4.345 weeks a month (the Gregorian average is 4.348).
Who it affected
Readers born on the 29th to 31st could see an impossible negative day count; years, total days and the birthday countdown were never affected.
How we found it
Stage 3c: the pages were moved onto a date engine and every old result compared with it.
What we changed
src/calculators/date-math.ts counts a month complete on the 1st of the next month when the month is too short (the pages' existing February 29 rule), counts days with the site's DST-safe helpers, and takes total hours as calendar days × 24.
What stops it recurring
tests/engines/date-math.test.ts pins the month-end rule and the DST cases; tests/day-counts.test.ts; tests/retired-claims.test.ts.
Pages affected
/age-calculator, /chronological-age-calculator
The gas mileage and trip calculators priced gasoline at an undated $3.50, about 22% below EIA's current figure
How far off: $3.50 shown, $4.478 per EIA (week of September 21, 2026); West Coast $4.20-4.80 shown, $5.600.
What went wrong
Both pages used $3.50 a gallon, with no date or source, as the default and in their examples and tables, and the trip page's regional table was typed. EIA's U.S. regular retail average for the week of September 21, 2026 was $4.478, and every region was higher than shown. The gas page said the U.S. fleet averages about 25 MPG (EPA: about 22.2) and listed a dirty air filter as a cause of falling MPG, which fueleconomy.gov says it is not for modern fuel-injected cars. The trip calculator treated a blank or zero MPG as 1 MPG and subtracted negative entries.
Who it affected
Example fuel costs were about 22% low; a blank MPG on the trip page turned 123 miles into 123 gallons.
How we found it
Stage 3c: the pages were moved onto an engine and their figures checked against EIA.
What we changed
Prices come from EIA's weekly update with their week shown (src/data/calculators/gas-mileage.ts, registered in provenance with a re-verify date); src/calculators/fuel.ts computes costs and asks for an MPG instead of assuming one.
What stops it recurring
tests/engines/fuel.test.ts; verify:data fails the build once the EIA prices pass their re-verify date; tests/retired-claims.test.ts.
Pages affected
/gas-mileage-calculator, /trip-calculator
The watts-amps-volts calculator suggested undersized wire with no breaker
How far off: 1,500 W at 120 V (12.5 A): 16 AWG suggested; the NEC's small-conductor rule puts 14 AWG copper on a 15 A breaker at minimum.
What went wrong
The wire recommendation suggested 16 or 18 AWG with no breaker for any current up to 13 A (for example 16 AWG for a 1,500 W heater at 120 V), and the gauge table paired 1/0 AWG copper with a 200 A service; neither had a source. Ohm's-law mode also paired a zero or negative entry with another value and ignored the resistance or power the reader had entered.
Who it affected
A reader could take the suggestion as a safe wire size for a heater circuit.
How we found it
Stage 3c: the calculator was moved onto an engine and every typed figure checked.
What we changed
The recommendation gives only the National Electrical Code's small copper conductor limits (14/12/10 AWG on 15/20/30 A breakers), labelled as a model code, and sends larger circuits to an electrician; src/calculators/ohms-law.ts uses only positive entries.
Minor: figures on the mean, Pythagorean theorem and loam pages
How far off: SD 11.4 shown, 10.6 correct; 22 bags shown, 21 correct.
What went wrong
The mean page's worked example gave the standard deviation of its test scores as about 11.4; by its own population formula it is 10.6 (sample: 11.3, NIST/SEMATECH e-Handbook). The Pythagorean page described OSHA's ladder rule as 1 foot out per 4 feet of height; 29 CFR 1926.1053(b)(5)(i) sets it at about a quarter of the ladder's working length. It also called rational results such as 1.5-2-2.5 'irrational'. The loam calculator rounded up floating-point noise (15.75 cu ft showed 22 bags of 0.75 cu ft instead of 21) and said loam is by definition 40% sand, 40% silt and 20% clay, one point inside the USDA texture class.
Who it affected
Small: a worked example, a misstated rule and occasional one-bag overcounts.
How we found it
Stage 3c: the pages were moved onto engines and their typed figures recomputed.
What we changed
src/calculators/stats.ts, triangle.ts and topsoil.ts compute the figures; the OSHA rule is quoted from the regulation.
Minor: the time duration calculator ignored 'next day' for later end times; a time-to-decimal example misadded
How far off: 9:00 to 17:30 next day: 8h 30m shown, 32h 30m correct.
What went wrong
With 'End time is next day' ticked and an end time later than the start (9:00 to 17:30), the time duration calculator showed 8h 30m while saying the span crossed midnight; it is 32h 30m. The page said 1.5× overtime applies over 40 hours 'in most states' (it is the federal FLSA rule) and called five 7.5-hour days a 40-hour week (37.5). A time-to-decimal example added four shifts as '39 hours 60 minutes' (38 hours and 120 minutes; the 40-hour total was right).
Who it affected
Small: one checkbox case and text figures.
How we found it
Stage 3c: the pages were moved onto a clock-time engine.
What we changed
src/calculators/clock-time.ts adds the day when asked; the overtime rule is quoted from the Department of Labor.
The concrete block calculator's project table was about 20% low, and the concrete bag FAQ's bag counts were 24-35% low
How far off: 24 × 24 × 8 ft garage: 770 blocks shown, 951 at the page's own rate with 10% waste. 10 ft³: 22/16/13/12 bags shown, 34/23/17/15 correct; 10 yd³: about 700 shown, 450 of the 80 lb bags.
What went wrong
The block page's 'Block counts for common projects' table said its counts included a 10% waste factor, but they were one block per square foot of wall with no waste, and its mortar figures were low to match (a 30 × 8 ft wall of 270 blocks was said to need about 8 bags of mortar; at the page's own 27 blocks a bag it is 10, 11 with waste). The bag page's FAQ said 10 cubic feet takes 22 of the 40 lb bags, 16 of the 60 lb, 13 of the 80 lb or 12 of the 90 lb, put 10 cubic yards at about 700 bags, and worked a fence post hole only 4 inches deep. Both calculators also rounded up one unit too many whenever the count came to an exact whole number (a floating-point artefact), and the bag page's Project Type selector had no effect, so post holes were computed as slabs.
Who it affected
A reader ordering from the table or FAQ would have run short: about a fifth of the blocks, or up to a third of the bags.
How we found it
Stage 3b: the calculators were moved onto an engine and every old result and typed figure compared with it.
What we changed
Counts come from src/calculators/concrete.ts. Bag yields and block rates are named constants labelled as typical label figures; the reader's bag governs. Post holes now compute as cylinders. Typed prices are gone; the reader enters them.
What stops it recurring
tests/engines/concrete.test.ts pins the counts, including exact whole-number boundaries; tests/retired-claims.test.ts fails the build if the old figures return.
The BTU calculator sized air conditioners from an unsourced rule and misstated the federal efficiency minimums
How far off: A 1,200 sq ft room: 26,000 BTU/h (30,000 recommended) shown, 23,000 on ENERGY STAR's chart.
What went wrong
Cooling was sized from a 20 BTU-per-square-foot rule with climate, insulation, ceiling and window multipliers that have no official source, and heating mode added cooling adjustments (sun, extra occupants, a kitchen) to a heating load. The page gave the 2023 federal minimums as 'SEER 14 (South) / 15 (North & Southwest)'; under 10 CFR 430.32 they are 13.4 SEER2 nationally and 14.3 SEER2 in the Southeast and Southwest. It also said SEER 14 to 18 saves about 25% (22%), that a 12 × 12 kitchen needs 8,000 BTU (ENERGY STAR: 9,000), that window units are all under a ton (ENERGY STAR's chart runs to 34,000 BTU/h), and that 1 hp is 2,545 BTU/h (2,544).
Who it affected
Most cooling results changed; some rooms were oversized, which ENERGY STAR warns makes a room cold and damp.
How we found it
Stage 3b: the calculator was moved onto an engine pinned to every row of ENERGY STAR's chart.
What we changed
Cooling follows ENERGY STAR's room air conditioner chart and its four adjustments (src/calculators/cooling.ts); heating keeps a trade rule of thumb, labelled as an illustration.
What stops it recurring
tests/engines/cooling.test.ts pins all 14 chart rows and the adjustments; tests/retired-claims.test.ts fails the build if the old rule or minimums return.
Pages affected
/btu-calculator
The electricity cost calculator's prices and average use had no source, and its annual cost used a 360-day year
How far off: Hawaii: 35¢ shown, 48.00¢ per EIA (July 2026). Annual cost: 360 days instead of 365.
What went wrong
The page's state price table, its 'US average $0.16/kWh', '850 kWh' average household use and '$0.10–0.35/kWh typical' range had no source. EIA's Electric Power Monthly (Table 5.6.A, July 2026, preliminary) puts the U.S. residential average at 18.31¢ and every state listed higher than shown, with Hawaii at 48.00¢; EIA gives 899 kWh a month (2022). The annual cost multiplied a 30-day month by 12.
Who it affected
Readers who kept the default rate or compared with the table underestimated their bill; every annual figure was 1.4% low.
How we found it
Stage 3b: the calculator was moved onto an engine and its figures checked against EIA.
What we changed
Prices for every state come from EIA Table 5.6.A with the month shown beside them (src/data/calculators/electricity.ts, registered in provenance with a re-verify date); annual cost uses 365 days (src/calculators/electric-cost.ts).
What stops it recurring
tests/engines/electric-cost.test.ts; verify:data fails the build once the EIA figures pass their re-verify date; tests/retired-claims.test.ts fails it if the old figures return.
Pages affected
/electricity-calculator
The voltage drop calculator understated drop on short runs and at 240 V
How far off: 50 ft of 12 AWG copper, 15 A, 120 V: 'a fraction of a percent' stated, 2.4% per NIST.
What went wrong
An FAQ said that on runs under about 50 feet the drop is 'usually a fraction of a percent'; by NIST's copper wire tables (NBS Handbook 100), 50 ft of 12 AWG copper at 15 A and 120 V drops 2.9 V, 2.4%. The page said the same load at 240 V has half the percentage drop; for the same wattage it is a quarter. The calculator used typed K constants of 12.9 (copper) and 21.2 (aluminum).
Who it affected
The FAQ understated a common case several-fold. The calculator's own results were 2.2% (copper) and 3.1% (aluminum) higher than NIST's resistance gives; 38 of 27,648 grid inputs change from 'over 3%' to 'within 3%'.
How we found it
Stage 3b: the calculator was moved onto an engine using NIST Handbooks 100 and 109.
What we changed
Resistance comes from NIST Handbook 100 (copper, 75 °C) and Handbook 109 (aluminum) in src/calculators/voltage-drop.ts; the 3% figure is labelled as the NEC's suggestion in a model code.
What stops it recurring
tests/engines/voltage-drop.test.ts pins the handbook values; tests/retired-claims.test.ts fails the build if the old claims return.
Pages affected
/voltage-drop-calculator
The roofing calculator made hip roofs 5% larger and gambrels 10% larger than their geometry
How far off: Default 40 × 30 ft house with 1 ft overhangs at 6/12: hip roof 1,578 sq ft shown, 1,503 by geometry.
What went wrong
Fixed 'shape factors' added 5% for hip roofs and 10% for gambrels. A roof whose planes all share one pitch has the same area as a gable of that pitch, footprint × √(1 + (rise/12)²); a gambrel has two pitches and no single multiplier. The ridge-cap count came from an input labelled 'Perimeter', a flat roof showed a multiplier it did not apply, and the multiplier was rounded to three decimals.
Who it affected
Hip-roof estimates, and every quantity and cost built on them, were 5% high.
How we found it
Stage 3b: the calculator was moved onto an engine and its geometry worked by hand.
What we changed
Area is plane geometry in src/calculators/roof.ts. The gambrel option is removed, the ridge input is 'Ridge + hip', and packaging figures are labelled as typical; prices are the reader's own.
What stops it recurring
tests/engines/roof.test.ts pins the geometry (3-4-5 and 5-12-13 triangles, 12/12 = √2); tests/retired-claims.test.ts fails the build if the shape factors return.
Pages affected
/roofing-calculator
The stair calculator failed code-compliant stairs and misstated the IRC's landing and handrail rules
How far off: 210 of 1,120 grid cases failed wrongly (e.g. an 18 in rise at a 7 in target: three 6 in risers on 11 in treads flagged).
What went wrong
The code check failed stairs that met the IRC's riser and tread limits whenever the actual riser was half an inch or more from the target (the IRC has no such rule), and a rise under half the target gave 0 risers and a riser height that could not be computed. The page said stairs over 12 feet need a landing 'at the midpoint'; the 2024 IRC (R318.7.3) limits a flight to 12 feet 7 inches (151 in) with no midpoint rule. It said stairs over 30 inches need handrails; the IRC requires them on flights with four or more risers (R318.7.8). The worked example's angle was 35.1°; arctan(108/154) is 35.0°.
Who it affected
Readers with a compliant design could be told it failed; the landing and handrail guidance did not match the model code.
How we found it
Stage 3b: the calculator was moved onto an engine and the IRC's stairway section read on codes.iccsafe.org (2024 and 2021 editions).
What we changed
src/calculators/stairs.ts checks the riser and tread limits and flags flights over 151 in; the IRC's figures are quoted from the 2024 edition and labelled as a model code that local codes adopt with amendments.
What stops it recurring
tests/engines/stairs.test.ts pins the IRC figures and the 151-inch boundary; tests/retired-claims.test.ts fails the build if the old rules return.
Pages affected
/stair-calculator
The flooring calculator added the waste allowance twice in its cost tab
How far off: A 168 sq ft room at 10%: costed as 203 sq ft of material and 185 sq ft of labor instead of 185 and 168.
What went wrong
The Cost tab took its floor area from the Area tab's order total, which already included the waste allowance, then added the allowance again and charged labor on the inflated area. Tile and box counts could also round up one too many when area × waste landed on a whole number, and the waste FAQ said 15% for complex layouts where the page and calculator used 5%.
Who it affected
Material and labor costs were overstated.
How we found it
Stage 3b: the calculator was moved onto engines and every old result compared with the new one.
What we changed
src/calculators/coverage.ts applies waste once; typed prices are removed and the Cost tab uses only the reader's prices.
The wallpaper calculator counted the trimmed pattern repeat as wall covered, and could under-order
How far off: A 12 × 14 ft room, 8 ft walls, 12 in repeat: 46.1 sq ft a roll and 10 rolls shown, 41.0 and 11 correct; counts rose by up to 8 rolls on the test grid and never fell.
What went wrong
With a pattern repeat, 'usable per roll' counted the repeat allowance trimmed off every strip as wall covered. A wall taller than one roll showed no usable roll count at all. The worked example and FAQs used 30–40 sq ft usable per single roll, a figure the calculator never used, and one step said 420 ÷ 38 = 11 (11.05, so 12).
Who it affected
Readers with patterned paper could order too few rolls.
How we found it
Stage 3b: the calculator was moved onto an engine and every old result compared with the new one.
What we changed
src/calculators/coverage.ts cuts each strip one repeat longer and counts only the wall it covers; the FAQs show the calculator's own results.
The board foot calculator undercounted lumber thinner than 1 inch
How far off: A 3/4 in × 12 in × 1 ft board: 0.75 board feet shown, 1.00 per the Wood Handbook (up to four times too low at 1/4 in).
What went wrong
The calculator counted lumber thinner than 1 inch at its actual thickness; the USDA Forest Products Laboratory's Wood Handbook (FPL-GTR-282, 2021, glossary) counts lumber under 1 inch nominal as 1 inch. The page also said an 8-foot 2×4 covers 4 sq ft; at its nominal 4-inch width it covers 2.67 sq ft.
Who it affected
Thin stock was priced by the board foot at a fraction of the trade count.
How we found it
Stage 3b: the Wood Handbook was read while moving the calculator onto an engine.
What we changed
Board feet come from src/calculators/lumber.ts, which the cubic yard page now shares.
Minor: rounded unit factors and text figures on the paint, square footage, cubic yard, asphalt, mulch and roof pitch pages
How far off: Conversions: under 0.01%. Asphalt table: 5% low (18.2 tons shown for 1,000 sq ft at 3 in, 19.0 with the factor). Roof pitch: 1 in 6 read 'Low slope' (it is 2/12).
What went wrong
Paint FAQs did not match the page's own coverage (a table note said 1 door where it subtracts 2; a ceiling added half a gallon where the purchase rises by one; two coats on a 10 × 10 ceiling are 0.57 gallons; primer for a 2-gallon room is 1.2-1.8 gallons, not 1). The square footage and cubic yard pages used rounded conversion factors (1,000 sq ft showed 111.10 sq yd; 1,000 m³ showed 999.999), and a square footage FAQ said two coats on a 12 × 15 ft room need 2 gallons (2.18). The asphalt table was captioned as including a 5% factor it lacked, and an FAQ said 4-6 inches doubles the tonnage of a 3-inch job (a third more at 4 in). The mulch page advised 3-4 inches for weed control; University of Maryland Extension says one to three inches. The roof pitch category used the raw rise instead of rise per 12, so runs other than 12 gave the wrong band.
Who it affected
Small in each case: text figures, the last digit of conversions, or a category label; the calculators' main results were right apart from the rounding.
How we found it
Stage 3b: each calculator was moved onto an engine and its typed figures recomputed.
What we changed
Conversions use NIST's exact definitions (src/calculators/units.ts); the other figures are computed from the engines or cited.
The TDEE calculator's calorie floor could set a target above maintenance, and several page figures were off
How far off: An 80-year-old woman, 4 ft 10 in, 90 lb, sedentary: told 1,200 a day to maintain against a TDEE of 922 (278 too many). 13,416 of 95,040 inputs on a test grid were affected; rounded unit factors put a figure 1 off in 298 more.
What went wrong
The calculator applied its 1,200-calorie (women) and 1,500-calorie (men) floor to every goal, not just weight loss, so for smaller or older users it set a target above their own maintenance figure, even on 'Maintain'; when the floor cut a loss goal it still showed the full deficit and weekly loss. On the page, the worked example was 3 calories off the calculator's own answer, an example woman's TDEE was given as about 1,650 (the equation gives 1,554), the pace advice contradicted CDC's 1 to 2 pounds a week, and an FAQ said FDA allows a ±20% calorie margin on labels, where 21 CFR 101.9(g)(5) sets only an upper limit.
Who it affected
Readers whose maintenance fell below the floor were told to eat more than maintenance while 'losing' or 'maintaining', and some saw a deficit and weekly loss the target did not deliver.
How we found it
Stage 3a-2: the calculator was moved onto an engine and every old result compared with the new one.
What we changed
The arithmetic lives in src/calculators/energy.ts. The floor now applies only to loss goals, never raises a target above TDEE, shows the deficit actually applied and says when it kicked in. Page figures are computed from the engine; the 3,500-calories-a-pound rule is labelled as a rule of thumb that overstates loss over time (NIDDK research, Hall et al., 2011).
What stops it recurring
tests/engines/energy.test.ts pins the floor boundaries and the page's worked example; tests/retired-claims.test.ts fails the build if the old figures return.
Pages affected
/tdee-calculator
The body fat calculator gave an Army pass or fail on a tape method the Army replaced in 2023
How far off: A man at 13.3% was labelled 'Fitness' where the American Council on Exercise chart lists 13% as 'Athletes' (about 4% of the tape grid); the BMI-based figure moved by at most 0.1 point.
What went wrong
The 'Army ABCP' tab gave soldiers a PASS or FAIL against Army age standards using the multi-site tape equations, which the Army replaced with a one-site tape test in June 2023 (U.S. Army, 'Army publishes new body fat assessment guidance', 12 June 2023). The fitness category was also misplaced for estimates just above a band's top whole number, and the BMI-based mode in pounds used a rounded 2.205 lb/kg factor instead of CDC's 703 formula.
Who it affected
A soldier could be told they passed or failed a standard on a method the Army no longer uses for that decision. Some readers saw the next category up.
How we found it
Stage 3a-2: the calculator was moved onto an engine; the Army's 2023 directive could not be loaded from this machine, so the Army result was withdrawn rather than rebuilt from memory.
What we changed
The tape and BMI-based equations live in src/calculators/body-fat.ts, labelled as the older Defense Department method and a published estimate. The Army tab, its standards table and badge are removed, and the page says it gives no Army result. Categories are the ACE chart, labelled as a fitness-industry convention and placed by the displayed figure.
What stops it recurring
tests/engines/body-fat.test.ts pins each equation and every ACE band edge; tests/retired-claims.test.ts fails the build if the Army pass/fail claim returns.
Pages affected
/body-fat-calculator
The ideal weight calculator's healthy-weight ranges did not match CDC's BMI range
How far off: 5'10": 132-178 lb shown, 129-174 lb per CDC. Robinson and Hamwi results moved by up to 3 lb between 4'10" and 6'6".
What went wrong
An FAQ gave a 5'10" adult's healthy BMI weight range as 132-178 lb; CDC's healthy range (BMI 18.5 to under 25) at that height is 129-174 lb, so 178 lb was overweight (BMI 25.5). At 5'6" it gave 115-155 lb (correct 115-154), listed Devine's formula at 5'10" as 166 lb (it is 161), and typed healthy ranges in the page text (such as 99-120 lb at 5'2") matched neither the formulas nor CDC. The calculator also used rounded Robinson coefficients (52 + 1.9 / 49 + 1.7 kg) instead of the paper's 51.65 + 1.85 / 48.67 + 1.65, and a kilogram approximation of Hamwi's pound rule.
Who it affected
A reader could take a weight CDC classes as overweight as the top of a healthy range.
How we found it
Stage 3a-2: the calculator was moved onto engines and the healthy range recomputed from the site's CDC-pinned BMI engine.
What we changed
The formulas live in src/calculators/ideal-weight.ts and the healthy range comes from src/calculators/bmi.ts. The formula results are labelled as figures from drug-dosing practice and shown beside CDC's range.
What stops it recurring
tests/engines/ideal-weight.test.ts pins each formula and the CDC range at 5'10"; tests/retired-claims.test.ts fails the build if the old ranges return.
Pages affected
/ideal-weight-calculator
The weight loss percentage calculator's timelines were longer than CDC's pace gives
How far off: 10% of 200 lb: 3-5 months shown, 10-20 weeks (about 2.3 to 4.6 months) at CDC's pace.
What went wrong
The page said a 5% loss takes about 6-10 weeks and a 10% loss about 3-5 months at 1 to 2 pounds a week. At CDC's pace of 1 to 2 pounds a week, a 200-pound person's 5% (10 lb) takes 5 to 10 weeks and 10% (20 lb) takes 10 to 20 weeks, and the time depends on the starting weight. It also gave unsourced pace and target figures.
Who it affected
Readers were given a timeline that did not follow from the pace the same page quoted.
How we found it
Stage 3a-2: the calculator was moved onto an engine and the page's figures recomputed.
What we changed
Timelines are computed in src/calculators/weight-change.ts for a stated starting weight, from CDC's 1 to 2 pounds a week; the unsourced targets were removed. The calculator's own results were unchanged.
What stops it recurring
tests/engines/weight-change.test.ts pins the timelines; tests/retired-claims.test.ts fails the build if the old ones return.
Pages affected
/weight-loss-percentage-calculator
The cat age calculator used an outdated six-stage life-stage scheme and credited its human-years chart to AAHA/AAFP
How far off: Life stage changed on every input; the human-years figure is unchanged on all 464 inputs tested.
What went wrong
The calculator labelled life stages with an older six-stage scheme (Kitten to 6 months, Junior, Prime, Mature, Senior 11-14, Geriatric 15+). The 2021 AAHA/AAFP Feline Life Stage Guidelines use four age-based stages: kitten (birth up to 1 year), young adult (1-6), mature adult (7-10) and senior (over 10). The page also said twice-yearly checkups are often advised from the mature stage (the guidelines advise at least every 6 months for seniors and at least yearly for all cats), called its human-years chart 'the veterinary scale' credited to AAHA/AAFP (the guidelines give no conversion), and gave unsourced lifespan figures.
Who it affected
Every result's life-stage label changed. Cats of 7-11 months were shown as Junior (now Kitten); cats over 10 were shown as Mature until 11 and Geriatric from 15 (now Senior).
How we found it
Stage 3a-2: the guidelines' wording was read in full (PMC10812130) while moving the calculator onto an engine.
What we changed
Stages come from src/calculators/cat-age.ts, pinned to the 2021 guidelines. The human-years figure is labelled as a common chart and an illustration; the lifespan figures were removed.
What stops it recurring
tests/engines/cat-age.test.ts pins each stage boundary; tests/retired-claims.test.ts fails the build if the six-stage scheme returns.
Pages affected
/cat-age-calculator
Minor: the height calculator could show 5'12" and misstated U.S. average heights; the one-rep max page stated unsourced accuracy
How far off: 223 of 3,081 height inputs showed 12 inches; the 67% chart row changed from 15 to 14 reps.
What went wrong
The height calculator rounded the inches remainder instead of the total, so it could show an impossible height such as 5'12" (182.5 cm is 6'0" to the nearest inch). Its FAQ gave the average U.S. woman's height as 162.6 cm and man's as 175.3 cm; CDC's National Center for Health Statistics reports 63.5 inches (161.3 cm) and 68.9 inches (175.0 cm) for adults 20 and over. The one-rep max page claimed estimates are 'usually within a few percent' and 'accurate within roughly 5%', which no source for the Epley (1985) or Brzycki (1993) formulas gives; said it averages 'several' formulas (it averages two); and its chart gave 15 reps at 67% where its own formulas give 13.8.
Who it affected
Small: the height results were right to the nearest inch in all but the displayed format, and the one-rep max results themselves did not change.
How we found it
Stage 3a-2: both calculators were moved onto engines and every old result compared with the new one.
What we changed
Height rounds the total inches (src/calculators/height.ts) and quotes CDC's averages; the one-rep max page (src/calculators/one-rep-max.ts) computes its chart and drops the accuracy claims.
What stops it recurring
tests/engines/height.test.ts and tests/engines/one-rep-max.test.ts; tests/retired-claims.test.ts fails the build if the old claims return.
Pages affected
/height-calculator, /one-rep-max-calculator
The blood alcohol calculator now leads with a deliberately conservative upper estimate; its stated average burn-off and effects table did not match NHTSA
How far off: The headline is now a deliberately conservative upper estimate: the higher of Widmark's peak and NHTSA's body-water peak, less NHTSA's slow .012 an hour. It is never lower than the old figure, and is higher by .003 for every hour since the first drink (160 lb man, 4 drinks, 5 hours: 0.038% shown before, 0.053% now). NHTSA's central estimate and a range are shown beside it, each labelled.
What went wrong
The calculator used Widmark's formula (r = 0.68 for men, 0.55 for women) and called 0.015 an hour 'the average' rate at which BAC falls. NHTSA (Computing a BAC Estimate, 1994) gives .017 an hour as the average for moderate drinkers and .012 as a conservative rate. The effects table put slurred speech at .08 (NHTSA: .10) and a 'life-threatening' band from .30 that no cited source gives. The result called a zero estimate 'No measurable alcohol' in green and showed the gap below .08 in green.
Who it affected
Hours after drinking, the estimate fell faster than NHTSA's conservative rate allows, so it read lower than it should for a safety-adjacent figure. The green colours and labels could be read as saying a reader was fine to drive.
How we found it
Stage 3a-2: the calculator was moved onto an engine pinned to NHTSA's worked example.
What we changed
The arithmetic lives in src/calculators/blood-alcohol.ts. Time to zero uses the same conservative inputs. The effects table and legal limits now come from NHTSA, 49 CFR 382.201 and 23 U.S.C. 161. Next to every result, the page states that it cannot tell anyone they are safe or legal to drive.
What stops it recurring
tests/engines/blood-alcohol.test.ts pins every step of NHTSA's example (128 lb man, one 12 oz beer at 4.5%, .0302 at peak, .0182 after an hour) and checks the headline is never below the NHTSA figure or the old formula; tests/retired-claims.test.ts fails the build if the old rate or bands return.
Pages affected
/blood-alcohol-calculator
The A1C calculator's mmol/L figure was about 2.5 too high for every input
How far off: A1C 7%: 11.1 mmol/L shown, 8.6 mmol/L in the ADAG table (Nathan et al., Diabetes Care 2008;31(8):1473-1478).
What went wrong
The calculator converted estimated average glucose to mmol/L as (mg/dL + 46.7) ÷ 18.05 instead of mg/dL ÷ 18, and its answer printed the same formula. An A1C of 6% also showed 125 mg/dL where the ADAG study's table gives 126, a rounding error. The FAQ said people with prediabetes should be retested every year; the CDC says every 1 to 2 years.
Who it affected
Anyone reading their average glucose in mmol/L saw a figure 2.5 to 2.6 mmol/L too high, enough to make controlled diabetes look poorly controlled.
How we found it
Stage 3a: the calculator was moved onto an engine pinned to every row of the ADAG table.
What we changed
The conversion lives in src/calculators/a1c.ts (eAG = 28.7 × A1C − 46.7 mg/dL; mmol/L = mg/dL ÷ 18), with NIDDK's diagnostic cut-offs as named constants; the page and its answers read from it.
What stops it recurring
tests/engines/a1c.test.ts pins every row of the ADAG table in both units and the NIDDK cut-offs; tests/retired-claims.test.ts fails the build if the old formula returns.
Pages affected
/a1c-calculator
The waist-to-hip calculator used a three-band 'WHO' scale that WHO does not publish
How far off: A man with a 36 in waist and 40 in hips (0.90): 'Moderate risk' shown; WHO: substantially increased risk.
What went wrong
The page and calculator attributed to WHO a lower, moderate and high band (men below 0.90, 0.90-0.99, 1.00 or more; women below 0.80, 0.80-0.84, 0.85 or more), Asian cut-offs of 0.87 and 0.76, and '2x' and '3-5x' risk multipliers. WHO's 2008 expert consultation has one cut-off per sex: 0.90 or more for men and 0.85 or more for women mark a substantially increased risk of metabolic complications (Annex A, Table A1). It sets no moderate band and declined to set ethnic-specific cut-offs.
Who it affected
Men from 0.90 to 0.99 were told 'moderate risk' where WHO says substantially increased; women from 0.80 to 0.84 were told 'moderate risk' where WHO sets no threshold.
How we found it
Stage 3a: the WHO report itself was read and the calculator moved onto an engine.
What we changed
The ratio and WHO's two cut-offs live in src/calculators/waist-hip.ts, and the page shows WHO's single threshold per sex. The unsourced bands, Asian cut-offs and multipliers were removed, and the ratio is classified as displayed.
What stops it recurring
tests/engines/waist-hip.test.ts pins both cut-offs at the boundary; tests/retired-claims.test.ts fails the build if the three-band scale returns.
Pages affected
/waist-to-hip-ratio-calculator
The pregnancy calculator put full term at 37 weeks and gave several dates that the CDC and NICHD contradict
How far off: Full term: 37 weeks shown, 39 weeks per NICHD.
What went wrong
Full term was put at 37 weeks in the answers, milestone list and trimester text; NICHD calls 37 0/7 to 38 6/7 weeks early term and 39 0/7 to 40 6/7 full term. Other errors: group B strep testing at 35-37 weeks (CDC: 36-37); a decreased-movement warning at 'fewer than 10 kicks in 2 hours' (the CDC says there is no set normal number); light bleeding treated as fine in the first trimester (the CDC lists any bleeding); the first trimester ending at 12 weeks (ACOG: 13 weeks 6 days); a period 'about a week late' at 4 weeks (it is just due); avoiding lying flat 'after week 20' (CDC: after the first trimester); morning-sickness timing and shares that MedlinePlus does not support; a twin weight-gain rule that did not match the CDC's table; and a second trimester of 'about 3.5 months' (3.2).
Who it affected
Some readers were told they were full term two weeks early, given the wrong window for group B strep testing, and given a kick-count rule and a bleeding rule the CDC does not use. The due date itself was always right.
How we found it
Stage 3a: every figure on the page and in its answers was checked against NICHD, CDC, ACOG and MedlinePlus while the calculator moved onto an engine.
What we changed
Dates come from src/calculators/pregnancy.ts, with ACOG's trimester boundaries and NICHD's term categories as named constants; the week-by-week table is rebuilt from the engine with one source per row, and unsourced figures were removed.
What stops it recurring
tests/engines/pregnancy.test.ts pins the trimester and term boundaries and the page's worked examples, including dates across both DST changes; tests/retired-claims.test.ts fails the build if the old figures return.
Pages affected
/pregnancy-calculator
The IVF due date calculator labelled the trimester a week early and misplaced the triplet estimate
How far off: Triplets: about 35 weeks shown, 31.9 weeks on average (CDC).
What went wrong
It showed 'Second' trimester from 13 weeks 0 days and 'Third' from 27 weeks 0 days, and gave both trimester end dates 6 days early; ACOG counts the first trimester up to 13 weeks 6 days, as the site's own pregnancy calculator already did. For 'Triplets+' it showed an expected delivery about 35 weeks in, about three weeks later than the CDC's average of 31.9 weeks. Its answers said about 12% of births are preterm (CDC: about 1 in 10) and advised aiming for 37 weeks (NICHD: babies do best at 39-40).
Who it affected
Trimester labels were a week early at each boundary, and parents of triplets saw a delivery estimate about three weeks later than the CDC's average. The due date itself was always right.
How we found it
Stage 3a: the IVF calculator moved onto the same engine as the pregnancy calculator.
What we changed
Both calculators use src/calculators/pregnancy.ts: ACOG's transfer rule (266 days less the embryo's age), ACOG's trimester boundaries and the CDC's multiples averages, labelled as averages.
What stops it recurring
tests/engines/pregnancy.test.ts pins ACOG's 261 and 263-day rule and the trimester boundaries; tests/retired-claims.test.ts fails the build if the old figures return.
Pages affected
/ivf-due-date-calculator
The BMI calculators and chart were off near the cut-offs and used categories CDC does not
How far off: 6'4" and 152 lb: 'Underweight' shown; CDC's formula gives 18.50, healthy weight. At 5'2" the healthy range started at 101 lb (BMI 18.47, underweight); it starts at 102.
What went wrong
The calculators converted pounds with a 2.205 factor instead of CDC's 703 × lb ÷ in², so a result within a hair of a cut-off could land in the wrong category, and their healthy-weight range rounded so that at about half of heights one end was a weight the calculator itself called under- or overweight. The height chart had 7 of 10 rows 1-2 lb off, and an 'ideal weight by gender' table matched no BMI range, although CDC uses the same categories for men and women. The reverse calculator had four wrong reference figures and said its ranges applied to adults under 65; CDC applies them to every adult 20 and older. The blog chart had two cells 0.1 off.
Who it affected
A few readers near a cut-off saw the wrong category, and the reference tables gave healthy ranges a few pounds off.
How we found it
Stage 3a: the calculators moved onto an engine pinned to CDC's formula and categories.
What we changed
src/calculators/bmi.ts holds CDC's formulas and adult cut-offs; both calculators, the chart and the post compute from it, with CDC's category names.
What stops it recurring
tests/engines/bmi.test.ts pins CDC's worked examples and every category boundary; tests/retired-claims.test.ts fails the build if the old tables return.
The menopause calculator used 51 as the average age; the NIA gives 52
How far off: At most one year, always earlier than the NIA average implies.
What went wrong
The calculator anchored on 51 as the US average age of menopause and called 45 to 55 the normal range for menopause. The National Institute on Aging puts the average at 52, and gives 45 to 55 as the ages at which most women begin the transition. The page also quoted a 51.4 median, a 7.4-year symptom duration, 30-50% heritability, a 1% premature rate and averages by ethnicity with no source, and named the North American Menopause Society, now The Menopause Society.
Who it affected
Its result, an illustration, was a year low for about a third of inputs, including every one without a mother's age.
How we found it
Stage 3a: the page's figures were checked against the NIA and the Office on Women's Health.
What we changed
The rule lives in src/calculators/menopause.ts with the NIA average; the result is labelled an illustration, and its categories follow the Office on Women's Health (premature before 40, early 40-44). Unsourced figures were removed.
What stops it recurring
tests/engines/menopause.test.ts pins the rule; tests/retired-claims.test.ts fails the build if the old figures return.
Pages affected
/menopause-age-calculator
Minor: a heart-rate zone boundary was 1 BPM low, and the puppy calculator's hint counted a month as 4 weeks
What went wrong
With no resting heart rate, the target heart rate calculator showed the 70% zone boundary 1 BPM low at ages 45 and 55 (122 instead of 123), because 122.5 was rounded down by a floating-point artefact. The puppy weight calculator's age hint said 1 month is 4 weeks; a month averages about 4.3. No puppy result used the hint.
Who it affected
One zone boundary was a beat low at two ages; the puppy hint was only wording.
How we found it
Stage 3a, while moving both calculators onto engines.
What we changed
Both now run on engines (src/calculators/heart-rate.ts, src/calculators/puppy-weight.ts); the heart-rate ranges shown as official are MedlinePlus's, and the other zones are labelled as a coaching convention.
What stops it recurring
tests/engines/heart-rate.test.ts and tests/engines/puppy-weight.test.ts pin the arithmetic.
The city pages' home prices, property tax rates, commutes and growth figures were typed by hand, and many were wrong
How far off: Property tax on a $400,000 home in Houston: $9,000 to $10,000 a year shown, about $5,700 at the city's median ratio.
What went wrong
After the take-home and pay figures were sourced, the city pages still carried about 690 typed figures: home prices, price changes, property tax rates, vacancy, commute times, population growth, employer headcounts and revenue, and assorted tax facts. Each was checked against the Census Bureau (2024 American Community Survey, 2025 population estimates), FHFA's house price index, the taxing authority's own page or the company's own filing. 128 were wrong, 337 had no official source and were cut, 143 were confirmed on an official page and 79 matched. Property tax was usually overstated: Houston's was given as a 2.2-2.4% effective rate, where the city's median bill is 1.4% of its median home value (a ratio of medians, which the pages now label as such); Detroit's as 2.8%+ against 1.5%. Price changes were overstated: Austin's 'doubled from 2019 to 2022' is 69% on FHFA's index, Seattle's 'tripled since 2010' 152%. Median homes were off in both directions: Dallas $385,000 against $340,400, Boston $890,000 against $722,800, San Diego $915,000 against $980,700.
Who it affected
Readers weighing a move saw property taxes and price swings that were larger than the official figures, and typed facts that could not be checked.
How we found it
Stage 2h of the shared engines lesson: Hub A asked for every remaining figure in the city data to be sourced or trimmed.
What we changed
Home value, property tax, rental vacancy, commute and 2020-2025 growth now come from the Census (src/data/city-stats.ts); price changes from FHFA (src/data/metro-hpi.ts, registered in provenance). Tax facts kept as typed were each checked on the authority's page. Employer headcounts, revenue and investment figures, neighborhood prices and figures no official source gives were cut, and employer lists no longer tag headquarters.
What stops it recurring
The sourced figures are computed from the data files; tests/city-data.test.ts pins cells against the Census and FHFA files; tests/retired-claims.test.ts fails the build if any of the old figures return.
The city pages named wrong headquarters and out-of-date local taxes
How far off: NYC mortgage recording tax on a $600,000 mortgage: $10,800 at 1.8%, against $13,050 at 2.175%.
What went wrong
Checked against SEC filings and official pages: Goldman Sachs did not move its headquarters to Dallas (it is in New York); Palantir's principal office is now in Florida, not Denver; GM's is at 1240 Woodward Avenue, not the Renaissance Center; Stellantis is registered in the Netherlands, not Auburn Hills; Bath & Body Works (formerly L Brands) is based in Columbus, not New Albany; Boeing moved its headquarters to Virginia, not Texas; the Pentagon, FDA and NRC sit outside DC. San Francisco's Payroll Expense Tax was repealed from 2021 but was described as current. Seattle's JumpStart payroll tax was given with its 2021 thresholds ($7 million of payroll, pay above $174,000) where seattle.gov gives $9,074,409 and $194,452 for 2026, taxed on the whole pay. The Texas franchise tax no-tax-due threshold was given as $2.47 million; the Comptroller gives $2.65 million for 2026 and 2027 reports. The New York City mortgage recording tax was given as 1.8%; New York State Form MT-15 gives 2.175% on homes of $500,000 or more. Philadelphia's Net Profits Tax was dated 2026 at a rate phila.gov gives for tax year 2025. Portland's page said Oregon taxes Social Security (it does not) and credited Measure 5 with the 3% cap that comes from Measure 50. LA's list of Metro rail lines was out of date, and Nashville was said to have no rail (WeGo Star runs).
Who it affected
Readers were given wrong facts about where companies are based, and several tax rules that had changed.
How we found it
Stage 2h, checking each headquarters and tax claim on the company's filing or the authority's own page.
What we changed
Each claim is now stated as the source gives it, or cut where no official page could be reached; headquarters are named only where a filing or the company's own page confirms them.
What stops it recurring
tests/retired-claims.test.ts fails the build if the old figures return.
DC's sales tax does not rise on October 1, 2026: the District postponed it a year
How far off: Tax on a $100 purchase in DC from October 1, 2026: $7.00 would have been shown against $6.00 owed.
What went wrong
Earlier today the DC pages said the general sales tax would rise from 6% to 7% on October 1, 2026, and the calculators were set to switch then, following the Office of Tax and Revenue's notice of October 2025 tax changes and D.C. Code 47-2202(a) as last codified. The District has since postponed the rise: every OTR and CFO page now says "the October 2026 Sales and Use Tax increase has been postponed to October 1, 2027".
Who it affected
None yet: the rate was still 6% when this was corrected. From October 1, 2026 the pages would have told readers 7% applied, and the DC calculators would have charged it.
How we found it
Found while checking the Washington, DC page's figures against the Office of Tax and Revenue's site in stage 2h.
What we changed
DC's rate schedule now rises to 7% on October 1, 2027, and the DC pages say the rise was postponed. The browser switch built for October 1 now happens a year later.
What stops it recurring
tests/date-switched-rates.test.ts and the browser tests check that DC stays at 6% on October 1, 2026 and moves to 7% at midnight in Washington on October 1, 2027; tests/retired-claims.test.ts fails the build if the 2026 date returns.
The city paycheck pages' incomes, rents and pay tables had no source, and most were wrong
How far off: New York one-bedroom rent: $3,500 shown, $1,732 median gross rent (ACS 2024; this median includes long-standing and rent-regulated leases, which the page now says).
What went wrong
Every city page showed a median household income, median earnings and one- and two-bedroom rents typed by hand with no source, plus a table of salary ranges by industry and a table of monthly costs. Against the Census Bureau's 2024 American Community Survey, household income was more than 5% off in 22 of the 25 cities, usually too low (Houston $57,800 against $64,361; Fort Worth $62,400 against $82,503). Rents were more than 5% off in 17 one-bedroom and 20 two-bedroom cases, mostly too high: New York's one-bedroom was $3,500 against a median gross rent of $1,732, Chicago's two-bedroom $2,410 against $1,526. The salary table's ranges ("Venture Capital (associate to partner)", "AI/ML Engineering (OpenAI, Anthropic)") had no source at all, and the cost table priced groceries, gasoline and insurance by city, which no free official dataset does.
Who it affected
A reader comparing cities saw incomes too low and rents too high, and salary ranges that could not be checked.
How we found it
Stage 2f of the shared engines lesson: Hub A asked for the city data to be brought into provenance, sourcing each income and rent or removing it.
What we changed
Population, income and rent now come from the Census (src/data/city-stats.ts: Vintage 2025 population estimates; ACS 2024 tables B19013, B20002 and B25031), and each city's price level from BEA. The salary table is replaced by what jobs pay in the metro area from the BLS Occupational Employment and Wage Statistics, May 2025 (src/data/metro-pay.ts), for eight standard occupations and two or three local ones. The monthly cost table is removed. Both files are registered in provenance.
What stops it recurring
tests/city-data.test.ts pins cells against the Census and BLS files and checks that every city takes these figures from them; tests/retired-claims.test.ts fails the build if the typed fields return.
Take-home, tax and pay figures in the city pages' text were typed by hand, and most were wrong
How far off: Take-home on $100,000 in Dallas: $72,500 to $74,500 shown, $79,180 computed. Massachusetts tax on $5 million of wages: about $210,000 shown, $406,143 computed.
What went wrong
The answers and paragraphs on the 25 city pages quoted take-home pay, tax amounts, savings between states and pay for jobs, all typed rather than computed. Of 278 such figures checked against the site's own paycheck engine, the Census and BLS, 147 were wrong, 84 were right and 47 had no source. Take-home pay was almost always too low, by roughly 6% to 15%: $75,000 in Houston was said to take home $57,800 to $59,500 against $61,593. California tax was mostly too high: $150,000 in Los Angeles was said to pay $17,000 to $19,000 in state tax against $11,655 of income tax and SDI. The same review found older facts: Seattle's capital gains tax given as 7% above $262,000 (Washington's own figures are 7% above a $278,000 deduction for 2025 and 9.9% above $1 million of gains, and RSU vesting is wages, not a gain); Texas's homestead exemption given as $100,000, here and in two guides (voters raised it to $140,000 on November 4, 2025; Tax Code §11.13(b)); the 2026 foreign earned income exclusion given as $130,000 (the IRS gives $132,900); sales tax in Jacksonville, Chicago, Phoenix, Charlotte, Columbus and Denver that disagreed with the verified sales tax data; the Massachusetts surtax put at $1 million instead of $1,107,750 for 2026; Colorado said to tax Social Security; New York City tax said to reach non-residents through the convenience rule; and eight leftover cost of living indexes that stage 2e had missed (Detroit 76, where BEA gives 100.3).
Who it affected
Readers were told they would take home less than they would, and were given savings between states that did not hold at the salary named.
How we found it
Stage 2f: each claim was recomputed from the paycheck engine and the sourced data, and the figures that disagreed were logged.
What we changed
Every take-home, tax and pay figure in the city text is now computed when the site is built, from the paycheck engine, src/data/city-stats.ts, src/data/metro-pay.ts, states.ts, the sales tax data, BEA and Washington's capital gains figures (src/data/wa-capital-gains.ts). Company-specific pay with no official source was removed.
What stops it recurring
The figures cannot drift from the engine because they are computed from it; tests/retired-claims.test.ts fails the build if any of the 61 old ranges or the old tax facts return.
The Philadelphia, Portland and New York City paycheck calculators used out-of-date or simplified local taxes
How far off: New York City tax overstated by about $310 on $100,000 single and $597 on $150,000 married. Portland local tax understated by $720 on $300,000 single and $3,720 on $500,000. Philadelphia: about $4 a year on $75,000.
What went wrong
Philadelphia cut its Wage Tax on July 1, 2026 to 3.735% for residents and 3.425% for non-residents; the calculator used 3.74% and the page gave non-residents 3.44%, a rate that ended in June 2025. Portland's calculator applied one 2.5% rate above $125,000, but for 2026 Metro's housing tax starts at $128,000 single ($205,000 joint) and Multnomah County's preschool tax rises to 3% above $250,000 ($400,000 joint). New York City's calculator doubled the single brackets for married couples, where the city publishes its own ($21,600, $45,000, $90,000), and taxed gross wages, where the city taxes New York taxable income, after the $8,000 single or $16,050 joint standard deduction.
Who it affected
New York City tax was overstated for every resident; Portland's was understated for high earners; Philadelphia's was a few dollars high.
How we found it
Stage 2f: bringing the city data into provenance meant checking each local tax against its authority, the Philadelphia Department of Revenue, Metro's and Multnomah County's 2026 tax tables, and the New York State IT-201 instructions.
What we changed
The paycheck engine now takes a city's own married and head-of-household brackets, several high-income tiers, and a deduction taken before the city's rates, and the three cities use them with the 2026 figures. The local tax notes name the new rates.
What stops it recurring
tests/engines/paycheck.test.ts works the New York City and Portland schedules by hand from the published tables; src/data/provenance.ts records each local tax's source with a re-check date.
The crypto calculator's state table and Washington note, and the 529 guide, quoted old tax rates
How far off: Washington: gains over $1 million are taxed at 9.9%, not 7%.
What went wrong
The crypto page's table of state rates was typed by hand: Indiana 3.05% (2.95% for 2026), North Carolina 4.5% (3.99%), and a 5% to 7% band listing Georgia, Illinois, Massachusetts and Ohio, whose 2026 rates are 4.99%, 4.95%, 9% at the top and 2.75%. Its Washington note said 7% on long-term gains above roughly $270,000, the 2024 deduction, with no mention of the 9.9% rate on gains above $1 million from 2025. It also said California plus New York City tax could take over $400,000 of a $1 million gain, but no one pays both. The 529 guide gave Indiana's rate as about 3.05%.
Who it affected
Readers weighing a crypto sale saw several state rates that were a year or two out of date and an incomplete Washington tax. The 529 figure did not enter its example.
How we found it
Stage 2f, from the follow-ups found in stage 2e.
What we changed
The crypto table is built from states.ts. The Washington note quotes the Department of Revenue (src/data/wa-capital-gains.ts, registered in provenance). The 529 guide reads Indiana's rate from states.ts. The California plus New York City sentence is removed.
What stops it recurring
tests/retired-claims.test.ts fails the build if the old rates return.
DC's hotel tax was a point low, and its general sales tax rises on October 1, 2026
How far off: A $1,000 hotel stay: $149.50 of tax shown, $159.50 charged.
What went wrong
The District of Columbia pages gave the hotel rate as 14.95% (the general 6% plus 8.95%). The District's Office of Tax and Revenue gives a temporary 15.95% rate on transient lodging, extended through September 30, 2027. The same notice says the general sales tax stays 6% through September 30, 2026 and rises to 7% from October 1, 2026, which the pages did not mention.
Who it affected
A hotel bill estimated from the page was a point low; after October 1 the general rate would have been a point low too.
How we found it
Stage 2f, while checking the Washington, DC page's tax text against the sales tax data.
What we changed
The sales tax data switches DC's general rate from 6% to 7% for builds on or after October 1, 2026, and every DC page states both rates. The hotel rate is 15.95%.
What stops it recurring
tests/retired-claims.test.ts fails the build if the 14.95% hotel rate returns.
The cost of living figures matched none of the sources they named
How far off: The page's own example: $75,000 in Houston was said to need $134,250 in San Francisco. On BEA's 2024 levels it is $87,915. The salary page said $100,000 in San Francisco matched about $40,000 in Memphis; it is $79,731.
What went wrong
The cost of living calculator's 50-city table was labelled C2ER, BLS and BEA Regional Price Parities, but its figures matched none of them. It put New York at 187 and San Francisco at 179 overall, with housing at 302 and 298; BEA's 2024 price levels are 112.6 and 115.6, with rents at 148.6 and 194.7. C2ER's index is a paid product whose figures we never had, and the table's groceries, transportation and health-care columns have no free official source by city. The 25 city paycheck pages carried their own unsourced cost of living index: Austin 118 and Memphis 79, where BEA gives 98.1 and 92.2. The Fort Worth page called its metro one of the most affordable in the country; BEA puts Dallas-Fort Worth at 103.1. The salary calculator's example put San Francisco near 250 and Memphis near 85. The income-by-age page gave New York City a regional price parity of 121, a figure BEA does not publish.
Who it affected
Salary comparisons overstated the gap between expensive and cheap places, often by tens of thousands of dollars. Anyone judging a move or a job offer was told they needed far more in the dearer city than BEA's price levels imply.
How we found it
Stage 2e of the shared engines lesson. Hub A asked for the calculator to be rebuilt on BEA's regional price parities once its figures could not be traced to any source.
What we changed
The calculator now reads BEA's 2024 regional price parities (src/data/bea-rpp.ts, registered in provenance) for the 50 metro areas and every state. It shows the overall level plus goods, rents, utilities and other services, and the salary maths is in an engine (src/calculators/cost-of-living.ts). Groceries, transportation and health care are gone, and the scope note says why. Each city is its whole metro area. The city pages, the salary example, the income-by-age example and the answers are computed from the same file.
What stops it recurring
tests/engines/cost-of-living.test.ts pins cells against BEA's files and works the Houston-to-San Francisco example by hand. The provenance register fails the build when the figures are due for re-check. tests/retired-claims.test.ts fails the build if the old indices return.
The Indianapolis page quoted Indiana's 2024 tax rate, and the Memphis page understated take-home pay
What went wrong
Four places on the Indianapolis page gave Indiana's flat rate as 3.05% and the combined state and Marion County rate as 5.07%, and the Indiana sales tax page repeated the 3.05% on its Indianapolis card. That was the 2024 rate. For 2026 it is 2.95%, or 4.97% combined, which the page's own calculator and its tax-nuances paragraph already used. That paragraph put the 2025 rate at 3.05%; it was 3%. The Memphis page said $55,000 for a single filer takes home $43,000–$44,500 after federal tax and FICA. On 2026 figures it is $46,373.
Who it affected
Indianapolis readers were told a state rate 0.1 points too high, about $100 a year on $100,000. Memphis readers were told $1,900–$3,400 less take-home pay than they would get.
How we found it
Found in stage 2e while rewriting the pages' cost-of-living sentences: the rates disagreed with the page's own tax data.
What we changed
The Indianapolis rates are now computed from the state dataset (src/data/states.ts) and the county rate the calculator uses, and the Memphis figure comes from the paycheck engine.
What stops it recurring
tests/retired-claims.test.ts fails the build if Indiana's 2024 rate returns to the Indianapolis page or the old range to the Memphis page. Both figures now move with the data and the engine.
The W-4 calculator treated Step 4(b) as itemized deductions only
How far off: A single filer 65 or older on $60,000 with $8,000 of tips and $3,000 of overtime premium, paid every two weeks: $193 a paycheck ($5,020 a year) shown, against $115 ($2,980) with a $17,000 Step 4(b).
What went wrong
The calculator's one Step 4(b) box and the page, its answers and the W-4 guide all described Step 4(b) as itemized deductions over the standard deduction. The 2026 Form W-4's Deductions Worksheet also takes qualified tips, the overtime premium, car-loan interest, $6,000 for each person 65 or older, adjustments such as student loan interest, and cash gifts to charity for those who don't itemize, and the form says you needn't itemize to use it. The guide placed the worksheet on page 3 (it is on page 4) and told readers to use Step 4(b) only if they would itemize. One answer subtracted a $16,100 standard deduction from $25,000 and got $9,000.
Who it affected
Workers with tips, overtime, a new car loan or turning 65 were shown withholding sized for none of those deductions, so it came out too high.
How we found it
Stage 2d of the shared engines lesson, when Hub A asked for the 2026 worksheet after stage 2c found the engine had none of its new lines.
What we changed
The W-4 engine (src/calculators/w4.ts) now works the Deductions Worksheet line by line, reusing the overtime-deduction engine's cap and income limit for line 1b, and the calculator asks for each line. Married filing separately is its own choice because the worksheet treats it differently. The page, its answers and the guide describe the worksheet as the form does.
What stops it recurring
tests/engines/w4.test.ts works every worksheet line by hand from the 2026 form, including the income limits, the 94% itemized limit and the SALT floor; tests/retired-claims.test.ts fails the build if the itemized-only description returns.
Pages affected
/w4-calculator, /blog/w4-allowances-guide
A percent-off worked example slipped a dollar, the salary widget ignored its hours and weeks, and the gold calculator rounded the pennyweight
What went wrong
The percent-off page's department store example took 15% off $115.20 and gave $98.92; it is $97.92, so the effective discount is 59.2%, not 58.8%, and the total with 8% tax $105.75, not $106.83. The embeddable salary-to-hourly widget divided by a fixed 52 weeks and 260 days for its weekly and daily figures whatever hours and weeks were entered, so it disagreed with the full calculator it links to. The gold calculator took a pennyweight as 1.555 g; NIST Handbook 44 gives 1.555 173 84 g.
Who it affected
One worked example was a dollar high; the widget's weekly and daily pay were off for anyone who entered other than 52 weeks (at 48 weeks, $1,154 a week shown for $1,250 on $60,000); gold weighed in pennyweights read about 0.01% low, a dollar on $3,900.
How we found it
Stage 2c of the shared engines lesson: re-running the page examples through engines and routing the widget through the pay engine.
What we changed
Stacked discounts now come from the retail engine and the example is computed from it; the widget uses the same pay engine as the salary-to-hourly calculator. Gold now uses NIST's exact troy ounce, ounce and pennyweight in a metals engine (src/calculators/metals.ts). The discount, tip and CPM pages moved onto engines in the same change with identical results.
What stops it recurring
tests/engines/retail.test.ts pins the coat example; tests/retired-claims.test.ts fails the build if the slip or the fixed divisors return.
Two pages' explanations contradicted their own arithmetic
What went wrong
The money factor page explained the 2,400 conversion as money factor × 24 = monthly rate, then × 12 and × 100, which multiplies by 28,800. The factor is half the monthly rate, because the rent charge is taken on capitalized cost plus residual, twice the average balance. The paycheck report said no-income-tax states keep an extra $2,500-$5,500 at $75,000 against median-tax states, where its own table shows $1,881-$2,922. It also said the higher standard deduction adds about 0.4% to take-home; $350 more of deduction at 22% is $77, 0.1%.
Who it affected
No calculator result was affected; the explanations overstated the no-tax advantage and the deduction's effect, and taught a wrong derivation.
How we found it
Stage 2c of the shared engines lesson: re-running each page's explanation through its engine.
What we changed
The derivation is corrected and the money factor page now runs on a lease engine (src/calculators/lease.ts). The report's figures are computed from the same paycheck matrix as its table.
What stops it recurring
tests/engines/lease.test.ts pins the page's examples; tests/retired-claims.test.ts fails the build if the old explanations return.
The budget calculator's FIRE number multiplied savings instead of spending
How far off: $5,000 a month on a 50/30/20 split: $300,000 shown, against $1,200,000 for $48,000 a year of spending.
What went wrong
The FIRE number row took 25 times a year of the savings allocation. A FIRE number is 25 times a year of spending at a 4% withdrawal rate, as the site's own FIRE calculator computes it; the budget's spending is its needs and wants.
Who it affected
The figure was far too low for anyone saving less than half their pay, which is nearly everyone.
How we found it
Stage 2c of the shared engines lesson: putting the page's arithmetic on an engine.
What we changed
A budget engine (src/calculators/budget.ts) now computes the split and the FIRE number from needs plus wants, and the row is labelled 25 times yearly spending.
What stops it recurring
tests/engines/budget.test.ts pins both; tests/retired-claims.test.ts fails the build if the savings-based formula returns.
Pages affected
/budget-calculator
The income percentile calculator used a table its cited sources don't publish
How far off: $75,000 at ages 25-34: the 75th percentile under the old table, the 70th under the Census distribution; at 35-44, $100,000 was put at the 77th percentile, where the Census shows 29.5% of that age group at $100,000 or more.
What went wrong
The calculator ranked incomes against median, 75th, 90th and 99th percentile figures by age that it attributed to 2024 Census and IRS data, and interpolated straight lines between them. Neither source publishes those figures: the Census's own table gives medians and a distribution in $2,500 bands up to $100,000, and the IRS does not publish income by age this way. The medians were off (ages 18-24 at $28,000 against the Census's $17,420 for 15-24), and the 90th and 99th percentile figures had no source.
Who it affected
Percentiles were misstated, most for young adults: the old table put the median 18-24 year-old about $10,600 higher than the Census does.
How we found it
Stage 2c of the shared engines lesson: tracing the page's data to its cited source, which Hub A had flagged as unverified.
What we changed
The calculator now reads the Census PINC-01 distribution for income in 2025 (src/data/income-by-age.ts, registered in provenance) and interpolates within its $2,500 bands. Above $100,000 it reports the share of the age group at that level instead of a percentile, and the 90th and 99th percentile figures are gone.
What stops it recurring
tests/engines/income-percentile.test.ts checks the engine reproduces every Census median from the bands; tests/retired-claims.test.ts fails the build if the old table or its attribution returns.
Pages affected
/income-percentile-by-age-calculator
Detroit property tax figures didn't match the state's published millage
How far off: $100,000 home bought recently: $2,850 shown against $3,209 with the exemption, and $4,500 against $4,109 without.
What went wrong
The guide applied 2.85% (with the principal residence exemption) and 4.5% (without) to market value, gave totals of 67-70 and 85-90 mills, listed components that didn't add up to either, and called Detroit's rate the highest in Michigan. Michigan Treasury's 2025 report gives Detroit 64.1844 and 82.1844 mills, charged on taxable value, which for a newly bought home is half of market value; several Wayne County cities are higher. It also said the exemption lowers the effective rate by 1.8 points; 18 mills on half the value is 0.9.
Who it affected
The table understated the tax on a newly bought home with the exemption and overstated it without; a $100,000 home showed $2,850 and $4,500 a year.
How we found it
Stage 2c of the shared engines lesson: checking the page's local rates against Michigan Treasury's millage report.
What we changed
The table and figures are now computed from the Treasury millage (src/data/local-property-tax.ts, registered in provenance) on half of market value, with a note that homes held longer usually owe less. The unsourced component list and the highest-in-Michigan claim are removed.
What stops it recurring
tests/engines/property-tax.test.ts pins the millage arithmetic and the 18-mill exemption gap; tests/retired-claims.test.ts fails the build if the old rates return.
Pages affected
/detroit-property-taxes
Will County's guide gave downstate exemption amounts and the wrong appeal form
What went wrong
The guide gave the general homestead exemption as $6,000 and the senior exemption as $5,000, the amounts for counties not bordering Cook; Will County borders Cook, so both are $8,000. It put the senior freeze income limit at about $65,000 (it is $75,000 for tax year 2026), described disabled veterans' relief as $2,500-$10,000 (at a 70% rating the first $250,000 of EAV is exempt), capped the home improvement exemption at $25,000 of improvements ($75,000 of added value), and named PTAX-300 as the Board of Review appeal form.
Who it affected
Homeowners, seniors and disabled veterans were told their exemptions are smaller than they are, and pointed to the wrong form for an appeal.
How we found it
Stage 2c of the shared engines lesson: checking the guide's local figures against the Illinois Department of Revenue's property tax relief page.
What we changed
The exemption figures now come from src/data/local-property-tax.ts, sourced to the Department of Revenue and registered in provenance. The PTAX-300 claim is removed, and the average effective rate is labelled an estimate from secondary sources in the scope note.
What stops it recurring
tests/engines/property-tax.test.ts pins the exemption amounts; tests/retired-claims.test.ts fails the build if the downstate amounts or the PTAX-300 claim return.
Pages affected
/will-county-property-tax
The military pay calculator used an old pay table and unsourced BAH figures
How far off: E-5 with 6 years and dependents: base pay $3,907 shown against $4,110, and a monthly total of $6,130 against $6,812. E-5 under 2 years: $3,116 against $3,343.
What went wrong
The page's pay chart and FAQ came from the re-verified 2026 DFAS table, but the calculator's script kept its own earlier copy, which understated E-1 through E-5 and most other cells, along with BAH figures of unknown provenance that the data module had already replaced with DTMO midpoints. The military-versus-civilian table was typed from the same old figures.
Who it affected
Base pay, BAH and totals in the calculator disagreed with the chart beside it, understating junior enlisted pay by up to $227 a month.
How we found it
Stage 2c of the shared engines lesson: routing the calculator's script through the page's verified data module.
What we changed
The calculator now calls the same module as the chart (src/data/calculators/military-pay.ts), whose federal tax and FICA now come from the federal engine, with Social Security capped at the wage base for general officers. The comparison table is computed from it.
What stops it recurring
tests/engines/military-pay.test.ts pins the DFAS cells, BAS and the tax; tests/retired-claims.test.ts fails the build if the old tables return to the page.
Pages affected
/military-pay-calculator
The tax bracket calculator used the previous year's brackets for both years it offered
How far off: A single filer with $75,000 of taxable income: 2026 shown as $11,414, actually $11,212; 2025 shown as $11,553, actually $11,414.
What went wrong
The calculator's script kept its own bracket tables and picked the 2025 table when 2026 was chosen and the 2024 table when 2025 was chosen; the page's own worked examples, built from the shared data, were right. Its $75,000 FAQ example gave $10,716 at 14.3%. The AMT paragraph had pre-2026 figures ($90,500 and $140,800 exemptions, phase-out from $639,300, 28% above $245,400) and described the SALT cap as $10,000. The state paragraph counted 10 flat-tax and 32 progressive states against the site's own 12 and 29 plus DC, and gave Utah's rate as 4.85%, as did the pay stub guide, which also listed Massachusetts as flat despite its 4% surtax. Utah's data said it conforms to the federal standard deduction; it gives a credit instead. North Dakota's text still gave its 2025 zero-tax threshold of $48,475 against the $49,575 its brackets already used.
Who it affected
Every tax figure the calculator showed was from the wrong year, overstating 2026 tax because 2026 brackets are wider. AMT exposure for 2026 was understated: the exemption now phases out from $500,000 ($1,000,000 joint) at twice the old rate.
How we found it
Stage 2c of the shared engines lesson: routing the calculator's script through the shared bracket tables and checking the page against Rev. Proc. 2025-32.
What we changed
The calculator now uses the shared federal tables for the year chosen (2026 from Rev. Proc. 2025-32, 2025 from Rev. Proc. 2024-40). The FAQ example and the state counts are computed from the data, and the AMT paragraph gives the 2026 amounts from Rev. Proc. 2025-32 §3.10. The SALT cap is $40,400, Utah's rate 4.45%, Utah's text describes its credit, and North Dakota's gives $49,575.
What stops it recurring
The federal engine's bracket tests pin both years to the IRS tables, and tests/retired-claims.test.ts fails the build if the year-shifted tables or the old AMT and state figures return.
The capital gains calculator taxed short-term gains at 2025 brackets and stated the holding period backwards
How far off: A single filer with $100,000 of other taxable income and a $5,000 short-term gain: $1,200 of tax at 2025 brackets, $1,100 at 2026's (the 24% bracket now starts at $105,700).
What went wrong
The calculator's own script carried the 2025 ordinary brackets for short-term gains while its worked example used 2026, and it tested the NIIT threshold against taxable income rather than modified AGI. The page and its FAQ said short-term means held less than one year and long-term one year or longer; the IRS rule is one year or less against more than one year. The FAQ counted Washington among states with no capital gains tax. The blog gave the 0% band as $48,475 single and $96,950 joint, 2025 bracket edges rather than the 2026 0% amounts, and put the whole 35% bracket at a 20% long-term rate.
Who it affected
Short-term estimates used thresholds about 4% lower than 2026's, overstating tax for gains near a bracket edge. Readers selling on their one-year anniversary would have expected long-term rates they don't get. Washington sellers above its threshold were told they owe no state tax.
How we found it
Stage 2c of the shared engines lesson: putting the page on an engine pinned to the Form 1040 capital gain worksheet and the IRS NIIT examples, and checking its text against Topic 409 and Rev. Proc. 2025-32.
What we changed
A capital gains engine (src/calculators/capital-gains.ts) now serves the calculator, its worked example and the stock page: the worksheet for long-term gains with 2026 thresholds stored once in the federal data, the 2026 brackets for short-term gains, and NIIT on modified AGI estimated as taxable income plus the standard deduction. The holding period, the Washington answer and the blog's 0% band ($49,450 single, $98,900 joint) are corrected.
What stops it recurring
tests/engines/capital-gains.test.ts pins the worksheet line by line and the IRS NIIT examples; tests/retired-claims.test.ts fails the build if the 2025 brackets, the backwards holding period or the old 0% band return.
Sales tax pages called Chicago the highest-taxed major city and gave stale top rates
What went wrong
The pages called Chicago's rate the highest of any major US city, but Seattle's 10.55% is higher; the reverse sales tax page and the Chicago city page still gave Chicago's pre-August 10.25%, the Seattle city page gave 10.35%, and California's top combined rate was given as 10.75% when Lancaster and Palmdale are at 11.25%. The reverse sales tax page's example put Cook County at 7.25% and said a $5.42 charge for a $5.00 latte at 8.25% was correct, when the tax rounds to $5.41.
Who it affected
Rate comparisons and one worked example were wrong; the stored rates the sales tax calculators use were already correct.
How we found it
Stage 2c of the shared engines lesson: checking the reverse sales tax page's figures against each state's own rate publication, which turned up the same claims in the state and city data.
What we changed
Chicago is 10.5% from August 1, 2026, Seattle 10.55% and California's top combined rate 11.25%, each from the state's own publication, and no page calls Chicago the highest. The latte example and the rate hint are corrected, and the reverse calculation now runs on a shared retail engine (src/calculators/retail.ts).
What stops it recurring
tests/engines/retail.test.ts pins the page's worked examples, and tests/retired-claims.test.ts fails the build if the stale rates or the Chicago superlative return.
Tip-share, prorated-rent, markup and home-sale pages had wrong worked examples and unsourced rules
What went wrong
The tip-share example paid $445.83 per 64 units from a $1,840 pool that works out to $446.06, and valued a 10-point senior share at $557 without recounting the units ($525.71). It said Form 8027 applies at 10 tipped employees and that the IRS imputes tips below 8% of receipts; the IRS test is more than 10 employees of any kind, and the employer allocates the shortfall. Its description promised a points-based calculator the page doesn't have. The prorated-rent answer kept 16 days in a 31-day month where the 15th to the 31st is 17, called banker's method tenant-friendly while its guide called it neutral, said the 365-day method is usually lowest, and named states said to require move-in proration without a source. The prorated-rent calculator could also count negative days when the last day came before move-in. The markup page said quoting a 40% markup as margin overstates it by a third, and the home-sale example said improvements reduce basis and that most states have no transfer tax.
Who it affected
Worked figures a reader might copy were off by up to $31, and the proration answer understated a 31-day month by one day's rent.
How we found it
Stage 2c of the shared engines lesson: putting each page's arithmetic on an engine and re-running its printed examples through it.
What we changed
Engines for tips, proration, retail and home sales (src/calculators/tips.ts, proration.ts, retail.ts, home-sale.ts) now drive the calculators, and the tip-share example is computed from its engine. The 8027 rule follows the IRS instructions, and the rent proration answer counts 17 days. The legal claims now say the lease usually decides. Florida's 0.7% documentary stamp tax replaces the transfer-tax generalisation, and improvements are described as adding to basis.
What stops it recurring
tests/engines/tips.test.ts, proration.test.ts, retail.test.ts and home-sale.test.ts pin every corrected example; tests/retired-claims.test.ts fails the build if the old figures return.
Settlement tax used one flat rate, and several pages said miscellaneous deductions were only suspended
How far off: The worked example ($400,000 emotional-distress settlement, 40% fee, single, $60,000 other income, 5% state): $148,000 of tax and $92,000 kept at a flat 37%, now figured at the brackets.
What went wrong
The settlement calculator taxed the whole taxable amount at one chosen marginal rate, and its worked example applied about 37% to a claim it called general negligence, which for a physical injury would be tax-free. The pages said punitive damages are always taxable and to report settlement interest on Schedule B. The settlement page and three blog posts described the end of miscellaneous itemized deductions as a suspension through 2025, "restored 2026 for some" or "extended through 2028"; P.L. 119-21 §70110 made it permanent.
Who it affected
Settlement estimates were off wherever the amount spans more than one bracket. Readers could have expected legal, tax-preparation or employee home office deductions to return.
How we found it
Stage 2c of the shared engines lesson: routing the settlement page through the federal engine and checking its rules against IRS Publication 4345, 26 U.S.C. 104 and 62(a)(20), and P.L. 119-21 §70110; a site search found the same suspension wording in three posts.
What we changed
A settlement engine (src/calculators/settlement.ts) applies Pub 4345's rules and taxes the result at the 2026 brackets on top of the other income you enter, and the worked example is computed from it. The pages now give the 104(c) wrongful-death exception, Form 1040 line 2b for interest, and the permanent end of miscellaneous itemized deductions.
What stops it recurring
tests/engines/settlement.test.ts pins the rules and the bracket arithmetic; tests/retired-claims.test.ts fails the build if the suspension, always-taxable or Schedule B wording returns.
The lottery tax calculator taxed every prize at a flat 37% and overstated the cash value
How far off: The default ($500 million jackpot, 6% state tax): $171 million take-home at a 60% cash share and flat 37%, now $122 million at Powerball's quoted 43% with federal brackets on top of $60,000 of other income.
What went wrong
Federal tax was a flat 37% of the lump sum whatever its size, and the annuity was 30 equal payments taxed at 37%. The page put the cash value at 50-65% of the advertised jackpot (default 60%) and called the jackpot the annuity's present value, said higher rates raise the cash share when they lower it, put California's tax on lottery prizes at 13% while another answer said it has none, and gave the pre-2026 $600 reporting threshold. It also cited an unsourced "70% of winners" statistic, called the annuity income for life, gave 30-180 day claim periods and listed states said to allow anonymous claims without a source.
Who it affected
Small prizes showed far too much federal tax. For jackpots the headline cash value was too high: at today's rates the lump sum is well under half the advertised figure, so the take-home was overstated.
How we found it
Stage 2c of the shared engines lesson: routing the page through the federal engine and checking each figure against the 2026 W-2G instructions and Powerball's own FAQs and jackpot estimate.
What we changed
A lottery engine (src/calculators/lottery.ts) applies the 2026 brackets to the prize on top of the income you enter, shows the 24% withheld at payout, and pays the annuity as Powerball does: an immediate payment and 29 more, each 5% larger. The cash share defaults to Powerball's quoted 43% and the $1 billion example is computed from it. The FAQ and body give the $2,000 reporting threshold, Powerball's 90-day-to-one-year claim periods and its note that anonymity rules differ by state.
What stops it recurring
tests/engines/lottery.test.ts pins the W-2G withholding and reporting rules and Powerball's annuity schedule; tests/retired-claims.test.ts fails the build if the flat 37%, the 50-65% cash share or the other retired claims return.
Pages affected
/lottery-tax-calculator
Overtime pages misstated state rules and the salary threshold, and dropped hours over 40
How far off: $20 an hour with 45 regular hours and no separate overtime: $800, now $950 (5 hours at $30 were missing).
What went wrong
The time-and-a-half calculator paid regular hours only up to 40, so hours over 40 typed as regular hours were left out of pay entirely. Its table note described a premium the column didn't show. The page said Alaska and Nevada require double time and that Colorado and Oregon require overtime after 8 hours a day; it called the federal salary threshold "around 35,500 dollars ... (pending final rules)" and told salaried workers to divide by 40 whatever their schedule. The overtime calculator said the $684 threshold was set to increase.
Who it affected
Anyone entering more than 40 regular hours saw pay too low. Workers in Alaska, Nevada, Colorado and Oregon could have expected overtime or double time their state law doesn't give.
How we found it
Stage 2c of the shared engines lesson: routing the page through the overtime engine, then checking each rule against 29 CFR 541.600, 778.110 and 778.113, California Labor Code 510 and the Labor Department's state table.
What we changed
The page now uses the overtime engine (src/calculators/pay.ts), which moves regular hours past 40 to overtime, and both tables are computed from it. The state rules now match the Labor Department's table: Alaska 8 hours a day at employers with 4 or more employees, Nevada 8 for workers under 1.5 times the minimum wage, Colorado 12, Oregon 10 in manufacturing, and double time only in California. The threshold is $684 a week ($35,568 a year), and a salary is divided by the hours it covers.
What stops it recurring
tests/engines/pay.test.ts pins the engine to 29 CFR 778.110(a) and (b), including the bonus example the page works through; tests/retired-claims.test.ts fails the build if the old state rules or threshold wording return.
Pages affected
/time-and-a-half-calculator, /overtime-calculator
The overtime deduction was overstated: the wrong cap, income limit and qualifying amount
How far off: The calculator's default ($25 an hour, 10 overtime hours a week all year, 12% bracket): $2,340 saved, now $780 on a $6,500 deduction. A $40-an-hour nurse with 20 overtime hours a week at 24%: $6,000, now $3,000.
What went wrong
The calculator counted all overtime pay at time-and-a-half as deductible and capped it at $25,000 for everyone, although its own text said only the premium counts. The pages put the phase-out above $250,000 ($500,000 joint), let each spouse claim $25,000, counted California's state-only daily overtime, and pointed readers to a "Form W-4O" that does not exist. The blog also listed states as conforming without a source and dated W-2 code TT to 2025. Under 26 U.S.C. 225 only the pay above the regular rate that FLSA section 7 requires counts, up to $12,500 ($25,000 on a joint return), less $100 for each $1,000 of modified AGI over $150,000 ($300,000 joint).
Who it affected
Estimated federal tax savings were about three times too high for most workers, and higher still for anyone over the real cap. Married people filing separately were shown a deduction they can't claim.
How we found it
Hub A flagged four points from memory; each was checked against the statute (P.L. 119-21 §70202), IRS Notice 2025-69, Schedule 1-A (Form 1040), the 2026 Form W-4 and the 2026 Form W-2 instructions before anything changed.
What we changed
A new engine (src/calculators/overtime-deduction.ts) follows Schedule 1-A Part III line by line. The calculator takes the premium, filing status and modified AGI, and its table is computed from the engine. The FAQ and body now give the $12,500 cap, the $150,000 income limit, the joint-return rule, the 2026 W-4 worksheet line 1b and W-2 code TT from 2026, and the blog examples are reworked.
What stops it recurring
tests/engines/overtime-deduction.test.ts pins the engine to Notice 2025-69's six examples, the Schedule 1-A lines and the blog's examples; tests/retired-claims.test.ts fails the build if the $25,000 cap, the $250,000 phase-out, the full-overtime rule or Form W-4O comes back.
Retirement and savings pages each compounded money their own way
How far off: The 401(k) page's default example (30-year-old, $6,000 a year plus match, 7%, to 65): $1,220,286, now $1,176,597 with contributions monthly as paid. A 529 of $300 a month for 13 years at 7%: $63,333, now $62,337.
What went wrong
Each projection page carried its own growth formula. The 401(k) page put a whole year's pay-period contributions and match in on January 1; the 529 page and the emergency fund treated a yearly return or APY as a monthly rate; the 401(k) embed ignored the 60-63 catch-up; none said which timing it assumed.
Who it affected
Balances were somewhat overstated where contributions were counted early, and time-to-goal figures were a little short where an APY was treated as a nominal rate.
How we found it
Adopting the shared engines lesson for retirement and investing (stage 2b) and comparing every page's outputs old against new.
What we changed
One growth engine (src/calculators/growth.ts) now serves every projection page, with contribution timing stated on each: payroll contributions monthly, Roth IRA contributions each January, a yearly return compounded as an effective annual rate, and an APY never compounded again.
What stops it recurring
tests/engines/growth.test.ts pins the engine to every worked example in Regulation DD Appendix A, and tests/retired-claims.test.ts fails the build if a page compounds an APY by twelve again.
How far off: $10,000 at a 5% APY: $10,512 after a year, really $10,500; $12,834 after five years, really $12,763.
What went wrong
The rate box was an APY, but the calculator and its $10,000 table ran it through monthly compounding as if it were a nominal rate, and the FAQ said so: "A = P × (1 + r/n)^(n×t) where r is the APY". Under Regulation DD an APY already includes compounding.
Who it affected
Every CD result and table figure overstated the interest a quoted APY earns, and the FAQ's figures for a $10,000 CD were wrong.
How we found it
Pinning the new growth engine to Regulation DD's worked examples while routing the CD page through it.
What we changed
An APY now grows once a year, as 12 CFR 1030 Appendix A defines it; a new choice lets you enter an interest rate instead with its compounding, and the calculator shows the APY either way. The table and both FAQs use the corrected figures.
What stops it recurring
tests/engines/growth.test.ts pins APY to Regulation DD's examples, and tests/retired-claims.test.ts fails the build if the "APY compounded monthly" wording or code returns.
Pages affected
/cd-calculator
Roth vs Traditional always picked Roth, whatever your tax rates
How far off: The default case ($10,000 a year, 30 years, 7%, 24% now, 22% in retirement): Roth ahead by $207,814; at the same take-home cost the Traditional account is ahead by $19,491.
What went wrong
The calculator read your current tax rate and then ignored it: it taxed the Traditional balance at retirement but gave the Roth the same pre-tax contribution untaxed. Its scenario table showed the same Roth figure in every row, and rows labelled "Tie" and "Traditional" had Roth far ahead.
Who it affected
Anyone comparing the two was told Roth wins even when their tax rate falls in retirement, when the Traditional account actually leaves more after tax.
How we found it
Stage 2b's review of every retirement page against its own stated rule ("at equal rates, identical results").
What we changed
Both accounts now cost the same take-home pay: the pre-tax amount into the Traditional, that pay less today's tax into the Roth, paid in monthly. Equal rates now tie exactly, and the table is computed from the same engine.
What stops it recurring
The comparison is a function in src/data/calculators/401k.ts used by both the table and the calculator, and tests/retired-claims.test.ts fails the build if the untaxed-Roth code or the "fair-comparison" tie label comes back.
Pages affected
/roth-vs-traditional-401k-calculator
Roth 401(k) rules described as they were before SECURE 2.0
What went wrong
Pages said Roth 401(k)s have required minimum distributions (or "may still" for some plans), that the employer match always goes in pre-tax, and that a first-home purchase makes a Roth 401(k) withdrawal qualified.
Who it affected
Readers could have rolled a Roth 401(k) to an IRA to escape RMDs that no longer exist, or taken a first-home withdrawal expecting it to be tax-free.
How we found it
Primary-source review for stage 2b, confirmed in 26 U.S.C. 402A.
What we changed
Corrected from 26 U.S.C. 402A(d)(5) (no lifetime RMDs from 2024), 402A(a)(2) and (b)(1) (a plan may offer the match as Roth) and 402A(d)(2)(A) (no first-home exception for a Roth 401(k)). The 401(k) page also now explains the 2026 Roth catch-up rule for pay over $150,000.
What stops it recurring
tests/retired-claims.test.ts fails the build if any of the four claims returns.
Social Security calculator used 2025 figures and one claiming factor for everyone
How far off: The default ($75,000, 35 years, born 1975): $3,579 a month at 70 and $1,898 at 62, now $3,404 and $1,922.
What went wrong
The PIA formula used 2025's bend points ($1,226 and $7,391); benefits at 70 were 132% of PIA and at 62 were 70% for every birth year; the earnings test and maximum benefits were 2025's; life expectancy at 62 was overstated; and the Social Security Fairness Act was said to cover only new claims.
Who it affected
Anyone with a full retirement age of 67 saw an age-70 benefit about 8% of PIA too high, which also inflated the waiting-to-70 lifetime comparison.
How we found it
Primary-source review for stage 2b against SSA's actuarial pages.
What we changed
A Social Security engine now applies SSA's 2026 bend points ($1,286 and $7,749), the reduction and delayed credits for each birth year, and the 2026 earnings test ($24,480 and $65,160). Maximum benefits, life expectancy (SSA's 2023 period table) and the Fairness Act's scope now follow SSA's own pages.
What stops it recurring
tests/engines/social-security.test.ts pins the engine to SSA's 2026 benefit examples, the maximum-earner table and every row of the benefit-by-claiming-age table; the build fails once the parameters pass their re-verification date.
Pages affected
/social-security-calculator
RMD page gave the wrong Joint-table example, 2025 QCD and Medicare figures, and a 20% withholding rule
How far off: Joint example: $34,843 on $1 million, really $35,336 (a $5,315 saving, not $5,807). QCD limit $111,000, not $108,000; IRMAA from $109,000 / $218,000, adding $81.20 a month, not $74.
What went wrong
The Joint-table example used a divisor of 28.7 where the regulation says 28.3; the page said lower factors mean lower RMDs (the reverse); the QCD limit ($108,000) and IRMAA thresholds (~$106,000 / $212,000) were 2025's; 401(k) RMDs were said to face 20% mandatory withholding; and the projection labelled its first row with this year even when RMDs start later.
Who it affected
A couple using the Joint table would have planned on a smaller RMD than required, and retirees were given the wrong charitable-distribution and Medicare-surcharge thresholds for 2026.
How we found it
Primary-source review for stage 2b.
What we changed
An RMD engine now carries all three IRS tables transcribed from 26 CFR 1.401(a)(9)-9 and uses the Joint table when you enter a spouse more than 10 years younger. Figures corrected from IRS Notice 2025-67, SSA's 2026 premium table and IRS Publication 505.
What stops it recurring
tests/engines/rmd.test.ts pins the tables and engine to Publication 590-B's worked examples, and tests/retired-claims.test.ts fails the build if any of these claims returns.
How far off: $90,000 high-3, 15 years, retiring at 57: $13,500 a year shown, $10,125 after the reduction.
What went wrong
The calculator paid 1% a year of service at any age and never applied the 5%-a-year reduction for retiring under the MRA+10 rule. The page also said FERS covers those hired after 1984, put the supplement's earnings limit at 2024's $22,000 without noting MRA+10 retirees don't get it, called the TSP match 5%, and overstated what two more years of work add.
Who it affected
An early retiree under MRA+10 saw a pension up to 25% too high, the difference between a reduced and an unreduced annuity for life.
How we found it
Primary-source review for stage 2b against OPM's CSRS/FERS Handbook.
What we changed
A FERS engine applies OPM's rules: 1.1% at 62 with 20 years, MRA+10 reduced 5/12 of 1% a month under 62, deferred annuities, and survivor costs. Page facts corrected from OPM RI 90-1, the handbook and 5 U.S.C. 8432.
What stops it recurring
tests/engines/fers.test.ts reproduces both of OPM's worked FERS examples to the cent, and tests/retired-claims.test.ts fails the build if the old claims return.
Pages affected
/fers-retirement-calculator
Savings bond values compounded yearly and missed the early-cashing penalty
How far off: $1,000 EE bond at 2.4% held 30 years: $2,037 shown, $2,539 with the doubling. 2026 education exclusion phases out from $152,650 joint, not $151,600.
What went wrong
The calculator compounded once a year instead of every six months, ignored the 3 months of interest lost before 5 years and the ban on cashing in the first year, and applied the EE doubling only to the 20-year row. The page also mislabelled the 2022 composite rate as the variable rate, overstated recent fixed rates, gave 2025's EE rate and last year's education-exclusion income limits, and described paper I bonds by tax refund, which ended in 2025.
Who it affected
Early-cashing values were overstated, 30-year EE values ignored the guaranteed doubling, and parents were given the wrong income limits for tax-free education use.
How we found it
Primary-source review for stage 2b against TreasuryDirect and Rev. Proc. 2025-32.
What we changed
A savings bond engine applies TreasuryDirect's rules and composite-rate formula; the page's facts now follow Treasury's rate chart and Rev. Proc. 2025-32 §3.17.
What stops it recurring
tests/engines/savings-bond.test.ts pins the engine to TreasuryDirect's worked example and rate chart, and tests/retired-claims.test.ts fails the build if the old claims return.
Pages affected
/savings-bond-calculator
529 pages kept the old $10,000 K-12 limit and said Roth IRA earnings are tax-free for education
How far off: K-12: $20,000 a year for 2026, not $10,000. College cost for a child starting in 13 years: public $207,421 and private $546,838 before, now $203,031 and $439,027.
What went wrong
The pages gave the K-12 limit as $10,000 a year, but the 2025 tax law doubled it to $20,000 from 2026 and widened what it covers; a FAQ said Roth IRA earnings are tax-free when spent on education; and the calculator's college costs had no source.
Who it affected
Families could have held back 529 money they were entitled to spend on K-12, or taken Roth IRA earnings for tuition expecting no tax.
How we found it
Primary-source review for stage 2b.
What we changed
Corrected from P.L. 119-21 §70413 and IRS Publication 590-B; the Form 709 five-year election is now described as the IRS instructions state. College costs now start from NCES's 2022-23 average cost of attendance, grown at a stated assumption.
What stops it recurring
tests/retired-claims.test.ts fails the build if the $10,000 K-12 limit or the Roth education claim returns.
Pages affected
/529-calculator, /blog/is-529-plan-tax-deductible
Worked examples on investing pages didn't follow from their own assumptions
How far off: $150,000 at 7% for 35 years is $1,601,487, not $1.14 million. $8,750 a year for 30 years at 7% is about $826,500, not $358,000. $500 a month at 7% for 30 years is $609,985, not $611,729.
What went wrong
Hand-typed examples were miscalculated: three compounding figures and a $611,729 annuity on the future value page; $150,000 growing to $1.14 million at 7% over 35 years; a Roth IRA "$7,500" example computed with $7,000; an HSA growing to $358,000; a $5,050 premium gap said to fund a Roth IRA in full; and a dividend table no single assumption produces.
Who it affected
Readers saw examples that didn't match the numbers the calculators gave for the same inputs, some too high and some too low.
How we found it
Stage 2b recomputed every worked example with the growth engine under each example's own stated assumptions.
What we changed
Examples on these pages are now computed at build time by the same engine as the calculator, or corrected by hand in the blog, with their assumptions stated.
What stops it recurring
The examples are generated from src/calculators/growth.ts, so they can't drift from the calculator, and tests/retired-claims.test.ts fails the build if any of the old figures returns.
Net worth by age was labelled 2024 data; it is the Fed's 2022 survey
How far off: 55-64 mean $1,564,000, really $1,566,900; 35-44 median $135,000, really $135,600.
What went wrong
The table and FAQ called the Survey of Consumer Finances figures "2024 data". There is no 2024 survey: they come from the 2022 survey, published in October 2023, in 2022 dollars, and several were rounded down. Wealth-share figures were also attributed to the wrong Fed dataset.
Who it affected
Readers compared their net worth with benchmarks two years older than stated, in 2022 dollars rather than today's.
How we found it
Primary-source review for stage 2b against the Federal Reserve's survey bulletin.
What we changed
Figures and labels now follow Table 2 of the 2022 survey, and wealth shares come from the Fed's Distributional Financial Accounts for the second quarter of 2026.
What stops it recurring
tests/retired-claims.test.ts fails the build if the "2024 data" label returns.
Pages affected
/net-worth-calculator
Deposit and Treasury rates were given as 2026 facts with no source
How far off: 1-year CD: "4.0-5.3%" typical, FDIC national average 1.73% (September 21, 2026); savings "4-5%", national average 0.37%.
What went wrong
Pages listed "typical" 2026 CD rates of 3.5-5.3%, savings rates of 4-5% and T-bill ranges, none sourced. The FDIC's national averages are far lower.
Who it affected
Readers were told a typical CD pays more than twice what the national average is, which could make a poor offer look normal.
How we found it
Primary-source review for stage 2b against the FDIC and TreasuryDirect.
What we changed
The pages now quote the FDIC's national rates with their date and say how each product's rate is set, rather than stating market rates as facts.
What stops it recurring
src/data/deposit-rates.ts is in the provenance register with a re-verification date, and tests/retired-claims.test.ts fails the build if the unsourced ranges return.
Tax and account rules misstated on investing pages
How far off: Joint 15% capital-gains rate ends at $613,700, not about $1.09 million. The 2026 dependent-care credit starts at 50%, not 35%.
What went wrong
Examples used a 20% and a 34% ordinary tax bracket, neither of which exists; the stock page said joint capital-gains thresholds roughly double, gave Washington's old flat 7% rate, and misdescribed the wash-sale and holding-period rules, and its calculator applied 20% to the whole 35% bracket; the dividend page gave the pre-2024 record-date rule and 3M as an Aristocrat after its cut; a multi-year CD was said to get a 1099-INT; the HSA page limited trustee transfers, used 2025's catch-up and the old 35% dependent-care credit rate.
Who it affected
Readers could have misjudged a trade's tax, a sale's timing, or a benefit they are entitled to; the stock calculator overstated long-term tax for most of the 35% bracket.
How we found it
Primary-source review for stage 2b.
What we changed
Corrected from Rev. Proc. 2025-32, 26 U.S.C. 1091, IRS Publications 550 and 969, Investor.gov, the Washington Department of Revenue, 3M's SEC filings and P.L. 119-21 §70405.
What stops it recurring
tests/retired-claims.test.ts fails the build if any of these claims returns.
Loan pages worked interest unrounded and totalled payments as payment times months
How far off: $400,000 at 6.5% for 30 years: total interest $510,178, now $510,180. A $5,000 line of credit at 8% paid at $1,000 a month: $1,000 of interest, really $102. Card payoffs: up to $29. The payoff calculator showed -1 year and -$1,212 saved with no extra payment; now zero.
What went wrong
Each loan page carried its own copy of the payment formula. None rounded a month's interest to the cent as a lender's schedule does, and the card, line-of-credit and payoff pages counted a fractional number of payments, as if the last one were a full payment.
Who it affected
Totals of interest and payments were a few cents to a few dollars out on most pages, and far more on a line of credit paid off quickly, whose last partial payment was counted as a full one.
How we found it
Adopting the shared engines lesson for loans (stage 2a) and comparing every page's outputs old against new.
What we changed
One loan engine (src/calculators/amortize.ts) now serves every page: the payment to the nearest cent, as the CFPB's sample Loan Estimate shows ($761.78 for $162,000 at 3.875% over 30 years), each month's interest to the cent, and a last payment that clears the balance, the "odd final payment" of Regulation Z Appendix J.
What stops it recurring
tests/engines/amortize.test.ts pins the engine to all 18 worked APR examples in Appendix J and to the CFPB sample loan, and tests/retired-claims.test.ts fails the build if a page carries its own payment formula again.
PMI ran for the whole loan on the mortgage calculator, and the PMI calculator guessed when it would end
How far off: $400,000 home, 10% down, 6.5%, PMI at 0.5%: lifetime cost $37,650 too high (360 months of PMI, not 109). PMI calculator's default ($400,000, 10% down, 0.75%): "~2.7 years" and $7,200, now a request at payment 95 and automatic end at payment 109, $24,525.
What went wrong
The mortgage calculator's lifetime total charged PMI for every month of the term. The PMI calculator had no rate or term: it estimated removal from a flat 0.35% of the loan paid off a month, at 80%, and totalled PMI to that point.
Who it affected
Lifetime cost was overstated for anyone putting less than 20% down, and the PMI calculator understated how long PMI lasts and what it costs.
How we found it
Checking the pages against the Homeowners Protection Act for the loans stage (2a).
What we changed
Both pages now follow 12 U.S.C. 4901-4902: you can ask to cancel when the balance is first scheduled to reach 80% of the original value, and PMI ends when it is scheduled to reach 78%, or at the loan's midpoint if sooner. The PMI calculator gained rate and term inputs to build that schedule. The pages' wording on it ("20% equity" for automatic removal, "78% of the original purchase price") was corrected too.
What stops it recurring
tests/engines/amortize.test.ts checks the dates against the CFPB's sample loan, whose mortgage insurance runs in years 1-7 and stops in year 8, and tests/retired-claims.test.ts blocks the old code and wording.
Mortgage and PMI pages quoted 2025 loan limits, pre-2023 FHA premiums and a 43% DTI cap
How far off: Conforming limit $832,750 (not $806,500); FHA MIP 0.15-0.75% (0.50-0.55% on most 30-year loans); no federal DTI cap since October 1, 2022; 45-day window; 2-5% closing costs.
What went wrong
The pages gave $806,500 (the 2025 conforming limit) as 2026's, FHA annual MIP of 0.45-1.05% (the schedule before March 2023), 43% as today's conventional DTI maximum, a 14-day window for mortgage rate shopping, closing costs of 3-5%, and escrow as required below 20% down. The PMI page and a blog post said PMI is not deductible in 2026.
Who it affected
Buyers were told a lower loan limit, a higher FHA premium and a tighter DTI rule than apply, and that PMI can't be deducted when it can.
How we found it
Checking the pages' figures against HUD, FHFA, CFPB, IRS and Census sources for the loans stage (2a).
What we changed
Corrected from ML 2025-22 and FHFA ($832,750; $1,249,125 high-cost), HUD ML 2023-05 (FHA MIP), 85 FR 86308 and 86 FR 22844 (the price-based QM test replacing the 43% cap), Fannie Mae's Selling Guide B3-6-02 (36/45/50%), 78 FR 75238 (FHA 31/43 to 40/50), 38 CFR 36.4340 (VA 41%), 7 CFR 3555.151 (USDA 29/41), CFPB (45 days; 2-5%), 12 CFR 1026.35(b) and 24 CFR 203.23 (escrow), Reg X 1024.17 (cushion), P.L. 119-21 section 70108 (PMI deductible from 2026) and the Census Bureau ($87,460 median household income, 2025).
What stops it recurring
tests/retired-claims.test.ts fails the build if $806,500, 0.45-1.05%, 43% as the conventional maximum, the 14-day mortgage window or "PMI is not deductible" comes back.
Worked examples on the mortgage, loan, auto, card and payoff pages didn't add up
How far off: Extra $200 a month on $400,000 at 6.5%: $98,000 saved, really $111,893. $1,000 a month extra on $300,000 at 7%: ~$240,000, really ~$267,000. $25,000 at 7% for 3 years: $2,749 of interest, really $2,789. $5,000 of card debt at $200 a month: "about 3.5 years", really 34 months. PMI table at 6.5%: "~9 years" to 80% on 5% down, really 10.3, and "~6" on 10% down, really 7.9. Two down-payment rows on the mortgage page were a dollar high.
What went wrong
Figures typed into FAQ answers and tables had drifted from the arithmetic they described.
Who it affected
Readers comparing terms, rates or extra payments were shown savings and costs that the calculator itself would not produce.
How we found it
Recomputing every worked example on the new loan engine.
What we changed
The examples are now computed from the engine when the page is built, so they can't drift from the calculator again.
What stops it recurring
The figures come from src/calculators/amortize.ts at build time, which tests/engines/amortize.test.ts pins to Regulation Z's examples; no worked loan figure on these pages is typed in any more.
The student loan calculator used 2025 rates and poverty guidelines, and charged interest the law waives
How far off: RAP, $35,000 at 6.39% and $30,000 AGI: $182,670 forgiven after 30 years, really about $17,000. IBR, $35,000 at 6.39% and $40,000 AGI: $58,555 forgiven, now $47,612. IBR at $60,000 AGI: $304 a month, really $300.50. Graduated with $100 extra ignored the rising payments: $20,000 at 6.39% paid off in 7 yr 7 mo, really 6 yr 9 mo.
What went wrong
It gave 6.39 / 7.94 / 8.94% as the 2026 rates (they are the 2025-26 rates), used a poverty-guideline table mixing 2025 figures and figures from neither year, and added unpaid interest to principal every month under RAP and IBR.
Who it affected
Payments, interest and especially forgiven balances on the income-driven plans were wrong, often by a wide margin.
How we found it
Checking the page against ED, HHS and the 2025 law for the loans stage (2a).
What we changed
Rates for loans first disbursed July 1, 2026 - June 30, 2027 (6.52 / 8.07 / 9.07%, FSA GENERAL-26-33); HHS 2026 poverty guidelines ($15,960 for one, +$5,680); RAP's unpaid interest not charged and its $50 principal match (34 CFR 685.209(h)(4), (o)(2)); IBR and PAYE interest charged without capitalizing (685.209(j)); IBR/PAYE payments under $5 set to $0 and $5-$10 to $10 (685.209(g)); fixed plans at least $50 a month (685.208).
What stops it recurring
tests/engines/student-loan.test.ts checks ED's own worked examples (its 2026 ICR notice's $97.59, $146.38, $243.96 and $585.51 amortizations, and the RISE rule's RAP table), and tests/retired-claims.test.ts blocks the old rates, guidelines and interest model.
Pages affected
/student-loan-calculator
The student loan page described plans as they stood before the 2025 law and the 2026 SAVE ruling
How far off: Rules, not a dollar figure: the plan list, SAVE, PAYE, Grad PLUS, Parent PLUS, capitalization, PSLF after consolidation, TPD certifiers, the employer exclusion and the Form 1040 line for AGI (11a).
What went wrong
The page offered loans made from July 2026 plans they can't use and didn't model Tiered Standard. It said SAVE borrowers move to IBR or RAP, PAYE closed to new enrollment in 2024, Grad PLUS is capped at $20,500, interest capitalizes when repayment starts and after forbearance, consolidation resets PSLF credit, and the $5,250 employer exclusion runs only through 2026.
Who it affected
Borrowers, especially anyone taking a new loan from July 2026 or leaving SAVE, were told the wrong options and rules.
How we found it
Checking every rule on the page against ED and the statute for the loans stage (2a).
What we changed
Corrected from HEA 455(d)(7) and (q), 34 CFR 685.202(b), 685.208(c) (Tiered Standard: 10-25 years by balance, now a calculator option), 685.209, 685.213, 685.219(c)(3), P.L. 119-21 sections 81001 and 82001, Rev. Proc. 2025-32 section 3.09, MOHELA's ED notice on SAVE (ended by court order March 10, 2026) and the 2025 Form 1040.
What stops it recurring
tests/retired-claims.test.ts fails the build if any of the old plan rules comes back; tests/engines/student-loan.test.ts checks Tiered Standard's terms and the Extended plan's more-than-$30,000 rule.
Pages affected
/student-loan-calculator
The SBA calculator described a fee waiver that ended and outdated terms and rate caps
How far off: $500,000 7(a) loan: fee shown $0, really $11,250 (3% of the 75% guaranteed portion).
What went wrong
It said 7(a) loans under $1 million pay no upfront fee in FY 2026, charged a fee on the whole loan, gave 7 years as the working-capital limit, pre-2022 rate caps, a 1-2% lender origination fee, a 504 cap of "$5.5 million or more" for the project, and allowed microloans up to 25 years.
Who it affected
Business owners were shown no SBA fee where one applies, and the wrong limits on terms, rates and lender fees.
How we found it
Checking the page against SBA's FY 2026 and FY 2027 fee notices and 13 CFR 120 for the loans stage (2a).
What we changed
Corrected from SBA Information Notices 5000-872051 and 5000-881797 (2% / 3% / 3.5%, 3.75% over $1 million, on the guaranteed portion), 5000-871532 (504: 0.5%), and 13 CFR 120.210, 120.212 (10 years; 25 for real estate), 120.214(d) (caps of base + 3 to 6.5 points), 120.221 (no origination fee), 120.223 (prepayment fee on 15-year-plus loans prepaid over 25%), 120.707 (microloans within 7 years), 120.910 and 120.931. The calculator now works the fee from that schedule unless you enter one.
What stops it recurring
tests/retired-claims.test.ts fails the build if the waiver, the 7-year working-capital limit, the old rate caps or the origination fee comes back.
Pages affected
/sba-loan-calculator
The reverse mortgage calculator overstated what a borrower can get
How far off: Age 70, $500,000 home, $50,000 owed, 7.5%: $156,000 net, really $109,000, of which $39,000 in the first year. Age 62 at 7.5%: "~50%" of value, really 29.1%.
What went wrong
Its principal limit factors and its "how much can you borrow by age" table were 15 to 29 points above HUD's, it charged the 2% insurance on the loan rather than the home's value, it estimated closing costs as 5% of value, its tenure payment ignored the interest rate, and it said a lump sum is open to all and payout options can switch once by refinancing.
Who it affected
Homeowners 62 and over were shown far more cash than a HECM can provide, and wrong rules on how to take it.
How we found it
Checking the calculator against HUD's principal limit factor table for the loans stage (2a).
What we changed
The calculator now uses HUD's full table (every age 62-99, every rate 3-18.875%, effective October 2, 2017, ML 2017-12), the 2% upfront MIP on the maximum claim amount, the origination fee cap in 24 CFR 206.31, the first-year limit, and a tenure payment worked to age 100 at the rate plus 0.5% (24 CFR 206.25). The page's tables are computed from it.
What stops it recurring
tests/engines/hecm.test.ts checks rows of HUD's table, the fee and limit rules and the page's default case, and tests/retired-claims.test.ts blocks the old factors and wording.
Pages affected
/reverse-mortgage-calculator
Loan, auto and card pages misdescribed APR, prepayment penalties, the Rule of 78s and EV credits
How far off: Rules rather than dollar figures, plus the federal student loan range (5.5-8.1%, now 6.52-9.07% for 2026-27).
What went wrong
Pages said APR is always at least the interest rate and labelled plain rates as APRs; put mortgage prepayment penalties at 1-5%; dated the Rule of 78s limit to 1992 for loans of 61+ months; said the CFPB "cracked down" on dealer markup; told lessees they can claim an EV credit; listed California's closed CVRP; and called the card minimum-payment warning "buried".
Who it affected
Borrowers were given wrong rules on comparing loans, paying early and tax credits, and a wrong federal student rate range.
How we found it
Checking the pages against Regulation Z, the US Code, the IRS and the CFPB for the loans stage (2a).
What we changed
Corrected from the CFPB (APR "usually higher"), 12 CFR 1026.43(g) (2% / 2% / 1%, three years, fixed-rate QMs only), 15 U.S.C. 1615 (terms over 61 months after September 30, 1993), 15 U.S.C. 1650(e) (no penalty on private student loans), P.L. 115-172 (CFPB bulletin voided), the IRS clean-vehicle FAQ (lessor claims), CARB (CVRP closed November 8, 2023), 12 CFR 1026.7(b)(13) and the Federal Reserve's G.19 release.
What stops it recurring
tests/retired-claims.test.ts fails the build if any of these claims returns, and every loan page's scope note now says it uses the note rate, not the APR.
Line of credit, mobile home, recast, commercial and snowball pages carried outdated or wrong rules
How far off: HELOC rates ~7.5-9.5% (not 8-10%); FHA Title I limits indexed since 2024 ($106,405 single-section in 2024, not $92,904); VA manufactured-home terms 20-25 years.
What went wrong
The pages gave prime as 7.5% (it is 7.00%), dated the $1 million mortgage-interest limit to "pre-2018" loans, quoted FHA Title I limits and terms from before 2024 and VA terms of 25-30 years, said government-backed loans can't be recast at all, put the SBA occupancy test at 51% for all buildings, and put a 401(k) early withdrawal at 35-45% combined.
Who it affected
Readers were given wrong rates, loan limits and rules for home equity, manufactured-home and business borrowing.
How we found it
Checking the pages against the Federal Reserve, IRS, HUD, VA and SBA sources for the loans stage (2a).
What we changed
Corrected from the Federal Reserve H.15 release, IRS Publication 936 (debt before December 16, 2017; $375,000 married filing separately), 89 FR 14582 and 24 CFR 201.11 (Title I), 38 U.S.C. 3712(d) (VA terms), 24 CFR 3282.8 (on or after June 15, 1976), 24 CFR 203.501 and 203.616 (FHA recasting only as loss mitigation), 13 CFR 120.131 (60% for new construction) and IRS Topic 558 (a 10% additional tax).
What stops it recurring
tests/retired-claims.test.ts fails the build if the "pre-2018" limit, prime at 7.5%, the pre-2024 Title I limits, "cannot be recast at all" or the 35-45% figure returns.
The DTI calculator treated 43% as the current limit and misstated how debts are counted
How far off: Conventional up to 50% with automated approval, not 43%; FHA manual 31/43 to 40/50; a documented $0 income-driven payment counts as $0.
What went wrong
It gave 43% as the conventional maximum, FHA as 43-57% ("56.9% with compensating factors"), VA as 41-60% instead of DTI, USDA as strict, conventional student loans at 1% of balance or the payment whichever is higher, and co-signed debts as always counting.
Who it affected
Borrowers were told a tighter conventional limit and wrong counting rules than lenders use.
How we found it
Checking the page against the CFPB's QM rule and the agencies' underwriting rules for the loans stage (2a).
What we changed
Corrected from 85 FR 86308 and 86 FR 22844 (43% QM cap replaced by a price test, compliance from October 1, 2022), Fannie Mae's Selling Guide B3-6-02 and B3-6-05, 78 FR 75238 (FHA), 38 CFR 36.4340 (VA) and 7 CFR 3555.151 (USDA). The calculator still shows the payment at 43% DTI, now labelled as a reference point.
What stops it recurring
tests/retired-claims.test.ts fails the build if 43% returns as the conventional or qualified-mortgage maximum, or the old counting rules come back.
Pages affected
/dti-calculator
Scope notes on six loan calculators said they left out things they include
How far off: No figure changed; the notes did.
What went wrong
The student loan note said income-driven plans aren't modelled (IBR, PAYE and RAP are); the mortgage note implied PMI and HOA dues aren't in the payment (both are inputs); the auto note said sales tax and fees are excluded (both are added to the loan); the SBA note said the guarantee fee is excluded while showing it.
Who it affected
Readers were told the result left out costs it had in fact included, and weren't told what it really leaves out, such as APR, escrow cushions or joint income.
How we found it
Checking what each loan page's note says against what its calculator does, as the stage asked.
What we changed
Each note now says what the calculator models and what it doesn't: rate versus APR, escrow and taxes, PMI's end, fees, and for student loans the subsidized-interest benefit, a spouse and Alaska/Hawaii guidelines.
What stops it recurring
tests/result-scope.test.ts still requires every note to be specific and unique to its calculator, and the old wording is blocked by tests/retired-claims.test.ts.
The federal tax and income calculators charged state tax on income before 401(k), HSA and IRA deductions
How far off: $820 a year too much in California on $80,000 with a $10,000 401(k); $420 on a $7,000 IRA. Roughly the state rate times the deductions.
What went wrong
Both calculators worked out state tax on total income, ignoring the 401(k), HSA, IRA and other deductions the reader entered. The site's paycheck pages already used federal wages after those deductions, which is where most states start.
Who it affected
Anyone who entered a 401(k), HSA or IRA contribution, or had self-employment income, was shown too much state tax in most income-tax states.
How we found it
Listed as a known gap in the engines work (stage 1), then fixed in stage 1b.
What we changed
State income is now federal AGI plus back whatever the state doesn't let you deduct, using the same state rules as the paycheck pages. Pennsylvania adds back 401(k) and IRA contributions (PA Personal Income Tax Guide; 2025 PA-40 instructions p.12, "PA law does not allow you to deduct your contributions to any IRA"). New Jersey adds back payroll HSA and IRA contributions (2025 NJ-1040 instructions; GIT-1 & 2, January 2026, p.8). California adds back the HSA (2025 Schedule CA line 13) and follows the federal IRA deduction.
What stops it recurring
tests/engines/state-filing.test.ts checks the state income for Illinois, Pennsylvania, New Jersey and California, and tests/retired-claims.test.ts fails the build if either page computes state tax on total income again.
Pages affected
/tax-calculator, /income-calculator
The federal tax and income calculators gave married couples one state exemption in several states
How far off: On the tax calculator at $80,000: $64 in New Jersey, $220 in Massachusetts, $382 in Kansas. On the income calculator at $60,000: $153 in California (the second exemption credit), $511 in Kansas. About $1,200 in Utah on either, where the joint credit base doubles.
What went wrong
The tax calculator counted exemptions in a way that ignored a spouse in states whose exemption is one amount per return (Alabama, Massachusetts, Mississippi, New Jersey, Oklahoma and Rhode Island), in Kansas, and in Utah's credit. The income calculator gave every married couple one exemption, in all 26 states that have one.
Who it affected
Married couples filing jointly were shown too much state tax on those two calculators, while the paycheck pages gave them the right figure.
How we found it
Moving both calculators onto the one state function the paycheck pages use, and comparing old against new.
What we changed
Both calculators now use calcStateIncomeTaxForFiling, the same rules as every paycheck page. Joint filers get the state's joint figure, and dependents count where the state counts them.
What stops it recurring
The data-integrity check requires every page that shows state tax to use the shared engine, and tests/engines/state-filing.test.ts pins the joint figures below.
Pages affected
/tax-calculator, /income-calculator
Joint and head-of-household state exemptions were wrong in Illinois, Maryland, Kansas and Connecticut
How far off: Connecticut, joint at $60,000: $640 too much. Head of household at $45,000: $486 too much. Illinois joint at $400,000: $289.58. Maryland joint at $160,000: $176. Kansas head of household at $25,000: $121.
What went wrong
These states set their own joint or head-of-household figures, and the site used the single-filer figure doubled. Illinois's cut-off for a joint return is $500,000, not $250,000. Maryland has a separate joint and head-of-household band table. Kansas gives head of household an extra $2,320. Connecticut gives $24,000 joint phasing out from $48,000 (not $30,000 from $30,000), and $19,000 head of household from $38,000.
Who it affected
Married and head-of-household filers in these states were shown the wrong state tax. It was mostly too much, and never more than the exemption at the state rate.
How we found it
Listed in stage 1 as needing each state's own document, then sourced.
What we changed
Each state's figures now come from its revenue department, quoted in the data (byFiling). Illinois: 2025 IL-1040 instructions, Line 10 Income Exceptions. Maryland: 2025 Resident Booklet, Exemption Amount Chart (10A); Maryland also counts each dependent now, since "Each Exemption is" $3,200. Kansas: K.S.A. 79-32,121b. Connecticut: CT-1040 TCS 2025, Table A.
What stops it recurring
tests/engines/state-filing.test.ts checks every band edge of each state's table, and a JSON-null regression test covers the city pages' payload, which the old-versus-new comparison caught mishandling Ohio before release.
The self-employment calculator ignored a business loss when working out income tax on wages
How far off: $1,200 a year too much for a $10,000 loss alongside $60,000 of wages (single).
What went wrong
When expenses were more than gross self-employment income, the page treated the profit as zero. A Schedule C loss goes on Schedule 1 line 3 and reduces the income tax on other income such as wages.
Who it affected
Readers with a loss-making side business and a job were shown too much income tax.
How we found it
Listed in stage 1, then fixed in stage 1b.
What we changed
A loss now reduces total income, up to the 2026 excess business loss limit of $256,000 ($512,000 joint; Rev. Proc. 2025-32 §4.31). It still owes no self-employment tax, and the page shows it as a loss.
What stops it recurring
tests/engines/state-filing.test.ts checks the loss offset and the §461(l) cap, and tests/retired-claims.test.ts fails the build if the page floors the profit at zero again.
Pages affected
/self-employment-tax-calculator
The W-4 calculator offered a Step 3 amount above the form's income limit
How far off: A $2,700 Step 3 figure shown for a single parent of two on $234,000; the withholding estimate itself was unaffected.
What went wrong
Form W-4 Step 3 is only "If your total income will be $200,000 or less ($400,000 or less if married filing jointly)". Above that the page still showed the phased-out credit as the amount to enter.
Who it affected
Higher earners with children were told to enter a Step 3 figure the form doesn't ask them for.
How we found it
Listed in stage 1, then checked against Form W-4 (2026) and Pub 505 (2026), neither of which gives a Step 3 figure above the limit.
What we changed
Above the limit the page now says Step 3 is not used. The tax estimate still counts whatever credit survives the phase-out.
What stops it recurring
tests/engines/state-filing.test.ts checks Step 3 at and above both limits.
Pages affected
/w4-calculator
The result notes on four calculators described what they model wrongly
How far off: No figure changed; the notes did.
What went wrong
The federal tax calculator's note said it "applies no tax credits", but it applies the child tax credit. The income calculator's note said it did not account for self-employment income, but it charges self-employment tax. The take-home and salary notes said state brackets were single-filer "unless you choose otherwise", but no choice changes them.
Who it affected
Readers were told the wrong thing about what the figure next to the note includes.
How we found it
Checking what each page implies about the refundable child credit, the other-dependent credit, QBI, capital-gains rates and the IRA phase-out, none of which the engines model.
What we changed
Each note now says what the calculator applies and what it leaves out: the refundable part of the child credit, the $500 other-dependent credit, capital-gains and qualified-dividend rates, the 20% QBI deduction and the IRA deduction limit. The self-employment and DoorDash notes now say QBI is not applied, and the state notes say joint filers get two exemptions but not joint brackets.
What stops it recurring
tests/retired-claims.test.ts fails the build if any of the three wrong wordings comes back, and tests/result-scope.test.ts still requires every note to be specific to its calculator.
The W-4 calculator used a $2,000 child tax credit on Step 3; Form W-4 (2026) says $2,200
How far off: $200 per qualifying child on Step 3. For a married couple on $3,000 every two weeks with two children, the withholding shown went from $38 to $23 a paycheck.
What went wrong
The W-4 engine used $2,000 per child, the amount before the 2025 tax law, and so did 14 statements across the W-4 page and the W-4 guide: the Step 3 instructions, a table, the phase-out note, the common-mistakes list and two worked examples ("2 x $2,000 + 1 x $500 = $4,500"; "With 2 kids it should be $4,000"). A child who turns 17 moves Step 3 down by $1,700, not the $1,500 the page said.
Who it affected
Parents were told to enter $200 per child too little on Step 3, so the withholding shown for them was too high.
How we found it
Checking the W-4 engine against Form W-4 (2026) Step 3 while moving it into src/calculators/.
What we changed
$2,200 per qualifying child. Source: Form W-4 (2026), Step 3(a): "Multiply the number of qualifying children under age 17 by $2,200". The amount is read from the one constant every calculator uses (CHILD_TAX_CREDIT).
What stops it recurring
tests/engines/w4.test.ts checks Step 3 at 2 x $2,200 + $500, and tests/retired-claims.test.ts fails the build if a $2,000 child tax credit is stated again anywhere on the site.
Pages affected
/w4-calculator, /blog/w4-allowances-guide
The W-4 calculator's FICA per paycheck left out the Additional Medicare Tax withheld over $200,000
How far off: 0.9% of wages over $200,000, spread over the year: $12 a paycheck at $234,000 paid every two weeks ($570 shown, $582 withheld).
What went wrong
The per-paycheck FICA figure counted social security and the 1.45% Medicare tax but not the 0.9% Additional Medicare Tax. An employer withholds that on wages over $200,000 in the year whatever the filing status.
Who it affected
Readers earning more than $200,000 from one job were shown a paycheck FICA figure that was too low.
How we found it
The old-versus-new comparison when the W-4 engine moved into src/calculators/.
What we changed
The figure now includes it. Source: 26 CFR 31.3102-4(a), "only to the extent the employer pays wages to the employee in excess of $200,000 in a calendar year. This rule applies regardless of the employee's filing status or other income".
What stops it recurring
tests/engines/w4.test.ts checks the $234,000 case to the dollar and that single and joint filers get the same figure.
Pages affected
/w4-calculator
The federal tax calculator used a $2,000 child tax credit; for 2025 and 2026 it is $2,200
How far off: $200 per qualifying child: $400 for a family of two children at $80,000 or $150,000. The worked example's total tax went from $13,053 to $12,853.
What went wrong
The calculator's script, its worked example and its FAQ all used $2,000 per child, the amount before the 2025 tax law. The tax-bracket page and a guide repeated it.
Who it affected
Parents were shown $200 per child too much federal tax, and the worked example on the page ($85,000, one child) showed $200 too much.
How we found it
Checking the federal calculator's figures against Rev. Proc. 2025-32 while moving it onto a single federal return engine.
What we changed
$2,200 per qualifying child for 2026. Source: Rev. Proc. 2025-32 §4.05, "the maximum amount of the credit allowed under § 24(a) is $2,200", with up to $1,700 refundable. The W-4 calculator's own copy is corrected in the next entry's commit.
What stops it recurring
tests/engines/federal-return.test.ts pins the credit to §4.05; the amount lives once, in src/data/federal-brackets.ts (CHILD_TAX_CREDIT), and every calculator reads it from there.
The child tax credit phase-out rounded the wrong way and counted 401(k) deferrals as income
How far off: Up to $50 from rounding. With a $10,000 401(k) in the phase-out range, $500 too little credit.
What went wrong
Above $200,000 ($400,000 joint), the credit falls by $50 for each $1,000 "(or fraction thereof)" of modified AGI over the line (26 U.S.C. 24(b)(1)), so the excess rounds up. The calculator rounded it down. It also tested an AGI that still included the reader's 401(k) deferral, which is not in W-2 wages.
Who it affected
Parents in the phase-out range were shown the wrong credit: up to $50 too much from the rounding, and $50 too little for every $1,000 they deferred into a 401(k).
How we found it
Writing the federal return engine's tests from Schedule 8812 (2025) line 10, which gives its own examples: an excess of $425 becomes $1,000, and $1,025 becomes $2,000.
What we changed
The excess now rounds up to the next $1,000 as Schedule 8812 line 10 does, and the phase-out tests AGI after the 401(k) deferral.
What stops it recurring
tests/engines/federal-return.test.ts checks both of line 10's own rounding examples and a $210,000 salary with $20,000 deferred keeping the full credit.
Pages affected
/tax-calculator
The federal tax and income calculators gave the full student loan interest deduction at any income
How far off: Up to $2,500 times the marginal rate: $600 too little tax at $150,000 single; $875 at $450,000.
What went wrong
Both calculators capped the deduction at $2,500 but never phased it out. For 2026 it starts shrinking above $85,000 of modified AGI ($175,000 joint) and is gone at $100,000 ($205,000).
Who it affected
Readers above the phase-out who entered student loan interest were shown up to $2,500 of deduction they cannot take, and so too little tax.
How we found it
The same federal return engine work, which had to implement the deduction the way Rev. Proc. 2025-32 describes it.
What we changed
The deduction now falls in proportion across the range. Source: Rev. Proc. 2025-32 §4.29. An earlier entry today cited these 2026 figures as section 3.29; they are paragraph .29 of section 4 (section 3 covers 2025), and the page citation is corrected.
What stops it recurring
tests/engines/federal-return.test.ts checks the deduction at the start, middle and end of both ranges; the phase-out figures live in src/data/federal-brackets.ts.
Pages affected
/tax-calculator, /income-calculator
The federal tax calculator left the Additional Medicare Tax off self-employment income
How far off: At $450,000 of self-employment income (single), $1,940 too little. At $450,000 of mixed income, $93 too much.
What went wrong
For self-employment income the calculator charged no 0.9% Additional Medicare Tax at all. For mixed wage and self-employment income it charged the wage part on an income figure that mixed the two. Form 8959 charges wages over the threshold (Part I), and self-employment income over a threshold reduced by those wages (Part II).
Who it affected
Self-employed readers above $200,000 ($250,000 joint) were shown too little tax. Readers with mixed income were shown a slightly wrong figure.
How we found it
The old-versus-new comparison after moving the calculator onto the federal return and self-employment engines: 180 inputs changed, all above the threshold with self-employment income.
What we changed
Additional Medicare Tax now follows Form 8959 Parts I and II, through the self-employment engine.
What stops it recurring
tests/engines/self-employment.test.ts pins Part II to the Form 8959 instructions' own examples, and tests/engines/federal.test.ts pins Part I.
Pages affected
/tax-calculator
The federal tax FAQ gave 2025's extra standard deduction for age 65 or blindness
How far off: $50 per person.
What went wrong
The FAQ said the additional standard deduction is $1,600 ($2,000 if single or head of household). Those are the 2025 amounts.
Who it affected
Readers aged 65 or over, or blind, were told a figure $50 lower than the 2026 amount.
How we found it
Reading Rev. Proc. 2025-32 §4.14 for the standard deduction while pinning the federal engine.
What we changed
$1,650, or $2,050 if unmarried. Source: Rev. Proc. 2025-32 §4.14(3), "the additional standard deduction amount ... for the aged or the blind is $1,650 ... increased to $2,050 if the individual is also unmarried".
What stops it recurring
tests/retired-claims.test.ts fails the build if the $1,600 ($2,000 if single) wording comes back.
Pages affected
/tax-calculator
The self-employment calculator counted the Additional Medicare Tax in the deductible half of SE tax
How far off: Half the Additional Medicare Tax, times the marginal rate. For $30,000 of SE income plus $180,000 of wages (single), the deduction was $715 instead of $681 and the total $8 too low.
What went wrong
The page added the 0.9% Additional Medicare Tax to self-employment tax, then deducted half of the total. Schedule SE line 13 is half of line 12, and line 12 is only the 12.4% and 2.9% parts. The Additional Medicare Tax is figured separately on Form 8959 and is not deductible.
Who it affected
High earners, whose SE earnings plus wages passed the Additional Medicare threshold, were shown a deduction that was too large and so slightly too little income tax.
How we found it
Moving the page onto a self-employment engine that follows Schedule SE line by line; the old-versus-new comparison showed the deduction change on exactly the high-income inputs.
What we changed
The deduction is now half of Schedule SE line 12 (Schedule SE (2025), line 13: "Multiply line 12 by 50%"). The Additional Medicare Tax is still shown and still counted in the total, on its own row. Source: Schedule SE (Form 1040) 2025, lines 10-13; Form 8959 (2025), Part II.
What stops it recurring
tests/engines/self-employment.test.ts checks that the line 13 deduction is half of line 12 with the Additional Medicare Tax left out, and pins that tax to the Form 8959 instructions' own Examples 1-3 and the Kathleen and Liam example ($180.00).
Pages affected
/self-employment-tax-calculator
Self-employment tax was charged below the $400 floor, which applies to net earnings, not profit
How far off: A $200 net profit on the DoorDash calculator was charged $28. The largest amount on the self-employment page was about $61, at $433 of profit.
What went wrong
Schedule SE line 4c says to stop if net earnings (92.35% of profit) are under $400, which means a profit under $433.14. The DoorDash calculator had no floor at all. The self-employment calculator applied $400 to profit, so it charged the tax on profits of $400 to $433.
Who it affected
Dashers with very small net profit after mileage were told they owed self-employment tax they do not owe. On the self-employment page this happened only in the narrow $400-$433 band.
How we found it
The old-versus-new comparison once both pages were moved onto the self-employment engine: 12 DoorDash inputs changed, all with net earnings under $400.
What we changed
Both pages use the engine, which stops at line 4c as the form does: "If less than $400, stop; you don't owe self-employment tax." DoorDash now also caps the social security part at the wage base after W-2 wages (lines 7-10) and charges the Additional Medicare Tax where it applies.
What stops it recurring
tests/engines/self-employment.test.ts checks $433 of profit (net earnings $399.88: no tax) against $434 ($400.80: taxed), and both pages call the one engine.
The self-employment calculator showed $0 tax for anyone with W-2 wages and SE profit under $400
How far off: The whole income tax on the wages: $5,020 for $60,000 of wages, single; $2,840 married.
What went wrong
When SE profit was under $400, the page stopped and set every figure to $0, including income tax on the W-2 wages entered in the same form. No self-employment tax is owed in that case, but income tax on the wages still is.
Who it affected
A reader with a side business that barely broke even, or made a loss, and a regular job was told their total tax was $0.
How we found it
The old-versus-new comparison: 12 inputs with wages and a sub-$400 profit changed from $0.
What we changed
Only the self-employment tax is zero below the floor. Income tax on wages plus any profit is worked out as usual, and the summary line says no SE tax is due. A business loss is still not netted against wages; that is a known limit.
What stops it recurring
tests/browser/engines.spec.ts loads the page with $60,000 of wages and a $300 profit and checks that SE tax is $0 while income tax is not; the page now takes its figures from the self-employment and federal engines rather than an early exit of its own.
Pages affected
/self-employment-tax-calculator
Paycheck calculators charged social security and Medicare on HSA contributions made through payroll
How far off: $229.50 a year on a $3,000 contribution; $336.60 at the 2026 self-only limit of $4,400.
What went wrong
The take-home page and the 25 city paycheck pages took an HSA contribution off income-tax wages but still charged social security and Medicare on it. The IRS says an HSA contribution made under a salary reduction arrangement in a section 125 cafeteria plan is not wages for either tax. The site's own HSA/FSA calculator already said so.
Who it affected
Anyone who entered an HSA contribution was shown a take-home figure that was too low, because 7.65% of the contribution was charged as tax. 401(k) deferrals were handled correctly: they are subject to social security and Medicare, and still are.
How we found it
Collapsing the site's five copies of the paycheck calculation into one engine meant choosing one rule for each input. Checking each rule against Publication 15 turned up this one.
What we changed
Social security and Medicare are now charged on wages less the HSA contribution, and still on the 401(k) deferral. Sources: Pub 15 (2026) p.20, "HSA contributions made under a salary reduction arrangement in a section 125 cafeteria plan aren't wages and aren't subject to employment taxes or withholding"; p.51, 401(k) elective deferrals are "Taxable" for social security and Medicare. The "Other pre-tax" field is not assumed to be a cafeteria-plan deduction, so it still carries social security and Medicare.
What stops it recurring
tests/engines/paycheck.test.ts pins the engine to a worked paycheck derived step by step from Pub 15 and Rev. Proc. 2025-32 ($85,000, $6,000 401(k), $3,000 HSA: FICA wages $82,000, net $61,837), and every paycheck page now calls that one engine (src/calculators/paycheck.ts).
The take-home calculator worked out state tax as if 401(k), HSA and other pre-tax deductions were not deducted
How far off: In California, $885.41 a year too much state tax on an $85,000 salary with a $10,000 401(k). The overstatement is roughly the state's marginal rate times the pre-tax amount.
What went wrong
The page took pre-tax contributions off federal taxable wages but charged state income tax on the full salary. The city paycheck pages, answering the same question, took them off state wages too, so the two disagreed. Most states start from federal wages and exclude the same deductions.
Who it affected
A reader who entered a 401(k), HSA or other pre-tax deduction was shown too much state tax in every income-tax state, apart from the specific exceptions below. The take-home figure was too low.
How we found it
The old-versus-new comparison run before the one paycheck engine was switched on. The city pages and the take-home page gave different answers to the same inputs.
What we changed
State wages now follow federal wages less pre-tax deductions, except where a state's own rules say otherwise. Pennsylvania keeps 401(k) deferrals in state wages: PA Personal Income Tax Guide, "Income Items Always Taxable as Pennsylvania Compensation". California and New Jersey keep payroll HSA contributions: 2025 Schedule CA (540) instructions, line 13, "California law does not conform"; 2025 NJ-1040 instructions, cafeteria plans "but not salary reduction or premium conversion plans". These rules sit in each state's data (wageRules), with the quotes.
What stops it recurring
tests/engines/paycheck.test.ts checks state wages for a following state (Illinois) and for each exception (Pennsylvania, California, New Jersey), and all five paycheck pages call the same engine, so they cannot disagree again.
Pages affected
/take-home-pay-calculator
Joint filers were given one state personal exemption instead of two
How far off: At $90,000 joint: $144.79 a year too much in Illinois ($2,925 x 4.95%) and $52.25 in Ohio. Similar amounts in other exemption states on the take-home and salary pages.
What went wrong
The take-home and salary pages gave every filer a single state exemption and credit, whatever the filing status. The city pages doubled them for joint filers. But in the three states whose exemption is a band table (Illinois, Maryland, Ohio), the doubled amount was overridden by the band's own single-filer figure.
Who it affected
Married couples filing jointly were shown too much state tax on the take-home and salary pages in every state with a personal exemption or credit. On the Chicago and Columbus city pages it applied only in those band-table states.
How we found it
The Illinois case was caught by a test written for the new paycheck engine, which checks that a joint filer's state tax is one exemption times the flat rate below a single filer's. The take-home and salary cases came out of the old-versus-new comparison.
What we changed
Every paycheck page now gives a joint filer the state exemption twice, doubles Utah's credit base and Iowa's exemption credit (as the city pages already did), and doubles the band amounts in Illinois, Maryland and Ohio. The bands' income limits are still the single-filer ones, which is a known limit: Illinois's is $500,000 for a joint return.
What stops it recurring
tests/engines/paycheck.test.ts asserts the Illinois joint-filer difference equals one exemption at the flat rate, which is how the band-table miss was found; the doubling lives in one function (calcStateIncomeTaxForFiling) that every paycheck page calls.
City paycheck pages let Pennsylvania 401(k) deferrals and California HSA contributions escape state tax
How far off: $307 a year on a $10,000 401(k) in Pennsylvania (3.07%); $279 on a $3,000 HSA in California at $90,000.
What went wrong
The city pages took every pre-tax contribution off state wages. That is right for most states but not for these two: Pennsylvania taxes 401(k) deferrals and California taxes HSA contributions.
Who it affected
A Philadelphia reader with a 401(k), or a Los Angeles, San Diego or San Francisco reader with an HSA, was shown too little state tax and a take-home figure that was too high.
How we found it
Deciding the one engine's rule for state wages meant checking the known exceptions against each state's own documents.
What we changed
These pre-tax amounts now stay in state wages for those states, using the state data rule and sources in the entry above. New Jersey has the same HSA rule; the site has no New Jersey city page.
What stops it recurring
tests/engines/paycheck.test.ts checks Pennsylvania, California and New Jersey state wages against their quoted rules.
The paycheck embed started the Additional Medicare Tax at $200,000 for joint filers instead of $250,000
How far off: Up to $450 a year (0.9% of the $50,000 between the two thresholds).
What went wrong
The embeddable paycheck widget applied the 0.9% Additional Medicare Tax above $200,000 whatever the filing status. That is the point where an employer starts withholding it. The tax a couple owes starts at $250,000 of combined wages for a joint return, and the site's other paycheck figures use that liability threshold.
Who it affected
A joint filer with wages over $200,000 was shown a lower take-home figure in the widget than the same inputs gave on the take-home page.
How we found it
The old-versus-new comparison: the embed was one of the five paycheck copies collapsed into one engine.
What we changed
The widget now calls the site's paycheck engine with no state, so it uses the Form 8959 thresholds: $250,000 joint, $200,000 single or head of household (line 5).
What stops it recurring
tests/engines/federal.test.ts pins the thresholds to Form 8959 Example 5 and 26 CFR 31.3102-4(b), and the widget no longer has maths of its own.
Pages affected
/embed/paycheck
The 2026 tax brackets guide said a $75,000 single filer saves about $180 on 2025; it is $279
How far off: Understated by $99, or about a third of the true figure.
What went wrong
The figure was typed into the guide, not worked out from the brackets and standard deductions printed in the same article. Working it out from them gives a different answer.
Who it affected
A reader comparing the two years was told the 2026 changes are worth about $180 to a single filer on $75,000 when they are worth $279. The direction was right, and nothing a reader would file depended on it. The tax bracket calculator itself computes correctly.
How we found it
Found while correcting the 401(k) figure in the same guide. Re-running the example from the site's own bracket data did not reproduce it, and Hub A asked for it to be corrected under the primary-source rule.
What we changed
Now $279 less ($7,670 against $7,949). 2025: $75,000 − $15,750 = $59,250 taxable; $5,578.50 + 22% × $10,775 = $7,949 (brackets from Rev. Proc. 2024-40, standard deduction from IRS Pub 501 for 2025). 2026: $75,000 − $16,100 = $58,900 taxable; $5,800 + 22% × $8,500 = $7,670 (Rev. Proc. 2025-32).
What stops it recurring
tests/retired-claims.test.ts fails the build if "$180 less" appears on any page. It was checked against the old text, which it catches.
Pages affected
/blog/2026-tax-brackets-explained
The HSA + 401(k) example used 2025's HSA limit and put the tax saving at about $4,100; it is $6,318
How far off: The saving was understated by about $2,200. The HSA contribution was $100 below the 2026 limit.
What went wrong
The example used $4,300 for the HSA, which is 2025's self-only limit. The paragraph just above it correctly gives $4,400 for 2026. The saving it quoted cannot be reached from any of its own numbers.
Who it affected
A reader weighing whether to max out both accounts was told it would save about $4,100 in federal income tax. At $95,000 single it saves $6,318, so the example undersold the move it was recommending. A reader who took $4,300 as the 2026 limit would have left $100 of HSA room unused.
How we found it
Same pass as the $180 correction: re-running the example from the site's bracket data, then checking the HSA limit against Rev. Proc. 2025-19.
What we changed
Now $4,400 + $24,500 = $28,900 pre-tax. Without it, taxable income is $95,000 − $16,100 = $78,900, taxed at $5,800 + 22% × $28,500 = $12,070. With it, taxable income is $50,000, taxed at $1,240 + 12% × $37,600 = $5,752. The saving is $6,318. Sources: Rev. Proc. 2025-19 (HSA $4,400) and Rev. Proc. 2025-32 (2026 brackets, $16,100 standard deduction). The text also no longer says "the top of the 12% bracket": $50,000 is just inside it, which ends at $50,400.
What stops it recurring
tests/retired-claims.test.ts fails the build on "$4,300 HSA", on $4,300 given as a 2026 HSA figure, and on "tax savings: roughly $4,100". It was checked against the old text, which it catches.
Pages affected
/blog/2026-tax-brackets-explained
The salary calculator gave 2025's HSA and FSA limits under a 2026 label
How far off: Both limits understated by $100.
What went wrong
The paycheck deductions table said "Up to $4,300 / $3,300" beside "2026 individual HSA limit; FSA cap". Those are the 2025 limits, and nothing updated them when the 2026 figures came out.
Who it affected
A reader planning 2026 payroll deductions from the table would have set their HSA $100 and their health FSA $100 below what they are allowed. That is up to $200 of pre-tax room left unused. The calculator's results did not use these figures.
How we found it
Found by searching the site for other copies of the $4,300 figure while correcting the HSA example in the 2026 tax brackets guide.
What we changed
Now "Up to $4,400 / $3,400". Sources: Rev. Proc. 2025-19 ($4,400 self-only HSA for 2026) and Rev. Proc. 2025-32 ($3,400 health FSA salary reduction limit under section 125(i)).
What stops it recurring
tests/retired-claims.test.ts fails the build on "Up to $4,300 / $3,300" and on $3,300 given within a sentence of an FSA. It was checked against the old text, which it catches.
Pages affected
/salary-calculator
The SALT deduction was still described as capped at $10,000; for 2026 the cap is $40,400
How far off: Understated the 2026 cap by $30,400 ($15,200 married filing separately) in text on four calculators and four guides. The reduction above $505,000 of modified AGI, down to a $10,000 floor, was not mentioned at all.
What went wrong
The pages were written while the Tax Cuts and Jobs Act's $10,000 cap applied (2018 through 2024) and were not revisited when the 2025 tax law raised it. The FAQ on the property tax calculator even named the TCJA as the source of the current rule.
Who it affected
Anyone deciding whether to itemize, or working out a W-4 Step 4(b) figure, was told they could count at most $10,000 of state and local taxes when the 2026 limit is $40,400 for most filers ($20,200 married filing separately). A homeowner in a high-tax state could have taken the standard deduction when itemizing was worth more, or under-claimed deductions on the W-4 and had too much withheld. No calculator used the $10,000 figure; it was in text only.
How we found it
The content-quality guard flagged the property tax FAQ for restating its page. It was held back from rewriting because the figure looked out of date, and checking it against the IRS confirmed that. A sweep of the site then found the other copies.
What we changed
Every current-rule mention now gives $40,400 for 2026 ($20,200 married filing separately), and where there is room, the reduction above $505,000 of modified AGI ($252,500) that stops at $10,000 ($5,000). Source: IRS, Correction to state and local income tax deduction amount in the 2026 Form 1040-ES (16 March 2026); for 2025, the Schedule A instructions ($40,000 and $500,000). Historical mentions of what the TCJA did in 2018 were left as they are.
What stops it recurring
tests/retired-claims.test.ts runs in the deploy gate and fails the build if a page or data file describes SALT as capped at, up to, or limited to $10,000 or $10K. It was checked against the old text, which it catches in all ten places.
The student loan interest deduction phase-out used 2024's income limits
How far off: The start of the phase-out was understated by $5,000 single and $10,000 joint, and the end by $5,000 and $10,000. That concerns up to $2,500 of deduction, worth up to $550 of tax in the 22% bracket.
What went wrong
The thresholds were copied from the 2024 figures ($80,000–$95,000 single, $165,000–$195,000 joint) and labelled 2026. The 2026 tax brackets guide gave a third, unsourced joint figure of $170,000.
Who it affected
A single filer with modified AGI between $95,000 and $100,000 was told the deduction was gone when part of it is still available. Between $80,000 and $85,000 they were told it was already shrinking when the full $2,500 applies. Joint filers were misled the same way between $165,000 and $175,000, and between $195,000 and $205,000.
How we found it
The content-quality guard flagged the student loan calculator's FAQ for restating its page. It was held back from rewriting because the figures looked like 2024's, and Revenue Procedure 2025-32 confirmed that. A sweep then found the same figures in three guides.
What we changed
Every mention now gives the 2026 range: the deduction starts shrinking above $85,000 of modified AGI ($175,000 joint) and is gone at $100,000 ($205,000 joint). Source: IRS Rev. Proc. 2025-32, section 3.29. The FAQ was rewritten from a different angle so it no longer repeats the page.
What stops it recurring
tests/retired-claims.test.ts fails the build if $80,000, $95,000, $165,000, $170,000 or $195,000 (or the $K forms) appears within 400 characters of a mention of student loan interest. It was checked against the old text, which it catches in all seven places.
Amended-return guidance split processing time by e-file and paper, quoted a 20-week IRS estimate, and said refunds could not be direct-deposited
How far off: The IRS's upper bound was overstated by 4 weeks, and the unsourced table ran to 50+ weeks. Three separate claims were contradicted by IRS text.
What went wrong
The tax returns page gave 8–12 weeks for e-filed amendments and up to 16 for paper, a split the IRS does not make. The amended-return guide put "up to 20 weeks" in quotation marks as the IRS's estimate, which its current pages do not say, and gave a table of e-filed and mailed timings with no source. The same guide said amended-return refunds generally can't be direct-deposited, and that 1040-X e-filing covers tax years 2019 and later. The IRS's own instructions contradict both.
Who it affected
A reader was told to expect up to 20 weeks, and to wait that long before escalating, when the IRS says 8 to 12 weeks, and up to 16 in some cases. Someone who e-filed was told they could not take the refund by direct deposit, when on an e-filed 1040-X they can. Someone amending an older year may have tried to e-file a return the IRS only accepts on paper.
How we found it
The content-quality guard flagged the tax returns FAQ for restating its page. It was held back from rewriting because it split timing by filing method. The IRS pages settled it, and reading the linked guide against the same pages found the rest.
What we changed
Both pages now give the IRS timeline: generally 8 to 12 weeks, up to 16 in some cases, with status available about 3 weeks after filing online or on 866-464-2050. They say the IRS gives one timeline for e-filed and paper amendments; its FAQ says e-filing may save one or two weeks of mailing time. They also say direct deposit is available on an e-filed 1040-X (tax year 2021 or later) while a paper one is refunded by check, and that e-filing covers the current and two prior tax periods. The unsourced table and an unverifiable claim that the tool updates overnight were removed. Sources: IRS Where's My Amended Return, Topic 308, the amended return FAQ and the Form 1040-X instructions.
What stops it recurring
tests/retired-claims.test.ts fails the build on "up to 20 weeks", on week counts tied to e-filed, paper or mailed amendments, on refunds described as generally not direct-deposited, and on 1040-X e-filing "for tax years 2019 and later". It was checked against the old text, which it catches in all seven places.
Pages affected
/tax-returns, /blog/wheres-my-amended-return
The 2026 401(k) limit at age 50 and over was given as $32,750; it is $32,500
How far off: Overstated by $250.
What went wrong
The figure was typed by hand into the guide instead of read from the site's own data, which already had $32,500. The $24,500 base limit beside it was right; the total did not match it plus the $8,000 catch-up.
Who it affected
A reader aged 50 or over who set their payroll deferral to reach the stated maximum would go $250 over the limit, and an excess deferral has to be corrected. The guide also left out the higher $11,250 catch-up for ages 60 to 63. The 401(k) calculator itself was not affected.
How we found it
Found on the first run of verify-lastmod-render, which lists pages that print a pinned 2026 figure typed by hand rather than rendered from its data file.
What we changed
Now $32,500 at 50 and over ($24,500 plus the $8,000 catch-up), and $35,750 at ages 60 to 63. Source: IRS news release IR-2025-111 (13 November 2025).
What stops it recurring
tests/retired-claims.test.ts fails the build if $32,750 appears on any page or in any data file. verify-lastmod-render keeps listing hand-typed copies of pinned figures after each build, so the next stale copy is visible.
Pages affected
/blog/2026-tax-brackets-explained
The 2026 tax brackets guide gave the wrong income limits for deducting a traditional IRA
How far off: The start of the phase-out was overstated by $3,500 single and $4,500 joint, and the end ($91,000 / $149,000) was missing.
What went wrong
The guide said deductibility "phases out above $84,500 AGI (single) or $133,500 (married)". Neither figure matches the IRS's 2026 ranges, and neither gave an end point. It came to light while fixing the 401(k) figure in the next paragraph against the same IRS release.
Who it affected
A single filer covered by a workplace plan with modified AGI between $81,000 and $84,500 was told they got the full deduction when it was already reduced. A reader above $91,000 was given no sign that the deduction had run out. Married joint filers were misled the same way between $129,000 and $133,500, and above $149,000.
How we found it
Found by reading the rest of the retirement paragraph against IRS news release IR-2025-111 while correcting the 401(k) figure.
What we changed
Now: when covered by a workplace plan, deductibility phases out between $81,000 and $91,000 of modified AGI (single) or $129,000 and $149,000 (married filing jointly). Source: IRS IR-2025-111. The MAGI guide already had the single range right.
What stops it recurring
tests/retired-claims.test.ts fails the build if $84,500 or $133,500 appears within 300 characters after a mention of an IRA. It was checked against the old text, which it catches.
Pages affected
/blog/2026-tax-brackets-explained
The pro-rata FAQ had it backwards on who the actual-days method favours
How far off: On the page's own $2,400 rent example, $2.58 a day in a 31-day month ($77.42 against $80.00), or $30.97 over 12 days.
What went wrong
The FAQ said actual-days proration favours the landlord in 31-day months and the tenant in 28-day months. For rent paid on the days you occupy, the reverse is true: rent ÷ 31 is a smaller daily rate than rent ÷ 30, and rent ÷ 28 a larger one. The table on the same page already had it right.
Who it affected
A tenant or landlord choosing between the two methods from the FAQ alone would have backed the wrong one. The calculator's results and the comparison table were correct throughout.
How we found it
The answer contradicted the comparison table on its own page, which was noticed during the FAQ review that came with the content-quality guard.
What we changed
The FAQ now says that, when you pay for the days you occupy, actual-days favours the tenant in 31-day months and the landlord in February, and that the effect reverses for a refund of unused days. This is arithmetic; no government source applies.
What stops it recurring
tests/retired-claims.test.ts fails the build if any page says the landlord is favoured in 31-day months or the tenant in 28-day months or February. It was checked against the old text, which it catches.
Pages affected
/pro-rata-calculator
The BAH calculator was unreachable: an old redirect sat on top of the new page
How far off: One page, entirely inaccessible, for five days. No figure was wrong; the page simply could not be reached.
What went wrong
A redirect sending /bah-calculator to /military-pay-calculator was added in a bulk batch on 28 May, when no such page existed and the rule was correct. The page itself was created on 4 September. Nothing connected the two events, and redirects are evaluated before the filesystem, so the redirect kept winning.
Who it affected
For five days the BAH calculator could not be opened at all. It is linked from 470 pages, so anyone following that link — from the homepage, from /military-pay-calculator, from any state page footer — was bounced to the military pay calculator instead. The site was also telling Google two contradictory things about it: the sitemap listed it as canonical and index-follow, while the server returned a permanent redirect away from it.
How we found it
Preparing the Cloudflare migration. Translating the redirect table meant listing every redirect source, and comparing that list against the pages the build produces is a natural thing to do once you have both — one source collided.
What we changed
The redirect is removed; the page is the newer and clearly intended thing, being self-canonical, index-follow, in the sitemap, registered in the site's own page metadata and linked site-wide. Ninety-eight redirect chains were collapsed in the same pass — /a to /b to /c now goes straight to /c. Those cost a round trip rather than an answer, so nothing was wrong for a reader, but they were free to fix.
What stops it recurring
A postbuild check compares every redirect source against every page the build produced and fails if one shadows the other, and separately fails on any chain or any rule pointing at a path that does not build. It runs after the build because both questions need to know which pages exist. Its real target is not redirects but the act of ADDING A PAGE at a path already spoken for, which is how this happened and which nothing previously noticed. Its own first run flagged a false positive — it scanned only the top level of dist, and 477 of the 479 pages are nested — which is fixed and worth recording, because a checker that cries wolf gets ignored.
Pages affected
/bah-calculator
Seven more city sales tax rates confirmed, including three that had to be proved zero
What went wrong
Not an error. These were the last rates that could be reached at all, and none had been checked against the authority that sets it.
Who it affected
None found. All seven were already correct.
How we found it
Three of them were the awkward kind: a rate of zero. You cannot verify zero by failing to find a tax, so each needed a document that says there is none. Montana took two — its Department of Revenue stating it has no general sales tax, and the statute limiting resort taxes to communities under 5,500 people, which excludes its three largest cities by its own terms. Fairbanks took two as well: the state saying it levies no sales tax, and the city enumerating every tax it does levy, a general one not being among them.
What we changed
Nothing to correct. Phoenix 9.1%, Mesa 8.3%, Chandler 7.8%, Springfield 8.1%, and zero for Billings, Bozeman, Missoula, Fairbanks and Anchorage. Anchorage came last and by an unusual route: its own site refuses connections and the state publication that would settle it is a PDF behind a block, but the same data exists as a queryable map layer, where the Municipality's most recent row records its sales tax as N/A against a 12% bed tax — an absence on the record rather than a missing record.
What stops it recurring
All seven joined the golden table the build checks, taking it to 124 rates across 40 states, and the zeroes are held there as firmly as the rest — mutation-tested by setting Fairbanks to 5% and Billings to 3%.
Nine state calculators offered a "claim no exemptions" option that did nothing
How far off: Up to the state's whole exemption. In Connecticut that is $15,000 of income taxed at up to 6.99%, close to $1,000 a year.
What went wrong
Two kinds of state exemption were handled by two branches of the same function, and they disagreed about zero. A per-person exemption multiplies by the number claimed, so claiming none gave none by arithmetic. A flat exemption ignored the number entirely and applied in full — so in the nine states with a flat exemption, choosing "0, None" changed nothing at all.
Who it affected
Anyone in those nine states who told the calculator they were claiming no exemptions was still given the full one, and shown less tax than they would owe. Connecticut was the largest at $15,000 of exemption, then Kansas at $9,160 and Mississippi at $6,000.
How we found it
Found while checking something else. After correcting the Kansas exemption, exercising the dropdown on the live page showed that selecting "None" left the answer unchanged — and the same branch turned out to govern eight other states. This one had nothing to do with the Kansas change; it had been there as long as the control had.
What we changed
There were two independent faults, and both had to go for the option to work. The engine treated a flat exemption as unconditional, and the page read the reader's choice as `parseInt(value) || 1` — in which zero, being falsy, silently becomes one. Either alone would have kept the control inert. Both are fixed, in the paycheck engine, in the separate engine behind the federal calculator, and on the page.
What stops it recurring
Two, because the two faults are different in kind. A test sweeps all 51 jurisdictions at three incomes and requires zero, with a floor on how many must still give a positive exemption at one so it cannot pass vacuously. And a build check scans page sources for a parseInt with a non-zero || fallback on any field named for an exemption, dependent or allowance — the class of bug that hides in an inline script where no unit test reaches. It found a second instance on its first run, which turned out to be correct because that one falls back to zero. Both mutation-tested.
The Kansas exemption fix shipped without the control for claiming dependents
What went wrong
Correcting the Kansas exemption meant marking it as not-per-person, because the filer's own $9,160 does not multiply. The exemptions dropdown keys off that same flag, so it collapsed to 'Standard' and 'None' — leaving the new $2,320-per-dependent amount modelled in the engine but unreachable from the page.
Who it affected
For about twenty minutes, a Kansas filer with dependents could not tell the calculator about them and was shown $2,320 too little exemption for each one, roughly $129 a year too much tax apiece. The single-filer figure, which is what most readers use, was correct throughout.
How we found it
Driving the deployed page rather than trusting the payload. The rate and the stored figures were right, and only exercising the control showed that the option to claim a dependent had gone.
What we changed
The dropdown now has a third shape for this kind of exemption, offering 'Self + N dependents'. It deliberately does not copy the per-person wording: a Kansas couple filing jointly gets a larger base rather than two single exemptions, so 'Self + Spouse' would be wrong.
What stops it recurring
Recorded as its own entry rather than folded into the correction above, because it reached readers. The general lesson is the one that found it: verifying a data fix by reading the payload is not the same as verifying it by using the page, and a change to a field that drives both the maths and the interface has to be checked in both.
Pages affected
/kansas-paycheck-calculator
Kansas take-home pay was understated: the personal exemption was four times too small
How far off: About $386 a year too much state tax at any income above roughly $36,000, and $364 at $30,000. The whole $6,910 shortfall in exemption sits in the 5.58% band for most earners.
What went wrong
Kansas replaced its old flat $2,250-per-person exemption in the 2024 special session with a much larger allowance: $9,160 for the filer, $18,320 for a married couple, and $2,320 for each dependent. We still had the $2,250. The figure was two years out of date.
Who it affected
Unusually for this log, the error ran in the reader's favour and against us: too little exemption meant too much tax and too little take-home pay. Kansas users were shown less money than they actually keep.
How we found it
A previous pass had already flagged this as a suspicion and deliberately left it alone, because ksrevenue.gov refuses connections from here and a suspicion is not a source. What changed was the Minnesota lesson: when a state's revenue department is blocked, its legislature usually is not. Only the Department of Revenue's address range is unreachable — the Revisor of Statutes answers normally. That earlier note also had the replacement figure wrong, reading the $2,320 dependent amount as the exemption itself; the filer's own is $9,160.
What we changed
The exemption is now $9,160 with $2,320 for each dependent. That shape — a base for the filer plus a smaller amount per dependent — could not be expressed before, since an exemption was either flat or multiplied per person, so the engine gained a dependentExemption field that supersedes the per-person one.
What stops it recurring
Four tests: the filer's own amount, the dependent arithmetic at two, four and zero exemptions, the size and direction of the error, and one asserting that the twelve genuinely per-person states are unaffected by the new field. Mutation-tested four ways, including reverting to per-person with the new base, which would multiply $9,160 by the number of exemptions. The existing check that client payloads carry every field the engine reads caught two pages that needed the new one before any test did.
Pages affected
/kansas-paycheck-calculator, /paycheck-calculator
Sitka's sales tax changes with the season and we showed one rate all year
How far off: 1 percentage point, 5% shown against an actual 6%, every 1 April to 30 September.
What went wrong
The City and Borough of Sitka charges 6% from 1 April to 30 September and 5% from 1 October to 31 March. We stored a flat 5%, so the figure was right for the winter half of the year and a point low for the summer half — including on the day this was found.
Who it affected
Sitka sales tax was understated by a full percentage point for six months of every year, $10 on a $1,000 purchase.
How we found it
Reaching the last unverified city rates. Sitka's own site blocks scripted requests, so this came from its Business Resources page read in a browser, where the rate is given as two lines rather than one.
What we changed
City rates can now carry a note, which is shown beside the rate in the table and marks the entry as seasonal in the calculator's city menu. Sitka is stored at whichever rate is in force and its note gives both, with the dates.
What stops it recurring
A build check that is deliberately time-dependent, the only one on the site: it reads the month and fails if the stored rate is not the one in force, naming the rate it should be. It will fail on 1 April and 1 October, which is the intent — those are scheduled data changes, and a build that stops with instructions beats a page quietly stating last season's rate. The same pattern already governs re-verification deadlines. Mutation-tested three ways, including simulating the October rollover.
Pages affected
/alaska-sales-tax, /sales-tax-calculator
Twelve more city sales tax rates confirmed at the state, and Virginia came back online
What went wrong
Not an error — a gap. These rates had never been checked against the authority that sets them, and were recorded as unverified for that reason.
Who it affected
None found. All twelve were already correct.
How we found it
Virginia's tax site had been down for a platform migration and came back ahead of the date it advertised. Florida's 2026 surtax table turned out to exist under a versioned filename while the link labelled 'current' still served the 2025 edition — worth noting, because taking the current link at its word would have left us checking against a year-old document.
What we changed
Nothing to correct. Virginia's four cities, Mississippi's two, Florida's four, Whitefish's resort tax and Juneau's 5% are all confirmed as published.
What stops it recurring
All twelve joined the golden table of externally confirmed rates that the build checks, taking it to 110 across 37 states.
Three states' payroll deductions were missing from take-home pay
How far off: Minnesota about $264 a year at a $60,000 salary, rising to $811.80 once earnings pass $184,500. Alaska $200 at $40,000 and a flat $271 above $54,200. Pennsylvania $42 at $60,000, and unlike the other two it never stops, because Pennsylvania puts no ceiling on the wages it charges.
What went wrong
Minnesota Paid Leave, and the employee unemployment contributions Alaska and Pennsylvania charge. All three come straight out of a paycheck, and none was modelled. They were the last three on a list of eight programmes we had recorded as known-about but unsourced, because the pages carrying the rates could not be reached.
Who it affected
Take-home pay was shown too high in all three states. Minnesota Paid Leave only began on 1 January 2026, so that one had been wrong since the programme started.
How we found it
Going back to the three states after the same problem in Wisconsin turned out to be our own DNS rather than the state blocking us. Alaska and Pennsylvania both publish the rate plainly once you find the right page. Minnesota does not: its site is behind a CAPTCHA we will not answer, and its statute is a trap, printing 0.7% while a separate subdivision lets the commissioner change it. The statute itself pointed to the way in, requiring the actuarial work to be filed with the Legislative Reference Library, and the legislature's own domains are not blocked. The rate came from the programme's presentation to the House Workforce Committee on 24 February 2026.
What we changed
Minnesota 0.44% to the FICA ceiling, Alaska 0.50% on the first $54,200, Pennsylvania 0.07% on everything. Each state's payroll note now describes its own deduction instead of saying there isn't one. The list of unmodelled programmes is now empty.
What stops it recurring
Three tests pin the rates, and two pin the things most likely to be got wrong: that Pennsylvania has no wage cap, and that Minnesota's cap equals the federal Social Security wage base rather than being a number of its own — the statute defines it as the FICA maximum, so it must move when that moves. Mutation-tested five ways, including substituting the $185,000 the source rounds to for the actual $184,500. The build check that guarded the unmodelled list was rewritten, since an empty list can no longer mean the list was deleted: it now requires the export to exist and the count of modelled programmes not to fall below 15.
Three Illinois cities missed a rate rise that took effect five weeks ago
How far off: Aurora 8.25% against an actual 8.5%, Naperville 7.75% against 8%, Joliet 8.75% against 9%. New York City 8.88% against 8.875%.
What went wrong
On 1 August 2026, 301 of Illinois's 1,595 taxing jurisdictions raised their local rate by exactly 0.25 points. We had picked up Chicago's increase to 10.5% but not Aurora, Naperville or Joliet. Separately, New York City was stored as 8.88% when the state publishes it as 8 7/8, which is 8.875%.
Who it affected
Illinois estimates for those three cities were a quarter point low — $2.50 on a $1,000 purchase. The New York City figure was half a cent per $100 high, which is negligible in practice but is still not the published rate.
How we found it
Extending the verification sweep from the 24 Streamlined states to the largest states that publish their own rate files. California, Texas and New York's counties all matched; Illinois did not. The Illinois Department of Revenue's machine-readable jurisdiction file carries both the current and the prior period, so the change and its date could be read off directly rather than inferred.
What we changed
Aurora to 8.5%, Naperville to 8%, Joliet to 9%, New York City to 8.875%. The Illinois rate commentary now names the 1 August 2026 increase and warns that any Illinois figure quoted from before it is a quarter point low. A stale cross-state comparison describing Illinois as '~8.82% Chicago combined', which was neither Chicago's rate nor the state average, was corrected in the five state pages that repeated it.
What stops it recurring
All 17 of these cities joined the golden table of externally confirmed rates that the build checks, taking it to 78 across 28 states. Mutation-tested on Aurora, New York City and Houston.
Columbus, Ohio sales tax was shown as 7.5% when it has been 8% since April 2025
How far off: 0.5 percentage points, 7.5% against an actual 8%. Franklin County is Ohio's most populous.
What went wrong
Ohio's combined rate is the state rate plus a county tax plus, in three counties, a transit levy. Our Columbus figure was the 5.75% state rate plus Franklin County's 1.25% plus the Central Ohio Transit Authority's old 0.5%. COTA doubled to 1% on 1 April 2025 and we never picked it up. The rate had been wrong for seventeen months.
Who it affected
Anyone estimating sales tax on a Columbus purchase was shown half a percentage point too little — $5 on a $1,000 purchase, $25 on a $5,000 one.
How we found it
A sweep of all 66 city rates we publish in the 24 Streamlined Sales Tax states, against the rate files those states certify themselves. Sixty-five matched to the cent. Columbus did not, and the Ohio Department of Taxation's own county rate table confirmed 8%. The same sweep confirmed Cleveland at 8% and Cincinnati at 7.8%, so this was one stale levy rather than a broken method.
What we changed
Columbus corrected to 8%, and the FAQ and rate commentary rewritten to say that Cleveland and Columbus are now tied as Ohio's highest, with the COTA increase named and dated.
What stops it recurring
A new build check holds all 66 externally confirmed city rates as a golden table with the date they were confirmed, so any of them silently changing fails the build rather than shipping. Mutation-tested against four cities in four states, including reverting Columbus to 7.5%.
Pages affected
/ohio-sales-tax, /sales-tax-calculator
Wisconsin's standard deduction was applied in full at every income
How far off: About $211 a year understated at $60,000. From $136,453 up, where the state allows no standard deduction at all, we were still deducting the whole $13,960: that is $740 a year against the 5.3% band, rising to $1,068 for top-bracket earners above roughly $333,000 where the same deduction sat against the 7.65% rate.
What went wrong
Wisconsin's standard deduction is a sliding scale, not a fixed amount. A single filer keeps the full $13,960 only up to $20,119 of Wisconsin income, then loses 12 cents of it per additional dollar, and has none at all above $136,453. We stored the headline $13,960 and gave it to everyone.
Who it affected
Wisconsin take-home pay was shown too high, and state tax too low, for anyone earning more than about $20,000 — which is nearly every user of that page. The error grew with income.
How we found it
The figure was already known to be wrong and was disclosed on the page itself, because two earlier passes could not reach revenue.wi.gov to get the real schedule. The third attempt established why: the domain does not resolve through this machine's DNS resolver, but resolves normally through a public one. It was never the state refusing us. Pinning the address made the site available immediately.
What we changed
Implemented as a continuous 12% taper from $20,120, taken from the Wisconsin Department of Revenue's 2026 Form 1-ES instructions, which state the rule as a formula. The same document confirmed our 2026 brackets and $700 exemption. Notably, the Form 1 booklet renders the same rule as a lookup table of $500 bands; copying that rendering would have frozen the deduction inside each band and been subtly wrong everywhere.
What stops it recurring
Four tests pin the schedule: both edges of the seam at $20,119/$20,120, the taper at two incomes, the published zero point at $136,453 (which is a check on the rate and the start together, since 13,960/0.12 + 20,120 lands exactly there), and an assertion that the deduction is continuous rather than banded. Each was mutation-tested: shifting the start by one dollar, moving the rate by 0.2 of a percentage point, or adding band-stepping all make the suite fail.
Fifty map links had no name, and results updated silently
How far off: The unnamed links were 50 per page across 51 state pages. The silent results covered 262 calculator pages. The dead button reached nobody: it existed only between two unpushed commits, and the deployed site never carried it.
What went wrong
An automated accessibility audit against the WCAG 2.2 AA target the project names. Six of what it found were live on the site. One was not: the homepage search button's id attribute had swallowed its entire class list, leaving it with no id, no styling, no accessible name and — because the click handler binds to #searchBtn — no handler. That one was ours and recent, introduced by an earlier commit in this same sweep and caught before it was ever deployed. It is recorded because we broke it, not because anyone met it.
Who it affected
On every state page, the fifty clickable states in the US map were announced by a screen reader as unnamed links, and the map declared itself a single image while containing fifty focusable children. Calculator results updated silently: a sighted user watched the number change, a screen-reader user was told nothing, because the only live region on the page was the copy-to-clipboard toast.
How we found it
axe-core run in a real browser against representative pages, plus a static sweep over all 478 built pages for the things a sampled audit cannot cover. The dead button was found because it had no accessible name; that it also had no handler only became clear on reading the source.
What we changed
Search button restored. Map links named and the img role dropped. A debounced polite live region now announces the result, which is what R8.3 asks for rather than firing on every keystroke. Contrast fixed on the three action buttons, the homepage category counts and the embed footer, all of which sat between 2.56:1 and 4.01:1 against the 4.5:1 the target requires. Scrollable tables made keyboard-reachable at runtime, since whether a table overflows depends on the viewport. Embed pages gained a main landmark, and the embed code handed to other sites gained an iframe title — we were exporting a WCAG failure into other people's pages.
What stops it recurring
A new .scripts/verify-a11y.mjs runs on every build over every page, checking accessible names, alt text, language, landmarks and that ARIA references point at elements that exist; it was mutation-tested by breaking an aria-labelledby and removing a lang attribute. Its first version reported 466 pages of missing labels that were not missing at all — the site wraps its inputs in labels rather than using for= — and that is why every finding here was checked against axe or the source before being treated as real.
Five of the eight unreachable payroll programmes were reachable after all
How far off: At a $60,000 salary: Rhode Island $660 a year, Hawaii and Maine $300, Massachusetts $276, Delaware $240. Rhode Island's is the second largest state payroll deduction on the site after California's.
What went wrong
Eight states were recorded as running an employee-paid payroll programme this calculator does not apply, because their websites refused to serve a readable page. That was true of the URLs tried and not of the states: five of the eight had the figures published somewhere reachable.
Who it affected
Take-home pay was overstated for every worker in those five states.
How we found it
Retrying each blocked source by a different route after South Carolina showed that a department not having published something is not the same as the figure being unavailable. Arizona's Cloudflare challenge cleared on a second attempt in a real browser; Rhode Island's did too; Massachusetts served a differently-named page; Hawaii's PDF read through the same in-page parser used for its tax announcement; Maine's and Delaware's figures were in employer guides rather than on the rate pages.
What we changed
Rhode Island 1.1% on the first $100,000, Massachusetts 0.46% and Maine 0.5% and Delaware 0.4% to the Social Security base, Hawaii 0.5% to a $1,500.21 weekly base. Each hits the state's own published annual maximum exactly. Minnesota, Pennsylvania and Alaska remain unmodelled and remain on the list.
What stops it recurring
Every one of the five is tested against the dollar ceiling its state publishes, which checks the rate and the cap together — a wrong rate with a compensating cap would still miss. A separate test pins the unmodelled list to exactly the three that are left, so it has to shrink as states are added rather than quietly overstating what is missing. Also recorded plainly, because it changes what the number means: in the states where the employer and employee share the cost, what is shown is the employee's standard half, and an employer may absorb more.
Arizona's standard deduction was an assumption, and the assumption held
How far off: None. Had the doubt been right it would have been about $17 a year, and the doubt was reasonable enough to be worth writing down.
What went wrong
Arizona's $16,100 rested on the belief that the state conforms to the federal standard deduction, which had never been confirmed because azdor.gov would not serve a page. Reading the statute made it look wrong: A.R.S. 43-1041(H) does not adopt the federal figure, it indexes Arizona's own $12,200 base from 2019 'in the same manner' — and the federal amount has since been raised by statute, not only by indexation.
Who it affected
None for the reader: Arizona filers were shown the right figure all along. The change is to what the site can honestly claim about it, from an assumption nobody had checked to a figure confirmed against the state.
How we found it
Retrying azdor.gov in a real browser after the Cloudflare challenge cleared on a second attempt.
What we changed
No change. Arizona's published 2025 amounts are $15,750, $31,500 and $23,625, which are the federal post-OBBBA figures to the dollar, so the department does track the federal amount including statutory increases. Recorded here rather than left silent because the reasoning that produced the doubt is sound and someone reading the statute will have it again.
What stops it recurring
The provenance register now carries the evidence rather than the assumption, so the next person to notice what 43-1041(H) says will find the answer instead of re-deriving the worry.
South Carolina's new deduction shrinks from $40,000 of income, and we gave it in full
How far off: About $284 a year at a $60,000 salary. $781 at $95,000 and above, where the deduction is gone entirely.
What went wrong
H.4216 replaced the federal standard deduction with a $15,000 South Carolina Income Adjusted Deduction, and that deduction is withdrawn as income rises. We applied the full $15,000 at every income. This had been recorded as unmodelled on the grounds that SCDOR had not published the threshold — which is still true, and was the wrong place to stop looking, because the enacted act publishes it.
Who it affected
South Carolina filers earning more than $40,000 were shown less state tax than they owe, and more take-home pay. Unlike most phase-outs on this site, this one bites at ordinary wages rather than only at the top.
How we found it
Going back to the items already on the register and asking, for each one that was blocked, whether it was blocked on the right thing. SCDOR's page says only that the amounts 'may be reduced based on income as described in the bill'. The bill is Act 110, and it is public.
What we changed
The deduction now falls in proportion to federal AGI above $40,000 across a $55,000 window, reaching zero at $95,000. The act's rounding rule is applied as written: the REDUCTION is rounded down to a multiple of ten, not the deduction, which leaves the filer $10 better off at most incomes than rounding the other quantity would.
What stops it recurring
tests/state-tax.test.ts pins the rounding to the reduction rather than the deduction with a comment explaining which way the $10 falls, and separately checks that Maine — which shares the same linear branch and has no rounding rule — did not silently acquire one.
Four states kept giving allowances they withdraw from high earners
How far off: Rhode Island the largest, about $986 a year once both allowances are gone. Maine about $379, California up to $153, Illinois $145.
What went wrong
Illinois disallows its exemption outright above $250,000, California tapers its exemption credit away, Maine tapers its personal exemption, and Rhode Island withdraws BOTH its standard deduction and its exemption over the same range. All four were being granted in full at every income. Each had been recorded as a known gap; this closes the last of them.
Who it affected
Filers in these four states above the relevant thresholds were shown less state tax than they owe.
How we found it
Working through the gaps already on the register rather than waiting to rediscover them.
What we changed
Illinois is a cliff, California a $6-per-$2,500 taper with the steps rounded up, Maine a smooth taper over $125,000, Rhode Island a 20%-per-step withdrawal of both allowances. Three figures were wrong in the record and had to be replaced with published ones: Rhode Island's range is $261,000 to $290,800 for 2026, not the $254,250 we had noted, which is the 2025 figure; Maine's exemption phase-out begins at $341,000, where the statute's own $266,700 is a 2018 base that is inflation-adjusted; and California's threshold is $252,203, from FTB's AGI Limitation Worksheet.
What stops it recurring
Rhode Island's step is stored as 20% rather than as the $2,240 it currently works out to, so it cannot drift when the state re-indexes the deduction; a test raises the deduction and checks the step follows. The existing invariant that a deduction phase-out must declare exactly one mechanism caught Rhode Island's new shape immediately and now knows about all three. Maine's test asserts both of its windows at once, because the exemption and the deduction taper over completely different ranges and confusing them is the obvious mistake.
New York's recapture was modelled for one tier out of five
How far off: $2,614 a year at $400,000, where the effective rate goes from 6.06% to 6.71%. Considerably more at the top: a $1,200,000 filer was understated by about $32,700.
What went wrong
New York claws back the benefit of its lower brackets through five published worksheets, and only the first was implemented. Above $215,400 of taxable income the state stops blending toward a flat rate and starts adding fixed dollar amounts instead; above $25,000,000 it abandons the graduated schedule entirely for a flat 10.9%. The record of this gap named $323,200 as the threshold, which is the married-filing-jointly figure — for a single filer it begins at $215,400, more than $100,000 earlier than we had written down.
Who it affected
New York filers above roughly $223,000 were shown less state tax than they owe.
How we found it
The same high-income sweep that found Connecticut: New York showed 6.06% at $400,000 against a schedule whose marginal rate there is 6.85%.
What we changed
Worksheets 8, 9 and 10 now add their published recapture base and incremental benefit amounts, and worksheet 11 replaces the schedule above $25,000,000. New York selects its worksheet on BOTH income and taxable income, and the two disagree in the band between $215,400 and $223,400 where the standard deduction sits between them; the model carries both conditions, so filers in that band correctly stay on worksheet 7.
What stops it recurring
tests/state-tax.test.ts reproduces all seven of New York's published rate-schedule base amounts, asserts the worksheet-8 formula as the worksheet states it rather than as a constant, and walks the tax from $90,000 to $6,000,000 in $2,500 steps checking it never falls — three mechanisms stitched together at four thresholds is exactly where a tax curve goes backwards. Six mutations, all caught.
Connecticut was missing three of the four tables its own schedule uses
How far off: Undercharged by $3,200 a year at $400,000 and up to $3,650 above $540,000. Overcharged by 15% of the tax at $25,000 and 10% from $27,000 to $48,000, which is about $170 at the top of that range.
What went wrong
Connecticut computes its tax in four published tables. We applied Table A, the personal exemption, and Table B, the brackets, and none of the rest: Table C adds back the benefit of the 2% band, Table D is a general recapture, and Table E forgives a share of the total for middle earners. Two of the three push the tax up and one pushes it down, so the error ran in both directions depending on income.
Who it affected
Higher earners were undercharged and middle earners overcharged. A Connecticut filer on $400,000 was shown an effective rate of 6.09% against a top rate of 6.99% — the recapture exists precisely to take back the lower brackets' benefit, and without it the figure could not reach the rate the state actually charges.
How we found it
Sweeping every state's effective rate at $400,000 and asking which ones came out implausibly below their own top rate. Connecticut and New York both did, and both for the same reason. The middle-earner credit was found in the same document while reading the tables the sweep had pointed at.
What we changed
All three are now applied in the order Connecticut sets out on lines 4a to 10a of its 2026 Tax Calculation Schedule: bracket tax, plus Table C, plus Table D, then Table E as a percentage of that subtotal. Table D is carried as the published 49-band table rather than a formula, because it is not a uniform step — it climbs at $25 per $5,000, plateaus at $250, climbs at $90, plateaus at $2,950, then climbs at $50.
What stops it recurring
tests/state-tax.test.ts asserts every published band of all three tables, 49 and 27 and the whole of Table C, each probed at its midpoint, plus three totals hand-computed from the brackets. Seven mutations were run against them; the one that looked like an equivalent mutant was not — making Table E's lower edge inclusive changes the answer at exactly $12,000, where the state's "More Than $12,000" wording means no credit. The test now pins that dollar.
Oregon filers were charged for a federal tax subtraction the state gives them
How far off: About $439 a year at a $60,000 salary and up to roughly $770 at the point the cap bites hardest. Nothing above $145,000, where Oregon withdraws the subtraction anyway.
What went wrong
Oregon lets filers subtract the federal income tax they paid from Oregon taxable income, capped at $8,750 and stepping down to nothing between $125,000 and $145,000. We did not apply it. This was known and recorded rather than hidden — the note beside the data described the whole step table and said it was not modelled — but recording an error is not fixing it, and it stayed unfixed because the state engine was never handed the filer's federal tax.
Who it affected
Oregon filers were shown more state tax than they owe, and correspondingly less take-home pay, on every page that computes it.
How we found it
Not detected — it was already on the record as an unmodelled gap and had been for as long as the register existed. What changed is that it was worth more than anything else still outstanding, so it got done.
What we changed
calcStateIncomeTax now takes the filer's federal tax and subtracts it for Oregon, capped by the published step table. A discrepancy inside Oregon's own document was resolved along the way: its worked Example 3 says a $132,000 earner may subtract $5,100, while the table beside it gives $5,250 for that band. The bands are exactly 100, 80, 60, 40 and 20 percent of the cap, and $5,100 is the 60% band of an $8,500 cap — a prior year's figure left in the example. The table governs.
What stops it recurring
The federal-tax argument defaults to zero so the other fifty states are unaffected, which means a caller that forgets it silently reintroduces this exact bug. A build check therefore parses every call site and fails any call made with fewer than four arguments; it was verified by removing the argument from one caller. A second check fails any state whose notes claim a mechanism is unmodelled while the state carries it — Oregon's note would otherwise still be telling readers this figure is too high.
Take-home pay left out the state payroll deductions that come off the same paycheck
How far off: At a $60,000 salary: California $780 a year, Washington $832, New Jersey $442, Oregon $420, Colorado $264, New York $259, Connecticut $300. California's SDI alone is larger than any single state income-tax error this data set has ever carried.
What went wrong
The calculators modelled federal tax, state income tax and FICA, and nothing else. Seven states withhold an employee-paid payroll premium as well — disability insurance, paid family leave, long-term care — and none of it was applied. The state pages even described these deductions in prose while the arithmetic ignored them.
Who it affected
Take-home pay was overstated for every worker in those states. The comparison pages were worse than the individual ones: Washington and Texas both have no income tax, so the site showed a worker in each taking home exactly the same pay, when Washington charges about $832 a year that Texas does not.
How we found it
Auditing the nine no-income-tax states. They were all correctly marked as having no income tax, which is the right answer to the wrong question for a page that claims to show take-home pay: Washington's two premiums come to about 1.39% of gross.
What we changed
A statePayrollTaxes mechanism now carries the employee's share only, with a wage cap where the state caps wages and a dollar ceiling where New York caps the contribution instead. Rates were read at each state's own source. Eight further states run a programme that is NOT applied — Massachusetts, Rhode Island, Hawaii, Minnesota, Maine, Delaware, Pennsylvania and Alaska — because their sites could not be read from here; they are listed in the data, named in the scope statement beside the result, and those filers are still shown slightly high.
What stops it recurring
A build check keeps the unmodelled list in sync: a state cannot be on it and modelled at the same time, and every modelled rate must be a plausible fraction with a recorded source. The payload check was rebuilt to read StateOption as well as StateTaxInput after the browser payload silently dropped the new field once — the page rendered an "SDI" row with nothing in it. A test table charges an income above every cap, added after widening Colorado's cap tenfold passed the whole suite.
Idaho's flat tax is not flat at the bottom, and Delaware's credit was described but never applied
How far off: Idaho about $255 a year, Delaware $110, North Dakota about $21 at a $80,000 salary and about $31 more for high earners as the 2.5% threshold also moved.
What went wrong
Three separate faults in the same sweep. Idaho was modelled as a plain 5.3% flat rate, but its published schedule taxes the first $4,811 of taxable income at 0% and only the excess at 5.3%. Delaware grants a $110 credit per federal exemption — our own note beside the data said so, in those words, and nothing applied it. North Dakota's bracket thresholds were 2025's, sitting under a comment that claimed they were adjusted for 2026.
Who it affected
All three overstated state tax. Idaho and Delaware for every filer in the state; North Dakota for anyone with taxable income above its zero band.
How we found it
Idaho's own rate-schedule page, which prints the 0% band and has done for years; Delaware's 2026 PIT-EST instructions, line 7; and North Dakota's 2026 Form ND-1ES rate schedule. Delaware is the uncomfortable one: nothing had to be looked up to find it, only read.
What we changed
Idaho becomes a two-band schedule. Delaware gains the credit. North Dakota's thresholds go to $49,575 and $250,400. Montana's note was rewritten in the same pass: it claimed a $14,600 standard deduction where the data said $16,100 and where Montana in fact has no standard deduction of its own, starting instead from federal taxable income, and it credited the 2026 rate cut to SB 323 rather than HB 337.
What stops it recurring
The prose check now also catches "standard deduction is approximately $X", the form Montana's note used to slip past it; that was verified by restoring the old note and watching the check fail. Idaho's and North Dakota's tests reproduce the base amounts each state publishes, and Delaware's asserts the credit changes the answer rather than merely existing in the data — which is exactly what was wrong with it before.
Hawaii's standard deduction was a step behind a schedule written into law in 2024
How far off: About $274 a year at a $60,000 salary, where the marginal rate is 7.6%.
What went wrong
Act 46 of 2024 raises Hawaii's standard deduction in steps and widens its brackets in steps, but in ALTERNATE years: the deduction moves in 2024, 2026, 2028, 2030 and 2031, the brackets in 2025, 2027 and 2029. We held $4,400, which is the 2024 and 2025 amount. 2026 is a deduction year and it goes to $8,000.
Who it affected
Hawaii filers were shown too much state tax, because $3,600 of income the state stopped taxing this year was still being taxed.
How we found it
Reading DOTAX Announcement 2024-03, which sets out the whole eight-year schedule. Two secondary summaries disagreed about which years move the deduction, and DOTAX's own tax research blog gives the list wrongly as 2024 and 2025; the announcement is the document that settles it, and Hawaii's tax-year page independently confirms 2025 was not a step by saying its amounts are the same as 2024's.
What we changed
Standard deduction 4,400 to 8,000. The brackets were checked at the same time and are correct as they stand: 2026 uses the 2025 schedule, which is what we carry, and all six base amounts DOTAX publishes for the single schedule are reproduced by our brackets to the dollar.
What stops it recurring
tests/state-tax.test.ts reproduces those six published base amounts from the brackets, so the brackets cannot drift without the test noticing, and pins the deduction with a comment stating the alternating-year rule — which is the fact that makes "the brackets are last year's" correct here rather than stale.
Four states grant their personal exemption as a credit, and all four filers got nothing
How far off: Oregon $256 a year, Nebraska $176, California $153, Arkansas $29, and more where dependents are claimed. Oregon's is the largest single per-filer figure found in this pass.
What went wrong
California, Oregon, Nebraska and Arkansas all give the personal exemption as a credit against the tax rather than a deduction from income. Our state model had only deduction-shaped fields, so all four were recorded as personalExemption: 0 and the exemption was dropped entirely. The same shape of error had just been found in Iowa; checking the other states carrying a zero exemption is what turned up these four.
Who it affected
Every filer in these four states was shown too much state tax, by the full amount of a credit they are entitled to and were given none of.
How we found it
Reading each state's own 2026 estimated-tax or withholding document: Oregon's Publication OR-ESTIMATE and withholding formulas, Nebraska's Form 1040N-ES rate schedule page, Arkansas's AR1000ES tax credits panel, and FTB's 2025 California 2EZ table.
What we changed
The exemptionCredit mechanism added for Iowa now carries all five, and gained a maxIncome cliff for Oregon, whose credit drops to zero above $100,000 of federal AGI instead of tapering. Three notes were stale in the same pass and are fixed: California's said a $5,540 standard deduction after the data had been corrected to $5,706, and a $144 credit against $153; Oregon's said $236 against $256; Nebraska's did not mention the credit at all.
What stops it recurring
The prose check now compares exemptionCredit against the notes and fails a state that carries a credit without stating it, which is what catches a stale credit figure. Its standard-deduction pattern was also widened: it had required "standard deduction" to follow the amount immediately, so "$5,540 California standard deduction" slipped past it for as long as that note was wrong. Both changes were mutation-tested against the exact prose they failed to catch.
Arkansas was modelled with two brackets where the state has five
How far off: About $318 a year on a $60,000 salary — $2,050 charged against $1,732 actually due, before the $29 credit. The largest single-state error found in this pass.
What went wrong
The data carried a deliberate simplification, labelled as one in a comment: two brackets, 2% and the top rate. Arkansas actually exempts the first $5,600 of net taxable income and runs 2%, 3% and 3.4% bands before the top rate starts at $26,400. Collapsing them charged the top rate on income the state taxes at 2 to 3.4 percent, or not at all.
Who it affected
Arkansas filers were shown materially too much state tax at every income above about $5,600.
How we found it
Reading the 2026 AR1000ES rate schedule while checking Arkansas's personal tax credit. A rate comparison would not have found it: the top rate in our data was already right.
What we changed
Replaced with the five bands DFA publishes. Also settled a conflict that could easily have been resolved the wrong way: that same AR1000ES prints a 3.9% top rate, but Act 1 of the May 2026 special session cut it to 3.7% retroactive to 1 January 2026, after the form was finalised. Our 3.7% was right and the state's own form is the stale document. The act left the lower bands alone, which is why they could be taken from that form.
What stops it recurring
tests/state-tax.test.ts reproduces the base amounts DFA publishes for each band ($111, $255, $608) from the marginal brackets, so the two statements of the same schedule cannot drift apart. The test states why they agree only to within $2 — DFA rounds its bases off ".99" band edges — rather than hiding that behind a loose tolerance.
Louisiana was cleared at last year's deduction, and the clearance was wrong
How far off: About $11 a year for a single filer. Small, but it applied to every Louisiana wage earner on the site, and it had already survived one review.
What went wrong
Act 11 set Louisiana's standard deduction at $12,500 for 2025 and indexes it to the CPI-U every year after, with the first adjustment landing on 1 January 2026. We held the enacted 2025 figure. Worse, an earlier pass on this site had already been shown $12,875 by a reference, checked it against the text of Act 11, found $12,500 there, and concluded the reference was unreliable. The entry below this one still says so. It was the check that was unreliable: it read the number the act enacted and not the indexing clause in the same act.
Who it affected
Louisiana filers were shown slightly too much state tax, because $375 of income the state no longer taxes was being taxed at 3%.
How we found it
Reading Louisiana's own R-1306 (1/26) withholding tables, which state under the heading '2026 Standard Deduction' the figures $12,875 single and $25,750 joint, and then RIB 25-012, which supplies the indexing clause the earlier check had missed.
What we changed
Standard deduction 12,500 to 12,875. The same documents settle a second question in our favour: R-1306's 3.09% is a withholding rate carrying a deliberate 0.09% cushion that is refunded on filing, so the 3% we apply to tax liability is right and should not be changed to match the withholding tables.
What stops it recurring
tests/state-tax.test.ts now pins Louisiana's deduction and rate together with a comment naming both documents, so the next person to see 3.09% in the withholding tables does not 'fix' the rate. The wider lesson is in the provenance register: when a state's statute names a figure AND an indexing rule, the statute alone is not a primary source for the current year, and the current year's withholding tables or forms must be read instead.
Iowa's personal exemption was dropped because it is a credit, not a deduction
How far off: $40 per exemption. On a $60,000 salary that is 2.4% of the Iowa tax due, and it scales with the number of dependents claimed rather than with income.
What went wrong
Iowa gives its personal exemption as $40 a head taken off the tax rather than off the income. Our state model had only a deduction field and a per-person exemption field, both of which reduce income, so there was nowhere for a flat credit to go and the exemption was recorded as zero and lost.
Who it affected
Every Iowa filer was shown about $40 a year too much state tax, and a filer claiming dependents proportionally more.
How we found it
Reading the 2026 IA 1040ES worksheet, where 'personal and dependent exemptions' appear on the credits line rather than in the taxable-income calculation, and confirming the amount in the 2026 IA W-4 instructions, line 1(a) and line 2.
What we changed
Added an exemptionCredit mechanism to the shared state engine, applied after the rate and nonrefundable, and set Iowa to $40 per person. Checked at the same time and left alone: Iowa's base is federal TAXABLE income, so the federal $16,100 standard deduction we already subtract is correct rather than a duplicate, and Iowa's own 2026 W-4 confirms $16,100 / $24,150 / $32,200.
What stops it recurring
tests/state-tax.test.ts asserts the credit comes off the tax and not the income, scales with the exemption count, and cannot produce a refund; all three assertions were mutation-tested. The data-integrity check that requires client payloads to carry every engine field extends automatically to the new one, so the browser cannot silently fall back to the old behaviour.
South Carolina was still using the federal standard deduction after the state decoupled from it
How far off: $1,100 of deduction that no longer exists, at 5.21%: about $57 a year.
What went wrong
H.4216, effective for the 2026 tax year, decoupled South Carolina from the federal standard and itemized deductions and replaced them with a South Carolina Income Adjusted Deduction of $15,000 for a single filer. We had picked up the new 1.99%/5.21% rates but were still inheriting the federal $16,100.
Who it affected
South Carolina filers were shown too little state tax, because $1,100 of income that the state now taxes was being deducted.
How we found it
Checking South Carolina at SCDOR during the primary-source pass. The rates were already right, which is the recurring trap: the reform that changed the rates also changed the deduction, and only one half had been picked up.
What we changed
Set to $15,000 from SCDOR's own H.4216 page. Also checked and dismissed a false alarm: the statute expresses the upper band as '5.21%, minus $966', which looks like an extra subtraction but is algebraically identical to the marginal brackets we already use — both give $4,244 at $100,000.
What stops it recurring
The build gate's prose check covers this field, so the note and the figure cannot drift apart. Recorded and NOT fixed: SCDOR says the SCIAD amounts 'may be reduced based on income as described in the bill' without publishing the threshold or rate, so a South Carolina filer high enough for that reduction is still shown less than they owe.
Alabama's standard deduction is a chart, and the site used only its top row
How far off: $25 a year at the top of the range — $500 of deduction that had been withdrawn, at Alabama's 5% rate. The smallest error found in this pass, and included because it is the same defect as the larger ones rather than because the amount is significant on its own.
What went wrong
Alabama's Form 40 Standard Deduction Chart gives a single filer $3,000 up to $25,999 of Alabama AGI and then steps it down $25 for each $500 band, reaching a floor of $2,500 at $35,500. We applied $3,000 at every income.
Who it affected
Alabama filers above $25,999 were shown slightly too little state tax, the shortfall rising to its maximum at $35,500 and holding there.
How we found it
Working through the states most likely to share the shape found in Connecticut, Maine, Maryland, Minnesota and Ohio.
What we changed
Expressed as $25 per $500 band with a $500 cap, rather than 21 literal rows. Checked against all 21 rows of the chart at both ends of each band — a smooth taper was tried first and was wrong by a whole band at the boundaries, which is why the mechanism now models bands explicitly.
What stops it recurring
tests/state-tax.test.ts checks seven points from the chart and asserts that the answer does not move within a band, which is what a continuous approximation would get wrong. All three parameters were mutation-tested.
Minnesota gave higher earners the full standard deduction, which the state reduces toward a floor
How far off: Up to $1,205.64 a year. Nothing at $244,400, about $1,668 of deduction gone by $300,000, and the full $12,240 reduction from roughly $500,000 upward, taxed in Minnesota's 9.85% band.
What went wrong
Minnesota Statutes 290.0123 subd. 5 reduces the standard deduction by 3% of adjusted gross income above the first threshold and 10% above the second, capped so that no more than 80% of it can be lost. We applied the full $15,300 at every income.
Who it affected
Minnesota filers above $244,400 were shown too little state tax, with the shortfall growing until the 80% cap binds and then holding steady.
How we found it
Checking the states most likely to share the shape already found in Connecticut, Maine, Maryland and Ohio, rather than working alphabetically. Minnesota's brackets and the $15,300 headline figure were both already correct.
What we changed
Generalised the deduction taper to take a rate-based reduction with a second tier and a cap, alongside Maine's simpler linear window, and entered Minnesota's rule from the statute with the Department's own 2026 inflation-adjusted thresholds. The statute's printed $220,650 is a 2023 base-year figure and would have been the wrong number to use.
What stops it recurring
tests/state-tax.test.ts checks six points including both tier boundaries and the floor, asserts the $1,205.64 regression, and adds a general rule that no declared taper may ever produce a negative deduction or one that grows with income. A well-formedness check now requires exactly one of the two shapes and rejects a half-specified second tier. All four parameters were mutation-tested.
Georgia's standard deduction was three years out of date, overcharging every filer
How far off: $12,000 against an actual $15,000, so $3,000 of income taxed that should not have been, at 4.99%: $149.70 a year.
What went wrong
HB 463, signed 11 May 2026, cut Georgia's rate to 4.99% and raised the standard deduction to $15,000 single and $30,000 joint. We had picked up the rate change but not the deduction, and were still using the $12,000 that applied in 2024 and 2025.
Who it affected
Every Georgia filer was shown about $150 a year MORE state tax than they owe. Unusually for this pass, the error was against the reader's favour rather than for it.
How we found it
Checking Georgia at its own Department of Revenue during the primary-source pass. The rate was right, which is exactly the trap — a comparison that checks rates and stops finds nothing here.
What we changed
Corrected to $15,000 from the Department's own 'Important Tax Updates' page, which states the 2026 rate and deduction together.
What stops it recurring
The build gate now cross-checks every state's prose against the figures beside it, because Georgia's own note still read $12,000 after the data was fixed. It immediately found a second one: the District of Columbia's note claimed a $15,000 deduction where its data said $16,100, and the note was the wrong half — DC OTR Form D-40ES gives $16,100 single, $24,150 head of household, $32,200 joint. Mutation-tested by putting the stale figure back.
Maine's standard deduction tapers to nothing, and the site gave the full amount at every income
How far off: Up to $1,122.55 a year — the largest single-state error found in this pass. Nothing at $102,250, about half the deduction gone by $139,750, and the whole $15,700 gone from $177,250 upward, taxed at Maine's 7.15% band.
What went wrong
36 M.R.S. 5124-C(2) reduces Maine's standard deduction in proportion to how far Maine AGI sits into a $75,000 window above $102,250, so a single filer gets nothing at all from $177,250. We applied the full $15,700 regardless of income.
Who it affected
Maine filers above $102,250 were shown too little state tax, with the shortfall growing across the window and then holding at its maximum.
How we found it
Following the pattern rather than the state: Connecticut, Maryland and Ohio had all turned out to withdraw an allowance as income rises, so the remaining states were checked for the same shape. Maine withdraws the DEDUCTION rather than the exemption, which needed a different mechanism again.
What we changed
Added a deductionPhaseOut field and applied it in the shared engine before the exemption step. Verified against the state's own worksheet at five incomes, including the half-way point and the point where it reaches zero.
What stops it recurring
tests/state-tax.test.ts asserts those five points and the $1,122.55 regression, and separately asserts that any state WITHOUT a declared taper returns the same deduction at $20,000 and at $500,000. Both parameters were mutation-tested. Recorded and not fixed: Maine also phases out the personal exemption under 36 M.R.S. 5126-A.
Maryland and Ohio gave every filer the top personal exemption, which both states reduce with income
How far off: Maryland about $176 a year above $150,000, where the whole $3,200 has gone. Ohio $13.75 a year above $80,000. Maryland's is the larger because the exemption is bigger and the rate is higher.
What went wrong
Both states publish the exemption as a band table rather than a single figure, and we carried only the top band. Maryland reduces $3,200 to $1,600 above $100,000 of federal AGI, then $800, then nothing above $150,000. Ohio reduces $2,400 to $2,150 above $40,000 and $1,900 above $80,000.
Who it affected
Filers in either state above the first band were shown too little tax, because part of the exemption they were given had already been withdrawn.
How we found it
Checking each state's own exemption chart during the primary-source pass, after Connecticut turned out to phase its exemption out too. Once one state did it, the right move was to look at the rest rather than wait to be told.
What we changed
Extended the exemption phase-out mechanism to take a published band table as well as Connecticut's uniform stepping, and entered both states' tables from their own charts.
What stops it recurring
tests/state-tax.test.ts checks five points against Maryland's chart and five against Ohio's, and adds three structural rules that hold for any future table: the bands must ascend, the last must be open-ended, the amounts must never rise with income, and the first band must equal the state's declared personalExemption — so a table and a headline figure cannot drift apart. All three amounts were mutation-tested.
Connecticut gave everyone the full personal exemption, which most filers do not get
How far off: About $825 a year above $44,000, rising with the marginal rate. At $100,000 the correct figure is $4,750 and the site showed $3,925. Between $30,000 and $44,000 the error tapers from nothing to the full amount.
What went wrong
Connecticut's $15,000 single exemption is not available at every income. Table A of the state's own 2026 Tax Calculation Schedule steps it down by $1,000 for each $1,000 of Connecticut AGI above $30,000, so it is gone entirely from $44,000. The site applied the full amount at every income.
Who it affected
Any Connecticut single filer earning more than $44,000 — which is most of them — was shown too little state tax, because $15,000 of income that should have been taxed was not.
How we found it
Reading Connecticut's Table A during the primary-source pass. The exemption AMOUNT in our data was correct at $15,000; what was missing was that it disappears.
What we changed
Added an exemptionPhaseOut field and applied it in the shared engine before the deduction step. Checked against every row of Table A including both edges — $44,000 still gives $1,000 and $44,001 gives nothing.
What stops it recurring
tests/state-tax.test.ts asserts eight points from Table A directly, and separately asserts that any state WITHOUT a declared phase-out returns the same exemption at $20,000 and at $500,000 — so a state that quietly needs one cannot pass unnoticed. Both parameters were mutation-tested.
New York tax was understated above $107,650 because the bracket clawback was not modelled
How far off: Up to $568.25 a year. Nothing at $107,650, $140 at $120,000, $368 at $140,000, and the full $568.25 from $157,650 upward through the first tier.
What went wrong
New York does not simply apply graduated brackets. Above $107,650 of New York AGI it claws back the benefit of the lower brackets, blending the graduated figure toward a flat rate on ALL taxable income over the next $50,000, so at $157,650 and above the whole amount is taxed at 5.90%. The site applied the brackets marginally and stopped there.
Who it affected
Single filers earning more than $107,650 in New York were shown too little state tax, with the shortfall growing across the phase-in window and then holding steady.
How we found it
Reading New York's own IT-2105 tax computation worksheets during a primary-source pass. Every one of New York's published rates and thresholds in our data was already correct — a rate-by-rate comparison against any table would have passed, and did. The fault was a mechanism the brackets cannot express.
What we changed
Added a recapture field to the state configuration and applied it in the shared engine after the bracket walk. It matches worksheet 7 to the cent at every income tested, and never reduces the tax.
What stops it recurring
tests/state-tax.test.ts asserts the figure below the threshold, at the halfway point of the phase-in, and fully phased in, plus a general check that no recapture can ever lower a bill. All three of New York's parameters were mutation-tested. The build check that lists the engine's fields and requires every client payload to set them was extended to cover this one, which is what stopped it shipping server-only as the Ohio fix nearly did.
Ohio tax was understated by $342 for everyone above the exemption threshold
How far off: Flat $342 a year, at every income above the threshold. On the department's own example — taxable $68,050 — Ohio's answer is $1,497 and ours was $1,155.
What went wrong
Ohio's schedule is not purely marginal. IT-1040 reads "$342.00 plus 2.750% of the amount in excess of $26,050", and the department's own worked example is explicit that the $342 is owed on the first $26,050 once you pass it. We modelled only the 2.75% marginal rate, so the base was never charged.
Who it affected
Every Ohio filer with taxable income above $26,050 was shown $342 a year less state tax than they owe. Below the threshold there is no tax and the figure was right.
How we found it
Reading Ohio's IT-1040 instruction booklet during a primary-source pass over state income tax, rather than comparing rates against a table. A rate comparison cannot see this: our marginal rate of 2.75% was correct.
What we changed
Added a bracketBase field to the state configuration and applied it in the shared engine. Verified against the department's worked example to the cent, and in a browser on /ohio-paycheck-calculator.
What stops it recurring
tests/state-tax.test.ts asserts Ohio's tax against that worked example, that the base is a notch (nothing at $26,050, all of it at $26,051), and that removing it reopens exactly the $342 gap. Both figures were mutation-tested. A new build check lists the fields the engine reads and fails if any client payload omits one — which is how this fix was caught shipping correctly on the server and wrongly in the page.
California's standard deduction was a year out of date
How far off: $5,540 against an actual $5,706, a 3.0% indexing step.
What went wrong
California indexes its standard deduction annually by the June-to-June CCPI. We carried $5,540, which is the 2025 amount. FTB published $5,706 for 2026 in the Form 540-ES worksheet.
Who it affected
California filers were shown slightly too much tax: the missing $166 of deduction is worth between $1.66 and $22 a year depending on marginal rate.
How we found it
Checking California at FTB rather than against a rate table, as part of a primary-source pass.
What we changed
Corrected to $5,706 from the 2026 Form 540-ES worksheet, line 2b.
What stops it recurring
The provenance register carries a reverify date for state income tax, and the build gate fails once it passes, so the indexed amounts cannot sit unchecked into another tax year. The same pass also established that California's 2026 BRACKETS are deliberately the 2025 ones: FTB has not published indexed 2026 brackets, and its own 2026 estimated-tax worksheet tells filers to compute with the 2025 table. That is now written beside the brackets so nobody 'corrects' them to look newer. The complete 2026 schedule arrives in late December 2026.
Keyboard users could tab out of an open dialog, and lost their place on closing it
How far off: One further fault surfaced while testing: the embed preview iframe was in the tab order, and focus entering it broke both the trap and Escape, because keydown then fires in the nested document where the parent page cannot see it. The preview is now out of the tab order and has a title.
What went wrong
The embed, review and save dialogs carried role="dialog" and aria-modal, which promise that the rest of the page is inert while they are open. Nothing implemented that: Tab walked straight out of the dialog into the page behind it, and on close focus was dropped to the top of the document rather than returned to the button that opened it.
Who it affected
A keyboard or screen-reader user who opened any of these dialogs could tab into content they could not see, and after closing had to tab from the top of the page again to get back to where they were. Present on every calculator page, since the dialogs live in the shared action bar.
How we found it
Driving the dialogs with real Tab and Escape keypresses rather than reading the markup. The attributes looked correct; the behaviour was not there.
What we changed
One shared focus manager, src/utils/dialog.ts, used by all three dialogs: focus moves in on open, Tab and Shift+Tab wrap at both ends, Escape closes, and focus returns to the opener on every close path. It also pulls focus back if it has escaped the dialog by some other route.
What stops it recurring
The build gate fails if a component renders role="dialog" without importing the shared manager, so a fourth dialog cannot ship with the attributes and none of the behaviour. Verified with real keypresses on all three dialogs and all three close paths — Escape, the close button and the overlay.
The extra-payment field on the loan calculator did nothing
How far off: On a $300,000 loan at 7% over five years, $500 a month extra should cut the term from 60 months to 55 and the interest from $56,422 to $51,095. The page showed no change at all, hiding a $5,327 saving.
What went wrong
Each of these pages had a table-of-contents section and a form control sharing one id — <section id="extra"> above <input id="extra">. getElementById returns the first match, so the script read the section, and a section has no value.
Who it affected
On the loan calculator, entering an extra monthly payment changed nothing: the term and the interest stayed exactly as they were. The field accepted input, looked like it worked, and was ignored. The same collision affected the loan term on the auto loan calculator, activity level on TDEE, waste on flooring, depth on mulch, pitch on roofing and pattern repeat on wallpaper.
How we found it
Not by anyone using the calculator, and not by any test. It came out of a duplicate-id sweep of the rendered HTML while doing accessibility work — the collision was found first as a validity problem, and only then traced to a dead input.
What we changed
The section anchors were renamed (#extra became #extra-explained, and so on) rather than the controls, since the control ids are referenced by scripts and by label associations. Verified in a browser: the same inputs now produce 55 months and $51,095.
What stops it recurring
The post-build check now fails on any duplicate id in the rendered HTML. It also cleared 191 pages that carried two elements with id "toast", one from the page and one from the shared action bar, which meant the wrong one was being addressed.
Heading levels skipped a rank on 275 pages, and the search button had no focus indicator
What went wrong
275 of the 478 built pages were affected; the routes listed are a sample. The shared action bar opened its embed and review dialogs at h3 before any h2 existed on the page, so the outline went h1 straight to h3. Separately, the site-wide search button had no focus style at all, unlike the other header buttons.
Who it affected
Screen-reader users navigating by heading level were given a broken outline on 275 of 478 pages. Keyboard users tabbing to the search button could not see where focus was — a WCAG 2.4.7 failure on a control present in the header of every page.
How we found it
A heading-order sweep of the built HTML, and a real keyboard traversal of a calculator page. The first attempt at the focus audit reported 60 failures and was wrong: focusing an element from script does not trigger :focus-visible, so almost every control looked unstyled. Driving actual Tab keypresses found the one that was genuinely missing.
What we changed
The dialog headings became h2, which also exposed that those modals had no dialog semantics at all; they now carry role="dialog", aria-modal and an accessible name. The search buttons got the same focus ring the rest of the header already used.
What stops it recurring
The post-build check fails on any heading skip, any page without exactly one h1, and any page not starting at h1. All 478 pages pass. Focus traps and focus restoration on dialog close are still not implemented, and that is now stated on /accessibility rather than left implied.
Wyoming: Cheyenne was a point too high, and the state maximum was understated
How far off: Cheyenne 6% against an actual 5%. The city of Laramie was described as 6% against an actual 5%, and Sheridan as 5% against an actual 6%. The state maximum was published as 6% against an actual 9%.
What went wrong
Cheyenne was published at 6%, on the assumption that Laramie County levies a specific-purpose tax on top of its general county tax. It does not.
Who it affected
Anyone estimating sales tax in Cheyenne was shown a fifth more tax than they owe: $10 on a $1,000 purchase instead of $50 total, an overstatement of $10.
How we found it
Returning to the rates left open in the handoff. The Wyoming chart is a Google Drive file linked behind a bare "CLICK HERE", which is why an earlier pass could not reach it.
What we changed
All corrected from the WY DOR master rate chart effective 07/01/2026, which puts Laramie County at 4% state + 1% general purpose and no specific-purpose tax. The 10/01/2026 chart, already published, is unchanged, so this is not about to move. The maximum is the Teton Village resort district.
What stops it recurring
The build gate's prose check caught a second stale Cheyenne figure in the state summary during this very fix, which is what that check exists for. The route to Wyoming's charts is recorded in the handoff.
Pages affected
/wyoming-sales-tax, /sales-tax-calculator
State pages stated one city sales tax rate in the table and a different one in the text
How far off: Charlotte was the worst: the text said Charlotte and Raleigh were both 7.25% when Charlotte is 8.25%, a full point, and the worked example charged $72.50 on $1,000 instead of $82.50. Salt Lake City text said 7.75% against 8.45%, Seattle 10.35% against 10.55%, Chicago 10.25% against 10.5%, Denver 8.81% against 9.15%. Phoenix's car example computed $3,010 on a $35,000 car at the old 8.6% rather than $3,185 at 9.1%.
What went wrong
Each state entry carries the city rates twice: once as data in a table, and again written out in the overview, the FAQs and a rateContext summary. Correcting the table did not correct the prose. Some of that drift was old; some of it this site introduced last month by fixing 31 city rates and leaving every sentence about them untouched.
Who it affected
A reader could see two different combined rates for the same city on one page. Seventeen cities were affected, and the prose figure was the wrong one in every case.
How we found it
Written a detector that reads every city name out of the table and looks for a percentage next to that name in the same entry's prose, ignoring figures that belong to a different city or are a component rather than a combined rate.
What we changed
All seventeen corrected, and the sentences around them rewritten so the arithmetic still holds: component breakdowns that no longer summed to the stated total were either updated from verified components or replaced with a qualitative description rather than invented. Charlotte and Raleigh, which the text had treated as equal, are now given separately.
What stops it recurring
The build gate now runs that detector as a check and fails on any disagreement. Ten genuine exceptions are listed explicitly with a reason each, so a figure that is not a combined rate does not have to be silently tolerated. It was mutation-tested by restoring a stale Seattle rate.
Las Cruces and Santa Fe sales tax rates were wrong, and New Mexico's maximum was understated
How far off: Las Cruces 8.13% against an actual 8.39%. Santa Fe 8.688% against an actual 8.1875%. The state maximum was published as 9.00% against an actual 9.4375%.
What went wrong
New Mexico's Gross Receipts Tax rate schedule is published through a file-browser widget rather than a plain link, so an earlier pass recorded it as unreachable and left both cities on figures that could not be confirmed.
Who it affected
Las Cruces shoppers were shown too little tax and Santa Fe shoppers too much. On a $1,000 purchase, $2.60 too little in Las Cruces and $5.00 too much in Santa Fe.
How we found it
Returning to the six rates left open in the handoff and reading the widget's own JavaScript to find the file URL, rather than guessing at a path.
What we changed
Both corrected from the NM TRD schedule effective 1 July 2026 - 30 June 2027, by location code: Las Cruces 07-105, Santa Fe city 01-123. Albuquerque 02-100 at 7.625% was confirmed correct at the same time. The maximum is Taos Ski Valley.
What stops it recurring
The exact route to the schedule is recorded in seo-reports/city-rates-to-check.md so it does not read as unreachable again. Four rates remain genuinely open and are listed there.
Pages affected
/new-mexico-sales-tax, /sales-tax-calculator
Utah tax was understated because its taxpayer tax credit was modelled as a deduction
How far off: Understated by $716.45 a year at every income above $92,521, by $488.68 at $75,000 and by $163.68 at $50,000. Overstated by $96.32 at $30,000, because below the crossover a credit is worth more than the deduction that replaced it.
What went wrong
Utah does not subtract a standard deduction from income. Form TC-40 applies the flat rate to the full base and then subtracts a nonrefundable "taxpayer tax credit" worth 6% of the federal standard deduction, which shrinks by 1.3% of income above a base amount and is gone by roughly $92,500. This site carried Utah's $16,100 federal-conforming figure as an income deduction, which is a different mechanism with a different answer.
Who it affected
Utah filers above about $37,400 were shown too little state tax, and filers below it too much. The error grew with income up to the point the credit runs out, then stayed flat.
How we found it
Auditing the state income tax dataset mechanism by mechanism rather than rate by rate. The rate, the bracket and the deduction figure were each individually correct; the way they combined was not.
What we changed
Added a taxCredit field to the state configuration and a single engine that taxes the full base and subtracts the phasing-out credit, flooring at zero because the credit is nonrefundable. Utah's worked example now names the credit instead of describing a deduction that is not applied.
What stops it recurring
tests/state-tax.test.ts asserts Utah's tax at four incomes against figures computed by hand from the TC-40 worksheet, asserts the credit reaches exactly zero at $92,521 and never goes negative, and asserts the deduction is not applied twice. Any state carrying a taxCredit must also explain it in the note readers see next to the deduction figure. The three values were mutation-tested: changing any one of them fails the suite.
The tax calculator ignored state standard deductions in 33 states
How far off: At $75,000 of income: $1,346.50 a year too high in the District of Columbia, $1,079.15 in Maine, $1,040.40 in Minnesota, $909.65 in Montana, $853.30 in Idaho, $838.81 in South Carolina, and a median of $432.00 across the 33 states affected.
What went wrong
State income tax was implemented separately on nine pages. Eight of them subtracted the state standard deduction before applying the rate; the copy on /tax-calculator subtracted only the personal exemption and dropped the standard deduction entirely.
Who it affected
Readers using /tax-calculator in any of the 33 income-tax states that have a standard deduction were shown more state tax than they owe. Other calculators on the site gave that reader a different, correct answer for the same inputs.
How we found it
Found while consolidating the nine copies of the state tax calculation into one, which is the only reason the divergence became visible.
What we changed
All nine call sites now import the same function from src/utils/state-tax.ts. The four duplicated builders that assemble the state data sent to the browser were also collapsed into one.
What stops it recurring
tests/state-tax.test.ts scans the source of every page and module and fails if any file other than src/utils/state-tax.ts builds a state taxable base, and separately asserts that all nine calculators import the shared engine. A tenth copy cannot be added without failing the suite.
Pages affected
/tax-calculator
Local income tax notes were stale for Cleveland, Philadelphia and Maryland
How far off: Cleveland 2% against an actual 2.5%, nearly a decade out of date. Philadelphia 3.74% resident and 3.44% non-resident against 3.735% and 3.425% from 1 July 2026. Maryland's county range topped out at 3.2% against an actual 3.30%.
What went wrong
These are the notes shown to readers about local income taxes on top of the state rate. They had not been revisited since they were written. Cleveland's was the worst: it gave 2%, the rate that was replaced on 1 January 2017.
Who it affected
Readers in those states were given local tax figures that were too low, understating what comes out of a paycheck. The figures are shown as guidance rather than used in the calculation, so the headline result was unaffected.
How we found it
Checking each of the eleven states flagged as having local income tax against the levying authority.
What we changed
Cleveland corrected from Cleveland Codified Ordinances 192.03, which sets 2.5% from 1 January 2017. Philadelphia from the city ordinance effective 1 July 2026, with a note that the city cuts the rate each July under a five-year plan. Maryland to 2.25%–3.30%, naming Worcester as the lowest and Dorchester and Kent as the highest, and noting counties may go to 3.7% from 2026.
What stops it recurring
Louisville at 2.2%, Columbus at 2.5%, Cincinnati at 1.8%, Detroit at 2.4% and New York City at 3.078%–3.876% were confirmed correct at the same time. The provenance register now records that local rates are set by cities and counties on their own schedules, so they do not move with the state and need checking separately.
Four states' personal exemptions and deductions were a year or more out of date
How far off: Small individually: Illinois about $4 per exemption claimed, Michigan about $13. Maine's was larger, its personal exemption being $600 low and its standard deduction $400 high in the other direction. Rhode Island's exemption was several years stale at $4,700 against $5,250.
What went wrong
These states index their exemptions and deductions annually, and the annual update had not been applied. The rates were all correct, so a review that only checked rates would have passed every one of them.
Who it affected
State tax was slightly overstated in each, because too little was being deducted before the rates applied.
How we found it
Comparing every state's exemption and deduction against a 2026 reference, then confirming each disagreement at the state: the Illinois Comptroller's payroll bulletin, Michigan's 2026 Withholding Guide, Maine Revenue Services' rate schedule, and the Rhode Island Division of Taxation's inflation advisory.
What we changed
Illinois exemption 2,850 to 2,925. Michigan 5,600 to 5,900. Maine exemption 4,700 to 5,300 and standard deduction 16,100 to 15,700. Rhode Island exemption 4,700 to 5,250; its $11,200 standard deduction was already correct.
What stops it recurring
Recorded in the provenance register that exemptions and deductions are indexed separately from rates in most states and need their own annual pass. Louisiana at $12,500 was checked at the same time and is correct, against a reference that gave $12,875 — so the reference is not reliable on its own for these figures either.
Vermont was given the federal standard deduction, more than double its own
How far off: On $60,000 of gross income, Vermont tax was shown as $1,320 against roughly $1,576 — understated by about $256. On $120,000, about $505.
What went wrong
Vermont was recorded as conforming to the federal standard deduction of $16,100. It does not. Vermont sets its own, roughly half the federal amount, and the note in our data asserting conformity was simply wrong.
Who it affected
Vermont state tax was understated for every filer, because more than $8,000 too much was being deducted before the rates applied.
How we found it
Checking whether the thirteen states recorded at the federal $16,100 genuinely conform. Maine turned out not to, which made the whole group worth testing.
What we changed
Set to Vermont's tax year 2025 amounts from Form IN-111: $7,650 standard deduction and a $5,300 personal exemption. Vermont indexes annually and had not published its 2026 amounts at the time of checking, so these are marginally low and Vermont tax is now very slightly overstated instead — a far smaller error, and in the safer direction.
What stops it recurring
The state's note now states plainly that Vermont does not conform and that the figures are the 2025 ones pending the 2026 release, so the next review knows to update rather than assume. The wider lesson is recorded too: a claim of federal conformity in our own data is not evidence of it, and every state carrying the federal figure needs that claim checked against the state.
A correction to our own correction: Maine's millionaire surcharge is real
How far off: A filer on $2,000,000 of taxable income was briefly shown $142,480 against an actual $162,480, understated by $20,000.
What went wrong
Earlier the same day we removed Maine's 9.15% bracket above $1,000,000, believing it invented, because a published rate table gave Maine's top rate as 7.15%. That was wrong. Maine's statutory rate schedule does top out at 7.15%, but 36 M.R.S. adds a separate 2% income tax surcharge on single-filer taxable income above $1,000,000 for tax years from 2026. 7.15 plus 2 is 9.15, and the original data was right.
Who it affected
For the few hours between the two changes, Maine filers earning over $1,000,000 were shown too little state tax — the opposite of the error we thought we were fixing.
How we found it
Fetching Maine Revenue Services' own 2026 Individual Income Tax Rates schedule to confirm the deduction and exemption amounts. Note (1) on that page sets out the surcharge.
What we changed
The 9.15% bracket is restored, with the statutory basis written into the data file so it is not removed again. The same document also corrected Maine's standard deduction from 16,100 to 15,700 and its personal exemption from 4,700 to 5,300.
What stops it recurring
The lesson is recorded in the data file itself, next to the bracket: published rate tables list statutory rates and routinely omit surcharges, so a state's top rate appearing lower in a summary table is not evidence that a surcharge bracket is fabricated. Only the state's own schedule settles it. The provenance register now requires a state document, not a comparison table, before removing a bracket.
Wisconsin income tax brackets were a year out of date
How far off: Overstated by $17 on $60,000 of taxable income and $239 on $400,000.
What went wrong
Wisconsin indexes its bracket thresholds to inflation every year. All three of ours were exactly the 2025 figures, so the indexing for 2026 had never been applied.
Who it affected
Wisconsin state tax was overstated at every income level, because each threshold sat lower than it should, pushing income into higher brackets sooner.
How we found it
Comparing all 51 income tax regimes bracket by bracket against a published 2026 table. Wisconsin was the only state whose thresholds disagreed, and the shift was uniform across all three, which is the signature of a missed annual indexing rather than a typo.
What we changed
Thresholds moved to the 2026 values: 3.5% to $15,110, 4.4% to $51,950, 5.3% to $332,720, 7.65% above.
What stops it recurring
Recorded in the provenance register that inflation-indexed states need their thresholds re-derived every year, not just their rates checked. Rates alone would have shown Wisconsin as correct: all four were right and only the thresholds had moved.
Oklahoma's brackets were restructured (and a Maine change here was itself wrong — see 2026-09-05 follow-up)
How far off: A Maine filer on $2,000,000 of taxable income was shown $162,480 against an actual $142,480 — overstated by $20,000. Oklahoma was overstated by $64 at every income above $7,200.
What went wrong
Oklahoma's brackets predated HB 2764, which consolidated six brackets into four rather than the three we had recorded. This entry also removed a Maine bracket above $1,000,000, which was a MISTAKE and has since been reversed — see the follow-up entry of the same date.
Who it affected
Maine filers earning over $1 million were shown substantially more state tax than they owe. Oklahoma filers were shown slightly too much at every income level.
How we found it
A systematic comparison of all 51 income tax regimes against a published 2026 rate table, then checking each disagreement against the state itself.
What we changed
Maine's phantom bracket removed, leaving 5.8% / 6.75% / 7.15% as Maine Revenue Services publishes for 2026. Oklahoma rebuilt as 0% / 2.5% / 3.5% / 4.5% from the Oklahoma Tax Commission's own 2025 Legislative Update, which prints the HB 2764 schedule in full.
What stops it recurring
The provenance register now records that state income tax rates have been checked against a 2026 rate table with every disagreement resolved at the state, so the dataset is no longer entirely unverified. The comparison itself is cheap to repeat: it is one table fetch plus a per-state check only where the rates differ.
Nine more city sales tax rates corrected across seven states
How far off: Largest error was Columbus, Georgia at 8.00% against an actual 9.00%, understating tax by $100 on a $10,000 purchase. Salt Lake City 7.75% against 8.45%. Overland Park was OVERSTATED at 9.75% against 9.35%, and Little Rock at 9.00% against 8.625%.
What went wrong
These are the states whose own rate files could not settle a city rate on their own, because local tax stacks differently in each and several are consolidated city-counties. They had been left unchanged rather than guessed at.
Who it affected
Sales tax was wrong in nine cities across seven states, understated in seven of them and overstated in two.
How we found it
Each rate was decomposed into its state, county and city parts and checked against two independent lines of evidence: the state's own Streamlined rate file, and a published breakdown naming each component. A rate was only changed where both agreed and the parts summed exactly.
What we changed
Albuquerque 7.625%, Salt Lake City 8.45%, Provo 7.45%, Little Rock 8.625%, Fort Smith 9.50%, Overland Park 9.35%, Columbus GA 9.00%, Augusta 8.50%, Joliet 8.75%.
What stops it recurring
These are recorded in the provenance register as CORROBORATED rather than primary-verified, because no state document was read directly for them. That distinction is kept deliberately so a later review knows which rates still warrant a first-hand check. Six others were left unchanged because their sources disagreed.
How far off: Bismarck 7.00% against an actual 8.00%, understating tax by $100 on a $10,000 purchase. Fargo 7.50% against 7.75%.
What went wrong
Both figures were the state rate plus the city rate, with the county rate left out. North Dakota's county tax is charged in addition to state and city tax, not instead of either.
Who it affected
Sales tax was understated in North Dakota's two largest cities.
How we found it
The state's Streamlined rate file implied both were wrong, but that was not acted on because the same arithmetic produced false mismatches elsewhere. It was settled by the Office of State Tax Commissioner's Local Taxes by Location guideline, effective 1 July 2026, which states plainly that county tax is in addition to state and city tax.
What we changed
Bismarck to 8.00% (5.00 state + 2.00 city + 1.00 Burleigh County) and Fargo to 7.75% (5.00 + 2.25 city + 0.50 Cass County). Grand Forks at 7.25% is correct: Grand Forks County levies no county tax.
What stops it recurring
The provenance register records that a state's own guideline resolves whether county tax stacks on city tax, which is the question that left ten rates unresolved. Reading the guideline rather than inferring from the rate file is now the documented method for the states still open.
Pages affected
/north-dakota-sales-tax, /sales-tax-calculator
Phoenix sales tax missed a city rate rise, and the city's own page was wrong
How far off: 8.60% against an actual 9.10%, understating tax by $50 on a $10,000 purchase.
What went wrong
Phoenix raised its transaction privilege tax from 2.30% to 2.80% effective 1 July 2025. Our figure still carried the old rate. The rate had been left alone for a day because the evidence genuinely conflicted.
Who it affected
Sales tax was understated in Arizona's largest city for over a year.
How we found it
Resolved from the Arizona Department of Revenue's Model City Tax Code profile for Phoenix, which lists the retail sales business code 017 at 2.80% and records the change as effective 1 July 2025. Reaching it required a browser that clears the department's bot-verification page.
What we changed
Phoenix corrected to 9.10%: 5.60 state plus 0.70 Maricopa County plus 2.80 city.
What stops it recurring
The provenance register now records the source hierarchy this exposed: for a city rate, the state authority's rate table for the specific business code outranks a city's own summary page, because summary pages go stale. Shreveport's page had failed the same way. The register also records that reaching Arizona's tables needs a browser able to clear the department's bot-verification page, so the next review does not repeat the dead ends. Holding the conflict open rather than guessing is what made the correct answer findable.
Pages affected
/arizona-sales-tax, /sales-tax-calculator
Tucson and Mesa sales tax rates used superseded city rates
How far off: Mesa 7.60% against an actual 8.30%, understating tax by $70 on a $10,000 purchase. Tucson 8.60% against 8.70%.
What went wrong
Both figures had a city rate baked in that the city had since raised. Mesa's 7.6% implies a city rate of 1.3%, and Tucson's 8.6% implies 2.3%; both cities now levy more than that.
Who it affected
Sales tax was understated in two of Arizona's three largest cities.
How we found it
Found in the city rate audit by decomposing each published figure into state, county and city portions and checking the city portion against the city's own rate.
What we changed
Mesa corrected to 8.30% (5.6 state + 0.7 Maricopa + 2.0 city, the city rate confirmed through the Model City Tax Code profile) and Tucson to 8.70% (5.6 + 0.5 Pima + 2.6 city, raised by Ordinance 11518). Chandler at 7.80% was checked and is correct.
What stops it recurring
Decomposing a published rate into its state, county and city parts, then checking each part separately, is now the documented method. It is what exposed these two and the Louisiana figures, in both cases before any source was consulted.
Pages affected
/arizona-sales-tax, /sales-tax-calculator
Charlotte missed Mecklenburg County's new transit sales tax
How far off: 7.25% against an actual 8.25%, understating tax by $100 on a $10,000 purchase.
What went wrong
Mecklenburg County voters approved a 1% transit sales tax in November 2025 and it took effect on 1 July 2026. Our figure predated it.
Who it affected
Sales tax was understated for Charlotte, the state's largest city, for roughly two months after the change took effect.
How we found it
Spotted in North Carolina's Streamlined rate file, which carried a district row for Mecklenburg dated to start 1 July 2026, then confirmed against the Department of Revenue's own press release.
What we changed
Charlotte corrected to 8.25%, and the state maximum raised from 7.50% to 8.25% since Mecklenburg is now the highest in North Carolina. Raleigh at 7.25% and Greensboro at 6.75% were checked at the same time and are correct.
What stops it recurring
The build check that stops a city rate exceeding its state maximum caught the stale maximum the moment the city rate was corrected. The Streamlined rate files carry future-dated rows, so a review that reads them will see a change like this before it takes effect rather than months after.
Pages affected
/north-carolina-sales-tax, /sales-tax-calculator
All three Louisiana city rates still used the old state rate
How far off: New Orleans 9.45% against an actual 10.00%, Baton Rouge 9.95% against 10.50%, each understating by $55 on a $10,000 purchase. Shreveport 9.95% against an actual 9.60%, overstating by $35.
What went wrong
Louisiana raised its state sales tax from 4.45% to 5.00% in January 2025. The state figure in our data was updated; the city figures, which had the old state rate baked into them, were not. New Orleans at 9.45% is exactly 4.45 + 5.00, and Baton Rouge at 9.95% is exactly 4.45 + 5.50.
Who it affected
Sales tax was understated in all three of the state's largest cities, in a state with among the highest combined rates in the country.
How we found it
Found in the city rate audit. The pattern was visible in the arithmetic before any source was consulted: two of the three rates decomposed exactly into the superseded state rate plus a plausible local rate.
What we changed
Confirmed against the City of New Orleans (10.00%: 5.00 state + 5.00 parish) and the Louisiana Association of Tax Administrators for East Baton Rouge (10.50%: 5.00 + 5.50, effective 1 July 2026). Shreveport is 5.00 + 4.60 local = 9.60%.
What stops it recurring
Recorded in the provenance register that changing a state rate requires re-deriving every city rate in that state, since city figures embed the state portion. Shreveport's own city page still quotes the superseded 4.45% state rate, so a city government publishing a figure is not on its own sufficient.
Pages affected
/louisiana-sales-tax, /sales-tax-calculator
Jackson, Mississippi sales tax omitted the city's 1% infrastructure tax
How far off: 7.00% against an actual 8.00%, understating tax by $100 on a $10,000 purchase.
What went wrong
Mississippi is close to a single statewide rate, so the state's 7% was published for Jackson without checking whether the city levies anything of its own. It does.
Who it affected
Sales tax was understated for every purchase in the state's largest city.
How we found it
Found while working through the states one at a time in the city rate audit. The Mississippi Department of Revenue's notice on the Jackson special sales tax confirms 1% on sales already taxed at 7% or more.
What we changed
Jackson corrected to 8.00%, and the state maximum raised from 7.50% to 8.00% to match. Gulfport at 7.00% was checked at the same time and is correct.
What stops it recurring
The build now fails if any published city rate exceeds its own state's maximum. That check previously existed only in the test suite, which is why this correction also exposed a stale maximum rather than being blocked by it.
Pages affected
/mississippi-sales-tax, /sales-tax-calculator
Chicago sales tax rate was out of date
How far off: 10.25% against an actual 10.50%, understating tax by $25 on a $10,000 purchase.
What went wrong
Chicago's combined rate had risen and the published figure was not refreshed. Illinois does not publish a small rate file — its machine-readable address file is 1.7 GB — so the rate had never been checked against the state.
Who it affected
Sales tax was understated for the largest city in the state, on both the Illinois page and the general sales tax calculator.
How we found it
Looked up in the Illinois Department of Revenue's own MyTax Tax Rate Finder, which reports 10.500% general merchandise for Chicago (Cook) as of 4 September 2026.
What we changed
Corrected to 10.50%.
What stops it recurring
The provenance register records that Illinois has no practical bulk rate file and must be re-checked through the state's rate finder, so the next review does not repeat the search for a downloadable source.
Pages affected
/illinois-sales-tax, /sales-tax-calculator
Denver and Boulder sales tax rates were both wrong
How far off: Denver 8.81% against an actual 9.15%, understating tax by $34 on a $10,000 purchase. Boulder 9.85% against an actual 9.195%, overstating by $65.
What went wrong
Colorado's home-rule cities set and collect their own rates, and several districts stack on top — the Regional Transportation District and the Scientific and Cultural Facilities District both apply across the Denver metro. The published figures had not been checked against the state's own lookup.
Who it affected
Sales tax was understated in Denver and overstated in Boulder. A Boulder shopper was shown a figure well above what they would actually pay.
How we found it
Checked address by address in the Colorado Department of Revenue's own SUTS lookup tool during the audit of all 155 published city rates.
What we changed
Denver corrected to 9.15% (2.90 state + 5.15 city and county + 0.10 cultural district + 1.00 transit) and Boulder to 9.195% (2.90 + 1.335 county + 3.86 city + 0.10 + 1.00). Colorado Springs at 8.20% and Aurora at 8.00% were checked at the same time and were already correct.
What stops it recurring
The provenance register records which states have been checked against the issuing authority. Colorado publishes no bulk rate file, so re-verification means four address lookups; that is noted against the January review date rather than left to be rediscovered.
Pages affected
/colorado-sales-tax, /sales-tax-calculator
All four Washington city sales tax rates were out of date
How far off: Seattle 10.35% against an actual 10.55% and Tacoma 10.30% against 10.50%, each understating tax by $20 on a $10,000 purchase. Spokane 9.00% against 9.10%; Bellevue 10.35% against 10.30%.
What went wrong
Washington local rates change quarterly and the published figures had not been refreshed. King County and Seattle each added a 0.1% public safety tax on 1 January 2026, and Tacoma had risen too.
Who it affected
Sales tax was understated for Seattle, Tacoma and Spokane and overstated for Bellevue. Bellevue and Tacoma had also been transposed relative to each other.
How we found it
Checked against the Washington Department of Revenue's own quarterly local rate file for Q4 2026 during a full audit of all 155 published city rates.
What we changed
All four corrected from that file: Seattle 10.55%, Tacoma 10.50%, Bellevue 10.30%, Spokane 9.10%.
What stops it recurring
The provenance register records which states have been checked against the issuing authority and which have not, and the sales-tax dataset is published as provisional so readers are told. Washington publishes a machine-readable rate file each quarter, which makes this state cheap to re-check at the next review.
Pages affected
/washington-sales-tax, /sales-tax-calculator
San Jose and San Francisco sales tax rates were wrong
How far off: San Jose was shown as 9.38% against an actual 10.00%, understating tax by $62 on a $10,000 purchase. San Francisco was shown as 8.75% against an actual 8.625%.
What went wrong
Both city rates predated changes California has since made, and nothing in the repository recorded when they had last been checked against the state's own rate table.
Who it affected
Sales tax on a San Jose purchase was under-stated and on a San Francisco purchase over-stated. Anyone using the figure to budget a large purchase, or to check a receipt, would have been given the wrong number.
How we found it
A deliberate audit of all 155 published city rates against the issuing tax authorities.
What we changed
Corrected against the California Department of Tax and Fee Administration rate table operative 1 April 2026. Los Angeles, San Diego and Sacramento were checked at the same time and were already correct.
What stops it recurring
The provenance register now records which states' city rates have been checked against a primary source and which have not, and the methodology page shows readers that this dataset is provisional rather than verified. Aggregator sites were tested as a bulk source and rejected after disagreeing with the state authority on three of five California cities.
Pages affected
/california-sales-tax, /sales-tax-calculator
Military pay calculator under-stated federal tax for the most senior officers
How far off: Up to $3,236 per year of federal tax omitted ($270/month). O-8 at 20 years was under-stated by $1,696/year.
What went wrong
The page carried its own copy of the federal bracket table instead of importing the site's canonical one, and that copy had only four brackets, stopping at the 24% band. The tax loop therefore ran out of brackets and stopped accumulating.
Who it affected
Income above $201,775 was not taxed at 24% — it was not taxed at all, so estimated federal tax was too low and estimated take-home pay too high. Reached only pay grades above $18,156/month of base pay: O-8 at 20+ years, O-9 and O-10.
How we found it
Found while removing duplicated bracket tables across the site. Each copy was compared against the canonical table before removal; thirteen matched and this one did not.
What we changed
The page now imports the canonical brackets. It computes $42,720 and $44,260 for the affected grades, matching the site's tax engine exactly.
What stops it recurring
A build check now fails if any file outside src/data/federal-brackets.ts declares its own bracket table, so a copy cannot be reintroduced. Verified by adding one and confirming the build failed.
Pages affected
/military-pay-calculator
Minneapolis and St. Paul sales tax rates were out of date
How far off: St. Paul was under-stated by a full percentage point (8.88% against an actual 9.875%) — $300 on a $30,000 purchase. Minneapolis by 0.145 points.
What went wrong
The Minnesota city rates predated the seven-county metro-area transit (0.75%) and housing (0.25%) taxes that took effect 1 October 2023, and were never refreshed.
Who it affected
Sales tax on a Twin Cities purchase was under-stated. Both cities were shown at 8.88% against a state maximum of 8.75%, which was also internally contradictory.
How we found it
Caught by a new test asserting that no city rate may exceed its own state's published maximum.
What we changed
Verified against the Minnesota Department of Revenue Local Sales and Use Tax Rate Guide, Q3 2026, and corrected to Minneapolis 9.025%, St. Paul 9.875%, Rochester 8.125%, with the state maximum raised to 9.875%.
What stops it recurring
The city-rate-versus-maximum test now runs on every build for all 51 jurisdictions. Note the limit honestly: it catches contradictions, not a rate that is stale but internally consistent.
Pages affected
/minnesota-sales-tax, /sales-tax-calculator
Military basic pay table had been synthesized rather than sourced
How far off: E-5 at under two years was shown as $3,116 against an actual $3,343 — $227/month low.
What went wrong
An earlier revision filled the pay table with estimated figures instead of the published DFAS tables, and nothing in the repository recorded that the data had never been checked against a source.
Who it affected
Basic pay was wrong across many grade and service combinations. Most visibly, E-5 was listed below E-4 at under two years of service, which cannot happen.
How we found it
Noticed during a review of the pay data, from the impossible E-5/E-4 ordering.
What we changed
The full table was rebuilt from the DFAS 2026 basic pay tables and cross-checked against two independent reproductions.
What stops it recurring
Reference-case tests now assert specific DFAS values, and a build check asserts that no grade is ever paid less than the grade below it at the same length of service. The provenance register records the source and verification date.
Housing allowance (BAH) rates had been synthesized rather than sourced
How far off: The average E-5 with-dependents rate was shown as $1,746 against an actual $2,225 — $479/month low, and local rates were wrong by considerably more in expensive areas.
What went wrong
As with basic pay, the housing allowance figures were estimated rather than taken from the Defense Travel Management Office release.
Who it affected
Housing allowance, and therefore total compensation, was wrong for every location and pay grade.
How we found it
The warrant officer rates stepped by exactly 135/135/120/120 between grades. Real rates come from local market surveys and do not move in fixed increments.
What we changed
Replaced with the official DTMO 'ALL BAH RATES' release for 2026: 338 housing areas, 27 pay grades, both dependent statuses.
What stops it recurring
A test asserts that rates do not step by a constant amount between grades, which is the signature of fabricated data, alongside structural checks on all 338 areas.
Louisiana sales tax rate and Massachusetts surtax were incorrect
What went wrong
Louisiana's state rate had changed and the site had not been updated. The Massachusetts surtax on income above $1 million was not implemented at all.
Who it affected
Louisiana sales tax was under-stated, and Massachusetts take-home pay was over-stated for high earners.
How we found it
A state-by-state audit of the tax data.
What we changed
Both were corrected against state sources.
What stops it recurring
Sales tax now derives from a single source of truth, and build checks assert that state rate plus average local rate equals the published combined rate for all 51 jurisdictions.