Financial calculations checked against your rules
GERO turns your documented calculation conventions into executable checks. Your team receives a scoped report, test sources and a correction candidate where supported — ready to rerun after updates.
Original GERO graphics and synthetic English narration. Service demonstration using public research and synthetic inputs.
What the evidence establishes
These are synthetic component tests on pinned source versions. They demonstrate specific calculation mismatches and verify local candidate corrections. They do not establish an affected bank, a reachable production transaction, customer losses or a security vulnerability.
The passing inverse-formula correction is already merged upstream. The other two rule families reproduce previously reported issues; this report does not claim new discoveries.
Results by source version
Historical baseline: e4474a0f4a4c65a75e7758e47db1fd277e5fcfef
Selected upstream commit: 3597c668fad621ac4783725e96396153c7d6e9c0
| Rule family | Historical source | Local correction | Selected upstream |
|---|---|---|---|
| Payment / period inverse | 1 pass · 2 fail | 3 pass · 0 fail | 3 pass · 0 fail |
| Grace-period fraction | 3 pass · 6 fail | 9 pass · 0 fail | 3 pass · 6 fail |
| Fiscal compounding calendar | 4 pass · 9 fail | 13 pass · 0 fail | 4 pass · 9 fail |
Zero skipped cases in the verified common suites. All 25 common cases pass with the local corrections. An additional 144-case fiscal-calendar grid passes on the corrected source only.
The expanded unpatched grid did not complete because its test worker exhausted heap memory. Its full coverage is not established, and the extended grid was not run on the selected upstream version.
Examples with explicit expectations
Grace-period fraction
Seven grace days within a two-week period should represent 0.5 of the period under the declared calculator contract. The selected source returns 2.
Annual compounding boundary
For the test's principal of 1,000, annual rate of 36.5%, 365-day denominator and period from 1 March 2023 through 29 February 2024, the expected first-cycle interest is 366.00. The selected source produces 366.37.
Calendar validity
Some valid February inputs raise a date exception when a compounding boundary is constructed using the wrong year. Business date and the year of the interest period must be treated separately.
Inspect the covered cases
Payment / period inverse
- All covered cases pass on the selected upstream commit.
Grace-period fraction
- sameDateIntervalShouldAgreeAcrossDaysAndWeeks()
org.opentest4j.AssertionFailedError: expected: <0> but was: <1>
- doublingThePeriodShouldHalveTheGraceFraction()
org.opentest4j.AssertionFailedError: Expected 0.25 but got 4 ==> expected: <0> but was: <-1>
- oneDayOfGraceInTwoDaysShouldBeHalfAPeriod()
org.opentest4j.AssertionFailedError: Expected 0.5 but got 2 ==> expected: <0> but was: <-1>
- thirtyDaysOfGraceInTwoStandardMonthsShouldBeHalfAPeriod()
org.opentest4j.AssertionFailedError: Expected 0.5 but got 2 ==> expected: <0> but was: <-1>
- oneStandardYearOfGraceInTwoStandardYearsShouldBeHalfAPeriod()
org.opentest4j.AssertionFailedError: Expected 0.5 but got 2 ==> expected: <0> but was: <-1>
- sevenDaysOfGraceInTwoWeeksShouldBeHalfAPeriod()
org.opentest4j.AssertionFailedError: Expected 0.5 but got 2 ==> expected: <0> but was: <-1>
Fiscal compounding calendar
- leapFebruaryBoundary [1] QUATERLY
org.opentest4j.AssertionFailedError: February 28 is not the last day of February 2024; businessDate=2026-06-15 ==> expected: <0> but was: <-1>
- leapFebruaryBoundary [2] BI_ANNUAL
org.opentest4j.AssertionFailedError: February 28 is not the last day of February 2024; businessDate=2026-06-15 ==> expected: <0> but was: <-1>
- annualTargetYear [1] 2023-03-01, 2024-02-29, 366.00
org.opentest4j.AssertionFailedError: Interest before the first annual compounding boundary must be principal * rate * days / 365; actual=366.37 ==> expected: <0> but was: <-1>
- nonLeapFebruary [1] QUATERLY, 2024-06-15, 2025-02-28
java.time.DateTimeException: Invalid date 'February 29' as '2025' is not a leap year
- nonLeapFebruary [2] BI_ANNUAL, 2024-06-15, 2025-02-28
java.time.DateTimeException: Invalid date 'February 29' as '2025' is not a leap year
- nonLeapFebruary [3] QUATERLY, 2024-06-15, 2023-02-28
java.time.DateTimeException: Invalid date 'February 29' as '2023' is not a leap year
- nonLeapFebruary [4] BI_ANNUAL, 2024-06-15, 2023-02-28
java.time.DateTimeException: Invalid date 'February 29' as '2023' is not a leap year
- crossYearBoundary [1] QUATERLY
org.opentest4j.AssertionFailedError: The first fiscal boundary is February 29, 2024; businessDate=2026-06-15 ==> expected: <0> but was: <-1>
- crossYearBoundary [2] BI_ANNUAL
org.opentest4j.AssertionFailedError: The first fiscal boundary is February 29, 2024; businessDate=2026-06-15 ==> expected: <0> but was: <-1>
Reproduction and provenance
The checks call actual Fineract classes through Gradle/JUnit. Source, tests, native outcomes and correction controls were verified locally before this publication copy was generated. The public summary contains selected fields and original-report hashes; it is not the original native XML or a third-party audit certificate.
Machine-readable public evidence · Reproduction instructions and limitations
Upstream engineering record: FINERACT-2809 / pull request #6409, merged on 7 September 2026. That merge applies to the inverse helper correction, not to the other candidate patches or this complete case study.
Download test sources, candidate patches and notices
Applying this work to a product
A useful review starts with a precise version, documented calculation conventions, configuration and a small synthetic example. The engineering deliverable is an executable check pack, a scoped result and a correction candidate where justified. Applicability to a particular product requires its own validation.