Repository navigation
fix(bdc): keep a costed loan worth the same as its one extending row (#1505) - #1506
Conversation
…1505) _exclude_restated_rows' "parents of their own tranches" pass dropped a row when the rows extending its identifier summed to its fair value, comparing fair value only. ARCC's 10-Q 0001628280-26-050307 has two Proofpoint second-lien loans worth 50.5M each (cost 52.6M and 51.6M); the first was excluded as the total of "... loan 1", as were two $100k pairs (RMS HoldCo II, Nordic Ferry), leaving the kept rows 50.7M below the reported total. A row that states its own cost is a holding, so it is no longer excluded as the total of a single extending row. True one-row headers (ARCC's APG, Bragg Live Food, ...) state no cost and stay excluded. Over 16 BDC 10-Qs only ARCC changes: 1,444 -> 1,447 rows, gap -50.7M -> 0. Requiring a costed multi-row parent's cost to match its parts' summed cost is left for 6.0: it moves MAIN's exclusions from 13 to 2. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…1505) (#1506) (#1507) _exclude_restated_rows' "parents of their own tranches" pass dropped a row when the rows extending its identifier summed to its fair value, comparing fair value only. ARCC's 10-Q 0001628280-26-050307 has two Proofpoint second-lien loans worth 50.5M each (cost 52.6M and 51.6M); the first was excluded as the total of "... loan 1", as were two $100k pairs (RMS HoldCo II, Nordic Ferry), leaving the kept rows 50.7M below the reported total. A row that states its own cost is a holding, so it is no longer excluded as the total of a single extending row. True one-row headers (ARCC's APG, Bragg Live Food, ...) state no cost and stay excluded. Over 16 BDC 10-Qs only ARCC changes: 1,444 -> 1,447 rows, gap -50.7M -> 0. Requiring a costed multi-row parent's cost to match its parts' summed cost is left for 6.0: it moves MAIN's exclusions from 13 to 2. (cherry picked from commit 913cf72) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
|
Thanks for the quick fix. It closes ARCC exactly: we measured 1,444 to 1,447 rows, gap -$50.70M to $0.00M, matching your numbers. We re-parsed 45 BDC filings live, on PhenixFIN (PFX), 10-Q NMFC FY2025 10-K ( The other moves are real loans coming back: ARCC Q1 -$4.0M to $0.0M, MSIF -$0.4M to $0.0M, and small additions at ARCC FY2025, BCSF, TRIN and BBDC. A narrower rule that fixes Proofpoint without the PFX harm: when the parent and its parts all state cost, exclude the parent only if the costs match too. A cost-less parent stays excluded as today. Across the 45 filings this changes only Proofpoint. Adding "or a one-row parent's stated coupon differs from its part's" also restores Nordic Ferry and PumpTech, which share cost with their sibling. Upstream tests can't tell these rules apart. Every variant gives identical results on the offline BDC tests (116), the regression suite (3,928), the fast suite and the live MAIN/FSK/OBDC/BCSF portfolio tests. A regression test on PFX Generated by Claude Code |
…gunning#1583) Since dgunning#1506 a costed row over one extending row was always kept, so PhenixFIN's 10-Q 0001213900-26-085667 kept 16 company subtotals as holdings (84 rows, $1,091,046,941) and New Mountain's FY2025 10-K 0001496099-26-000008 counted ACI Parent's preferred twice. Such a row is now excluded when the row under it states the same cost, unless that row adds only a counter (ARCC's "... loan" / "... loan 1" pairs stay two holdings). Re-parsing 38 BDC filings: PFX 68 rows, $801,552,171; NMFC -$2,087,000; the other 36 unchanged row for row. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Fixes #1505
Problem
_exclude_restated_rows(added in 5.60.0) drops a row as a parent when the rows extending its identifier sum to its fair value. It compares fair value only, so two real loans worth the same look like a header and its tranche. On ARCC's 10-Q0001628280-26-050307, the $50.5M Proofpoint second-lien loan (cost $52.6M) was dropped as the total of... loan 1(cost $51.6M), along with two $100k pairs. The kept rows came to $29,298.6M against a reported $29,349.3M.Fix
A row that states its own cost is kept when only one row extends it. The true one-row headers in this filing (APG, Bragg Live Food, Partnership Capital Growth III, ACAS Equity, European Capital UK SME Debt) state no cost and stay excluded.
Measured
16 BDC 10-Qs (ARCC, MAIN FY2025, and the latest from HTGC, FSK, OBDC, CSWC, GBDC, PSEC, BXSL, TSLX, GAIN, PFLT, NMFC, TCPC, CGBD and WHF): only ARCC changes, going from 1,444 to 1,447 rows, and its gap to the reported total goes from −$50.70M to $0.00M.
The reporter's second suggestion, requiring a costed multi-row parent to match its parts' summed cost, is left for 6.0. It moves MAIN's exclusions from 13 to 2.
Verification
tests/issues/regression/test_issue_1505.py: an offline sibling pair is kept, an offline cost-less header is still excluded, and a network check that ARCC keeps Proofpoint and reconciles to the dollar. The first and third tests fail without the fix.test_6xxb_bdc_restated_rows.py,test_3vad_*andtests/bdc/test_bdc_mcp_portfolio.pypass.Targets 5.62.0 as a cherry-pick onto
5.62.x: it is a 5.60.0 regression with no workaround.🤖 Generated with Claude Code