GERO · PUBLIC EVIDENCE · 13 SEPTEMBER 2026

Checking the rules behind financial calculations.

Released-version reproductions, mathematical identities, scoped correction candidates and explicit limits. Synthetic inputs only.

FinancePy 1.1.2 · bond principal face scaling

Bond.principal() scales dirty price by the requested face but subtracts accrued interest calculated at face one. In a synthetic released-wheel case, face 1,000,000 returns 1,027,043.3255671025 while the clean-value identity gives 1,017,264.3298212462.

Original GERO graphics and disclosed synthetic English narration. No music or third-party imagery.

Read the evidence report · Run the public reproducer · Inspect open PR #256

Boundary: the pull request is open, not accepted or merged. No customer account, transaction, production deployment, financial loss or security impact was tested.

Download the complete Apache Fineract public case pack (ZIP)

Apache Fineract · calculations checked against declared rules

GERO turns 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.

Open-source check pack · GERO · Discuss a scoped review

25Common cases on each Fineract revision
169Passing Fineract cases on the local correction, including 144 additional calendar cases
2Public financial-calculation case studies in this Space

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 familyHistorical sourceLocal correctionSelected upstream
Payment / period inverse1 pass · 2 fail3 pass · 0 fail3 pass · 0 fail
Grace-period fraction3 pass · 6 fail9 pass · 0 fail3 pass · 6 fail
Fiscal compounding calendar4 pass · 9 fail13 pass · 0 fail4 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.