Summary

Return Attribution rearranges figures the measurement layer already publishes. It adds no estimate, no model, and no new data column, and the four factors reproduce the stock return by construction rather than by fit. The split between the passive and the active legs follows a stated ordering convention, and no split renders anywhere without that convention named beside it.

Return Attribution, the layer · BTC, Compression, Engine, Re-rate, the four legs in rendering order · coarse view, the three-factor presentation · interaction magnitude, the section 5.4 disclosure

Status: RULINGS RATIFIED 2026-07-31 (all thirteen, Bobby Tierney). Dated on commit.
Current revision: v1.2, 2026-08-05, claims perimeter. See section 12.
Outputs: GATED on section 8. No computed attribution renders until a reproduction pass is recorded.
Framework: Bobby Tierney, cebetracker.io.

This document publishes the identity, the factor definitions, and the conventions. Computed figures follow separately. Nothing in this document is investment advice; Return Attribution is a measurement construction, and a factor is an arithmetic fact about a stated window rather than a judgment about a decision.

1. Purpose and layer

Return Attribution answers one question: over a stated window, how much of a Bitcoin Treasury Company's stock return came from bitcoin, how much from the senior claims stack shrinking in bitcoin terms as price moved, how much from what the company did with its capital, and how much from the market changing what it will pay for the residual.

It is a decomposition, not a valuation and not a forecast. Every input is a figure the measurement layer already carries, and the arithmetic is exact. The layer adds no assumption about what a share should be worth, and it grades no capital decision. A negative Engine leg is a measurement that per-share exposure fell across the window, and nothing more.

Return Attribution sits beside CEBE and Senior Claims %, in the same register as those objects. It never appears without the window dates and the ordering convention stated on the same surface.

2. The identity

Every published CEBE figure, the Senior Claims % beside it, the BTC price, and the stock price are related by an identity that holds exactly at any single point in time.

Sats conversion, stated exactly: 1 BTC = 100,000,000 sats. CEBE publishes in sats per share, and the / 100,000,000 term appears explicitly in every rendering of the identity. It is never folded into a constant. BTC per share may appear in notes.

At a single endpoint t:

NAV_common(t) = ( Q(t) - Claims_BTC(t) ) x B(t) [USD] CEBE(t) = ( Q(t) - Claims_BTC(t) ) / S(t) [BTC per share] CEBE_sats(t) = CEBE(t) x 100,000,000 [sats per share] mNAV(t) = ( S(t) x P(t) ) / NAV_common(t) [dimensionless]

From which:

P(t) = mNAV(t) x ( CEBE_sats(t) / 100,000,000 ) x B(t)

This is an identity, not an approximation. Substituting the definitions of mNAV and CEBE reduces the right side to P(t) term by term, with the share count and the common bitcoin quantity cancelling. It holds for any values of the inputs for which NAV_common(t) > 0.

Taking the ratio of the identity at two endpoints gives the decomposition:

1 + r_stock = ( 1 + r_BTC ) x ( 1 + r_CEBE ) x ( 1 + r_mNAV )

and the CEBE leg splits further, per section 5:

1 + r_CEBE = ( 1 + r_Compression ) x ( 1 + r_Engine )

giving the four-factor form, in ruled rendering order:

1 + r_stock = ( 1 + r_BTC ) x ( 1 + r_Compression ) x ( 1 + r_Engine ) x ( 1 + r_Rerate )

The four factors multiply to the stock return by construction. Closure is an arithmetic property of the identity, not a fitted result, and the test in section 8 verifies implementation rather than method.

P(t) is the stock price in USD for every issuer. The identity is canonical in USD; see section 3.5 for the optional FX presentation.

RATIFIED 2026-07-31, Bobby Tierney | 9: sats per share with the explicit /100,000,000 term as the published unit; BTC per share permitted in notes.

3. Factor definitions

Legs render in the order BTC, Compression, Engine, Re-rate: passive, to active, to market. This order governs every surface, every table, and every export.

3.0 Endpoint inputs

For each endpoint t in {0, 1}, drawn from a single snapshot row per section 4:

SymbolMeaningSource
Q(t)bitcoin heldbtc_holdings
S(t)basic shares outstandingshares_outstanding
B(t)BTC price, USD per BTCbtc_price
K(t)net fiat senior claims, USDdebt_usd + preferred_usd - cash_usd - strc_holdings_usd
X(t)BTC-denominated static claim, BTCbtc_claim_static, via resolveBtcClaimStatic
P(t)stock price in USDstock_price_snapshot x fx_rate

Claims_BTC(t) = max( 0, K(t)/B(t) + X(t) ), floored on the total and never per bucket, per the ratified construction the measurement layer carries. The floored reader governs every leg; the unfloored companion is not used in this layer.

preferred_usd is carried at accrued liquidation preference. Declared but unpaid arrears sit inside that accrued figure, which is why K(t) carries three fiat terms and no standalone payable line. The declared-dividends field is a non-netting disclosure field: it is read through the shared reader for rendering, it never enters K(t), and adding it would double-count the arrears preferred_usd already carries.

v1.2 NOTE, 2026-08-05 | Claims perimeter conformed to the canon three-term K per the v15 terminology-lock ruling; dividends_payable_usd removed from the claims assembly and retained as disclosure. strc_holdings_usd is unchanged and remains in the netting perimeter.

Write A(t) = ( Q(t), K(t), X(t), S(t) ) for the action state, everything set by the balance sheet and the share register, and B(t) for the price state. Define

f( A, B ) = ( Q - max( 0, K/B + X ) ) / S [BTC per share]

so that CEBE(t) = f( A(t), B(t) ).

RATIFIED 2026-07-31, Bobby Tierney | 2: the floored claims reader governs every leg, with flat-Compression cases disclosed per 3.2 rather than left mute.

3.1 BTC leg

1 + r_BTC = B(1) / B(0)

The price move of bitcoin itself over the window, in USD. It is the factor a spot holder earns, and it is the benchmark the other three legs are measured against. It uses each endpoint's own btc_price, never a live price and never a price sourced from a different row.

3.2 Compression leg

The change in CEBE attributable to the senior claims stack shrinking, or growing, in bitcoin terms as the BTC price moves, with the action state held fixed at the opening endpoint. Fiat-denominated claims convert to fewer bitcoin as bitcoin appreciates, so the residual claim on the treasury rises with no action taken.

1 + r_Compression = f( A0, B1 ) / f( A0, B0 )

This is the do-nothing counterfactual: what the window would have done to a shareholder had the company taken no capital action. Compression is the passive leg and requires no decision by the issuer.

Flat-Compression disclosure

Two stack structures produce a Compression leg of exactly 1.0000 at every price. Both render a stated reason rather than a mute 1.0000:

A Compression leg of 1.0000 never renders without one of these reasons attached.

3.3 Engine leg

The change in CEBE attributable to capital actions: common and preferred issuance, debt issuance and retirement, bitcoin purchases and sales, buybacks, conversions, and any other movement of Q, K, X, or S. It is the corporate-action component, the part of the window that required a decision, measured against the do-nothing baseline of 3.2.

1 + r_Engine = f( A1, B1 ) / f( A0, B1 )

The action state moves at the closing price. Engine therefore carries the full incremental effect of every decision taken across the window, including the interaction between those decisions and the price move, which is what the ruled ordering intends.

Sub-split, future scope

A decomposition of the Engine leg into issuance, retirement, and purchase components is deferred to v1.1. It carries its own ordering fork, of the same species as section 5 and with more terms, and that fork gets its own ratification. No v1 surface presents a sub-split, and no v1 surface implies one exists.

RATIFIED 2026-07-31, Bobby Tierney | 11: Engine sub-split deferred to v1.1 with its own ratification; v1 states it as future scope.

3.4 Re-rate leg

The change in what the market pays per unit of common bitcoin exposure. Computed as the exact-multiplication residual:

1 + r_Rerate = ( 1 + r_stock ) / [ ( 1 + r_BTC ) x ( 1 + r_Compression ) x ( 1 + r_Engine ) ]

The residual is a factor with a name, not a plug. It has an independent definition from the identity of section 2:

1 + r_mNAV = mNAV(1) / mNAV(0)

and the two routes are equal in exact arithmetic. Publishing the residual form and computing the direct form as a check is the design: the check has no free parameter, so disagreement beyond floating-point noise is an implementation defect and is treated as one.

What the Re-rate leg contains is stated plainly and is not narrowed by adjective. It carries sentiment, index and flow effects, liquidity, the market's view of instruments and optionality the measurement layer carries at face, and any measurement error present in the other three legs' inputs. A large Re-rate leg is a measurement that the multiple moved, and is not evidence about why.

3.5 FX leg (optional presentation, off by default)

The identity is canonical in USD for every issuer, including non-USD listings. The four legs are always computed against the USD stock price, stock_price_snapshot x fx_rate.

For a non-USD listing, a fifth leg may render, labeled, to bridge the canonical USD decomposition to the return a local-currency shareholder experienced:

1 + r_FX = fx_rate(1) / fx_rate(0) [USD per local unit] 1 + r_stock_local = ( 1 + r_stock ) / ( 1 + r_FX )

Rules, all binding:

RATIFIED 2026-07-31, Bobby Tierney | 3: USD canonical for every issuer; optional labeled FX leg for non-USD listings, off by default. | 10: names and rendering order, BTC, Compression, Engine, Re-rate, passive to active to market.

4. Window convention

4.1 Point to point on stated dates

A Return Attribution is defined by an ordered pair of dates (D0, D1) with D0 < D1. Both dates render on every surface carrying the attribution. There is no rolling, smoothed, or annualized presentation in v1.

4.2 Endpoint row selection

Each endpoint uses the single snapshot row for that ticker whose snapshot_date is the latest on or before the endpoint date, per the house carry-forward convention. One row supplies every field for that endpoint. Fields are never mixed across rows, and no field is interpolated between rows.

4.3 Marks

The BTC price and the stock price are taken from the same row that supplies the balance sheet fields. A live quote is never substituted for either endpoint, including the recent endpoint. Where the row's snapshot_date differs from the stated endpoint date, the row date is the effective mark date and renders alongside.

4.4 Non-trading endpoint dates

Where a stated endpoint date is not a trading day, the endpoint is the last trading day on or before that date. The effective mark date is printed on the attribution. The stated date and the effective mark date both render; neither replaces the other.

RATIFIED 2026-07-31, Bobby Tierney | 4: last trading day on or before, effective mark date printed.

4.5 Share basis restatement

A split or reverse split changes the share count and the stock price by reciprocal factors and changes CEBE per share, with no capital action behind it.

RATIFIED 2026-07-31, Bobby Tierney | 5: post-split basis canonical, issuer's filed restatement authoritative, marker on every crossing window, no unrestated arithmetic.

4.6 Basis grade

v1 renders attributions for windows where both endpoints are VERIFIED. An EST endpoint blocks the window, and the block renders with its reason naming the endpoint and the field or fields carrying EST. No graded or caveated attribution renders in v1. The restriction is revisited when ledger depth across the fleet makes VERIFIED-both a real constraint rather than a convenience.

RATIFIED 2026-07-31, Bobby Tierney | 12: VERIFIED both endpoints only in v1; an EST endpoint blocks the window with a stated reason.

4.7 Disclosure-transition rule

A field governed by an absence-not-zero contract reports a fact about disclosure as well as a fact about the balance sheet. The declared-unpaid preferred dividends field was the first such field, and as of v1.2 it no longer enters K(t), so it no longer triggers this rule. The rule is general and stands, governing every field of the same contract that enters the computation. The issuer-held senior securities field carries the contract today, and the worked example below is retained as written because it illustrates the mechanism.

Where such a field reports at one endpoint and is absent at the other, the change between endpoints is a change in disclosure, not a change in claims, and it is neither an Engine effect nor a claims effect.

The treatment:

Once both endpoints of a window report the field, the field is included normally and no note renders.

RATIFIED 2026-07-31, Bobby Tierney | 13: disclosure transitions are neither Engine nor claims change; consistent-basis computation, stated note, level effect published as a labeled one-time re-basing, general to every future field of the same contract.

4.8 Domain

An attribution is defined only where common NAV and CEBE are positive at both endpoints, and where the stock price is positive at both endpoints. Outside that domain the multiplicative form is undefined, not zero, and no attribution renders. See section 10.1.

4.9 Coverage precondition

Both endpoint rows must carry a non-empty snapshot stock price and FX rate. Coverage of the snapshot stock price is the binding constraint on which windows are computable and is not uniform across the universe.

5. The Compression and Engine split

5.1 The ruled convention

The BTC leg, the fused CEBE leg, and the Re-rate leg are convention-free: each is a ratio of two published quantities, and no choice enters. The split of the CEBE leg into Compression and Engine is not convention-free, because the action state and the price state interact inside f. The claims term K/B contains both. Moving the action state first and moving the price first give different intermediate values, and the difference has to land somewhere.

Ruled 2026-07-31: Compression-first.

1 + r_Compression = f( A0, B1 ) / f( A0, B0 ) 1 + r_Engine = f( A1, B1 ) / f( A0, B1 )

The passive leg carries the do-nothing counterfactual, and Engine reads as the incremental effect of decisions measured against it. The interaction between actions and the price move lands on Engine, which is the intent: an effect that exists only because an action was taken belongs to the leg that measures actions, not to the leg that measures price.

5.2 Alternatives considered

Recorded for the audit trail. All are exact and all close to the identity.

5.3 Counterfactual intermediates

The mixed states f(A1,B0) and f(A0,B1) are values no snapshot ever reports: the ending balance sheet at the opening price, and the opening balance sheet at the closing price. The ruled convention uses f(A0,B1); the disclosure of 5.4 also computes f(A1,B0).

Both are counterfactual intermediates. Neither is a published CEBE figure, and both are labeled as intermediates wherever they appear.

5.4 Interaction magnitude

Every published split states the interaction magnitude as a figure. It is the signed gap between the two orderings' Engine legs, in basis points:

interaction_bp = 10000 x [ ( 1 + r_Engine_EngineFirst ) / ( 1 + r_Engine_Ruled ) - 1 ]

One figure describes the whole ordering gap, because the two orderings' legs multiply to the same total and therefore the ratio of the Engine legs is the reciprocal of the ratio of the Compression legs.

Where the interaction magnitude exceeds 25 basis points in absolute value, the Engine-first split renders alongside the ruled split, labeled. Below the threshold the magnitude still renders as a figure; the alternate split does not.

The disclosure is what keeps the ruled convention honest. It does not soften the ruling: Compression-first is the published split in every case.

RATIFIED 2026-07-31, Bobby Tierney | 1: Compression-first ordering, alternatives recorded at 5.2. | 8: interaction magnitude publishes on every split; the alternate split renders alongside above 25 basis points.

5.5 Binding regardless of magnitude

6. Coarse view clause

A three-factor presentation is spec-conformant:

1 + r_stock = ( 1 + r_BTC ) x ( 1 + r_CEBE ) x ( 1 + r_Rerate )

where the CEBE leg fuses Compression and Engine, on one condition: the fusion is labeled. The leg renders as the CEBE leg or the per-share exposure leg, with a stated note that it combines claims compression and capital actions, and it never renders under the name Engine.

The clause exists because the fused leg is ordering-invariant. Section 5's convention touches only the split, so the coarse view carries no convention risk. A surface with no room to state an ordering convention, a social card, a table cell, a summary line, should prefer the coarse view over an unlabeled split. Choosing three factors is a presentation decision, not a reduced-fidelity one.

The reverse substitution is not conformant: a four-factor presentation that omits the ordering label is a defect, and is corrected rather than footnoted. The one-time re-basing of section 4.7 stays outside the coarse view as it stays outside the four-factor view.

7. Data requirements

Every input is an existing snapshot column. This layer requires no new column, no new tab, and no new write path.

Required per endpoint row: snapshot_date (and period where present) for the effective mark date, ticker for the canonical readers' override lookups, btc_holdings, shares_outstanding, btc_price, debt_usd, preferred_usd, cash_usd, strc_holdings_usd, btc_claim_static, stock_price_snapshot, and fx_rate.

Conditionally required where the issuer carries EUR-denominated preferred: stre_face_eur and eurusd_rate, so that the endpoint's preferred figure is read on the same FX basis the rest of the framework uses at that endpoint.

Required readers, called and never re-derived: the shared BTC-denominated claim reader, which honors an explicit zero, and the shared floored claims quantity. Both live in the authoritative claims module the measurement layer uses, and this layer adds no copy of either. The shared declared-dividends reader is no longer among them, since that field left the claims assembly at v1.2; where a surface renders it as disclosure it still calls that reader and never re-derives it.

Computation calls each reader with that endpoint's own BTC price, never a live price and never the other endpoint's price, except where a leg's definition explicitly evaluates a mixed state per section 5.

8. Verification gate

No computed Return Attribution publishes on any tracker surface until the protocol below records a pass. The definitions and the method in this document publish independent of the gate, as with the Adjusted Claims specification. What the gate holds is every number.

8.1 The second lane

The reproduction is performed by a fresh session with no project mount, commissioned with this specification and the primary filings only. The fresh-eyes property is the point: the second lane has no access to the computing lane's code, intermediate values, or working notes, and no access to the tree.

The issuer and the quarter are selected in the governing thread, and stated before the computing lane runs. Neither lane chooses its own test.

8.2 The protocol

8.3 The checks

8.4 Conditions and consequences

RATIFIED 2026-07-31, Bobby Tierney | 6: closure 1e-4, per-field input exact, cross-lane per-leg 1e-3, stated blind and not revisable. | 7: second lane is a fresh session with no project mount, commissioned with the spec and the filings only; issuer and quarter selected in the governing thread before the computing lane runs.

9. Worked example structure

No live figures appear in this document. Figures enter only through the anchor lane. The tokens below are placeholders and the structure is what ratification fixes. A worked example populated outside the anchor lane is a defect regardless of whether its figures are correct.

Return Attribution, <TICKER> Window: <D0> to <D1> (effective marks <MARK_0>, <MARK_1>) Ordering: Compression-first Basis: VERIFIED both endpoints Share basis: post-split, <BASIS_LABEL> [marker line only where 4.5 applies]
Endpoint inputt0t1
btc_holdings<Q0><Q1>
shares_outstanding<S0><S1>
btc_price<B0><B1>
net fiat claims K<K0><K1>
btc_claim_static<X0><X1>
stock price USD P<P0><P1>
Derived endpointt0t1
Claims in BTC<C0><C1>
Senior Claims %<SC0><SC1>
CEBE, sats per share<CEBE_SATS_0><CEBE_SATS_1>
mNAV<M0><M1>

Counterfactual intermediates, labeled as intermediates and never as CEBE figures:

f( A0, B1 ) = <MIXED_A0B1> [ruled ordering] f( A1, B0 ) = <MIXED_A1B0> [disclosure only, section 5.4]
LegFactorAs return
BTC<F_BTC><R_BTC>
Compression<F_CMP><R_CMP>
Engine<F_ENG><R_ENG>
Re-rate (residual)<F_RER><R_RER>
Product<F_PROD><R_PROD>
Stock return<F_STOCK><R_STOCK>
Closure, absolute difference<CLOSURE>tolerance 1e-4
Re-rate check: residual <F_RER> vs mNAV ratio <F_MNAV_DIRECT> delta <D_RER> Interaction magnitude: <INTERACTION_BP> bp [where above 25 bp] Engine-first split renders alongside: Compression <F_CMP_ALT>, Engine <F_ENG_ALT> Coarse view: BTC <F_BTC> x CEBE <F_CEBE_FUSED> x Re-rate <F_RER>

Conditional lines, rendered only where the condition holds:

Compression flat: 1.0000, no compressive claims [or] 1.0000, claims are price-indexed, no compression Disclosure transition: declared-dividends claim enters disclosure <DATE>; window computed ex-field for comparability; level effect stated separately as <X> sats Split marker: window crosses <SPLIT_DATE> <FACTOR> split; both endpoints restated to post-split basis per <FILING> FX presentation: FX leg <F_FX>; local-currency return <R_STOCK_LOCAL>

10. Stated limitations

10.1 Behavior near the zero crossing

As net senior claims approach the value of the bitcoin held, CEBE approaches zero and every ratio built on it degenerates. A multiplicative decomposition through a leg that approaches zero produces arbitrarily large factors in the other legs, and through a sign change it is undefined. Return Attribution therefore does not render inside the degenerate region and does not render across a window in which CEBE or common NAV crosses zero. The correct objects in that region are absolute per-share residual deltas and the break-even price, consistent with the treatment in the Adjusted Claims specification, section 5.1.

10.2 The split does not chain

The three-factor coarse view chains exactly: multiplying the legs of consecutive sub-windows reproduces the whole-window legs, because each is a ratio of endpoint quantities and the intermediate terms cancel. The Compression and Engine split does not chain. Its intermediate state depends on the endpoints, so the split of a year is not the product of the splits of its four quarters. This holds under the ruled convention and under every alternative in 5.2; the gap is the interaction, redistributed at a different frequency.

This is a property of the object and is stated rather than corrected. A published split is specific to its window, and splits at different frequencies are not combined.

10.3 The residual absorbs error

The Re-rate leg is exact by construction, which means it carries every measurement error present in the other three legs' inputs. A stale share count, a mis-stated claim, or an off-date mark does not surface as a closure failure. It surfaces as a Re-rate leg wrong by exactly the amount of the error, with the identity still closing to the fourth decimal. Closure is a test of arithmetic, not of inputs, and section 8 exists because of this. It is why the gate reproduces inputs from filings rather than only recomputing legs, and why the per-field input tolerance is exact rather than banded.

10.4 Attribution is not causation

The Engine leg measures the change in per-share exposure across a set of capital actions. It does not measure whether those actions were sound, whether an alternative would have done better, or what the actions were intended to achieve. A window in which an issuance funded purchases at a price that later fell renders exactly as its arithmetic, and the framework offers no verdict on it.

10.5 Compression is not a company action

The Compression leg moves with no decision by the issuer. Presenting it beside the Engine leg risks reading it as performance. Surface copy states, wherever both render, that Compression is a price effect on a fixed stack. The ruled leg order places Compression before Engine so that the passive leg is read first.

10.6 Measurement is not recommendation

Consistent with the framework: the legs are arithmetic facts about a stated window. They are not recommendations to buy, sell, issue, or retire. Forward views belong to the reader.

11. Vocabulary

Canonical names: Return Attribution (the layer), BTC leg, Compression leg, Engine leg, Re-rate leg (the four factors), coarse view (the three-factor presentation), ordering convention (the section 5 parameter, ruled Compression-first), interaction magnitude (the section 5.4 disclosure), disclosure-transition rule (section 4.7).

Public surfaces:

The layer's figures are measurement-layer rearrangements and are never blended into an Adjusted Claims presentation without both layers labeled, per the standing rule on layer mixing.

12. Versioning and corrections

This specification is versioned. Changes arrive as dated revisions with the prior text preserved. Errors route through the public correction log at cebetracker.io/methodology/#changelog, same standard as all tracker figures. Any revision touching a leg definition, the ordering convention, or a reader this layer calls re-arms the section 8 gate.

Known scope for v1.1: the Engine sub-split of section 3.3, which carries its own ordering fork and its own ratification. That version number stays reserved for it, and this revision therefore lands as v1.2.

Revisions

v1.2, 2026-08-05, claims perimeter. Section 3.0 K(t) conformed to the canon three-term form, debt_usd + preferred_usd - cash_usd - strc_holdings_usd, per the v15 terminology-lock ruling of record. Core CEBE carries no standalone dividends-payable term: preferred_usd is carried at accrued liquidation preference and the arrears case lands inside that accrued figure, so a separate payable line double-counts it. dividends_payable_usd is retained as a non-netting disclosure field and removed from the claims assembly in the shared claims module. Section 4.7 is unchanged as a general rule and no longer names this field as a live trigger. strc_holdings_usd is unchanged and remains in the netting perimeter. This revision touches a reader the layer calls, so the section 8 gate is re-armed per the paragraph above. Effect on published figures: Strategy only, Senior Claims % 34.0 to 33.7 and CEBE 143,392 to 144,023 sats at the 2026-08-02 snapshot basis; every other issuer carries a blank column and does not move.

13. Ratification record

All thirteen rulings issued by Bobby Tierney, 2026-07-31. Recorded here as the audit trail; the authoritative text is the body of this specification.

CEBE Framework by @chcbearsfan. cebetracker.io. The measurement layer lives on the methodology page; the valuation layer lives at the Adjusted Claims specification.