Skip to content

fix(bdc): keep a costed loan worth the same as its one extending row (#1505) - #1506

Merged
dgunning merged 1 commit into
mainfrom
fix/1505-bdc-costed-one-row-parent
Oct 11, 2026
Merged

dgunning merged 1 commit into
mainfrom
fix/1505-bdc-costed-one-row-parent

Conversation

@dgunning

Copy link
Copy Markdown
Owner

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-Q 0001628280-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_* and tests/bdc/test_bdc_mcp_portfolio.py pass.

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

…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>
@dgunning
dgunning enabled auto-merge (squash) October 11, 2026 12:00
@dgunning
dgunning merged commit 913cf72 into main Oct 11, 2026
10 checks passed
@dgunning
dgunning deleted the fix/1505-bdc-costed-one-row-parent branch October 11, 2026 12:11
dgunning added a commit that referenced this pull request Oct 11, 2026
…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>
@mmitc

mmitc commented Oct 11, 2026

Copy link
Copy Markdown
Contributor

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 main at 2460109 with and without this change. That turned up one filer outside your 16-filing sample that the new rule moves the wrong way:

PhenixFIN (PFX), 10-Q 0001213900-26-085667, 2026-06-30: 67 to 83 rows, kept fair value $801.3M to $1,090.8M (+$289.5M), against PFX's stated $301.6M. PFX tags each company subtotal with the same fair value, cost and principal as its only holding, so "a costed row with one extending row" now keeps those subtotals as holdings. For example, Non-Controlled/Non-Affiliated Investments - Power Stop LLC equals its one term loan. Keeping them also stops Controlled Investments ($128.5M) and Affiliated Investments ($36.7M) from being recognised as totals.

NMFC FY2025 10-K (0001496099-26-000008): +$2.1M. ACI Parent's preferred is counted twice, as ACI Parent Inc. | Preferred shares and as its | Non-accrual status copy (same $2.087M fair value, same $20.124M cost).

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 0001213900-26-085667 would pin it. Happy to send that as a PR if useful.


Generated by Claude Code

mmitc added a commit to mmitc/edgartools that referenced this pull request Oct 25, 2026
…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>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

BDC: from_xbrl drops a costed loan as the "total" of a sibling with the same fair value (ARCC Proofpoint second lien, $50.5M)

2 participants