Skip to content
This repository was archived by the owner on Aug 8, 2026. It is now read-only.

Pre-register the forced-flow mechanism test and the fragility orthogonality study - #75

Merged
mspinola merged 2 commits into
mainfrom
claude/mechanism-test-handoff
Aug 6, 2026
Merged

Pre-register the forced-flow mechanism test and the fragility orthogonality study#75
mspinola merged 2 commits into
mainfrom
claude/mechanism-test-handoff

Conversation

@mspinola

@mspinola mspinola commented Aug 6, 2026

Copy link
Copy Markdown
Owner

Two pre-registrations, both open and unclaimed, both frozen before any statistic was computed. They are independent and may run in either order.

1. Forced-flow mechanism test

docs/handoffs/2026-08-05-forced-flow-mechanism-test.md

The trigger distance is the least-evidenced column the package publishes. 2026-08-04 §D9 established that move_from_spot is an identity with the trailing k-day return, so the distance carries no price information beyond momentum. What trigger.py claims to add is the mapping: which pool, on which side, is mechanically forced at that level. That has never been tested against what the pool subsequently did.

Not §10 again. That asked whether D is elevated before a forced-exit episode, returned uninformative, and its clean episodes are spent. This is weekly rather than episode-based, so the evidence regenerates instead of being consumed, and it is differential rather than a rate. The control is trigger_*_pool_agrees == False, where the price level is real and the book that would be forced is not there. A raw crossing-to-unwind rate would be meaningless, because a crossing is just the trailing return reversing, which has a high mechanical base rate.

Two things measured before the freeze, both of which change what the evaluator does:

  • The panel already carries 1,051 weeks back to 2006-06-13, 53 market codes, 48 scored, first scored week 2012-05-15. Only trigger_* is one week deep. An earlier reading confused the number of published snapshots with the depth of the panel inside them.
  • The docstring's ~95,000 price-store reads are avoidable. The unadj spot cancels out of move_from_spot, so the distance is a pure function of propadj and the whole history vectorises from one read per symbol. Verified against trigger_prices at 4 dates x 3 lookbacks spanning 2015 to 2026: max absolute difference 2.22e-16, all 12 signals matching.

Three freezes against known failure modes:

dtl pre-declared not the prediction for triggered flow, with the 6C figures, because T covers the whole fragility-weighted side while the trigger fires only the trend-following slice. Stage C carries no pass threshold at all
inference 13-week block bootstrap over calendar weeks taking every market in a block, since crossings cluster cross-sectionally. The IID version is forbidden and may not be reported even as a comparison
supported requires the sign to hold in 6 of 10 asset classes, because the classes are unbalanced (Currencies 9, Dairy 1) and the yen-carry cluster is five markets that are one bet

Point-in-time status is stated per stage rather than as a blanket: Stage A is clean by construction since F* is anchor-invariant; Stage B is a mechanism claim, where a first difference on revised values is the better input. Any real-time-actionable framing voids the verdict and belongs to §7.8's deferred vintage replay.

2. Fragility orthogonality study

docs/handoffs/2026-08-05-fragility-orthogonality.md

Null-first: is Phi or I rank-independent of what NPF's trend book already reads? Measured before anything in npf is touched. Whether NPF should trade D is explicitly out of scope, and a positive result is stated in advance to license a second pre-registered piece of work rather than a book change.

The other two terms are ruled out by measurement rather than taste. The trigger distance is the §D9 identity, and NPF's book is Donchian plus an EMA regime gate. C is vol-scaled positioning extremity against three years of own history while NPF's winning arm is index_oinorm, the OI-normalised cotmetrics index: different formula, same underlying quantity, and the two packages are kept as peer consumers precisely so there are not two disagreeing answers.

The collinearity claim is deliberately not extended by analogy, because it is measured not to hold. nearest_trigger records that the trigger is TSMOM and not a breakout: on 6C the TSMOM level sits +4.14% from spot against a Donchian 250d high of +5.31% and low of -0.77%. NPF uses the breakout. Stage 1 measures the spanning rather than asserting it.

Both stages add zero variants to the SearchSpaceLog, and that is the whole reason for the shape. The book is 3/4 FAIL at n_variants=12 with GENERAL failing the conservative WRC at 0.061 long, so a search that adds arms would raise the multiple-testing denominator on a pillar unrelated to what it tests and could convert a marginal pass into a fail. Stage 1 produces no trades at all; Stage 2 annotates the book's existing trade log rather than generating a new one.

Phi's weight caveat is handled rather than noted, because without it the study is uninterpretable. §A.11 and §C6-C8 establish that Phi has no signal independent of the weights, so a "Phi is orthogonal" result may report only that the weight table is orthogonal to momentum. The w_SD ∈ [0.2, 0.4] order-preserving band re-run is required, not optional, and a conclusion that flips inside the band is a finding about weights.

Stage 2 takes the candidate from the report week before entry, since a Tuesday report is not public until Friday. That costs information and closes a lookahead channel. Its result is pre-declared descriptive and may not be called an edge.

Where they live

Both in docs/handoffs/, because this directory's README is the status register that stops a handoff being executed twice and npf has none. Both run in npf, and both write their verdicts there beside the §10 one.

The second is genuinely npf-owned work despite living here, which §7 names rather than hides. If npf grows its own docs/handoffs/ with a register, it should move first.

Verification

566 passed, 93 skipped, unchanged. tests/test_references.py resolves every citation in both files.

🤖 Generated with Claude Code

mspinola and others added 2 commits August 5, 2026 21:33
The trigger distance is the least-evidenced column the package publishes. 2026-08-04
D9 established that move_from_spot is an identity with the trailing k-day return, so
the distance carries no price information beyond momentum. What trigger.py claims to
add is the MAPPING: which pool, on which side, is mechanically forced at that level.
That mapping has never been tested against what the pool subsequently did.

This is not 10 again and reuses none of its spent episodes. It is weekly rather than
episode-based, so the evidence regenerates instead of being consumed, and it is
differential rather than a rate. The control is trigger_*_pool_agrees == False, where
the price level is real and the book that would be forced is not there. A raw
crossing-to-unwind rate would be meaningless, because a crossing is just the trailing
return reversing, which has a high mechanical base rate.

Two things measured before the freeze, both of which change what the evaluator does.

The panel already carries 1,051 weeks back to 2006-06-13, 53 market codes, 48 scored,
first scored week 2012-05-15. Only trigger_* is one week deep. An earlier reading of
this situation confused the number of published snapshots with the depth of the panel
inside them.

The docstring's ~95,000 price-store reads are avoidable. move_from_spot is
flip/spot - 1 and the unadj spot cancels, so the distance is a pure function of the
propadj series and the whole history vectorises from one read per symbol. Verified
against trigger_prices at 4 dates x 3 lookbacks spanning 2015 to 2026: max absolute
difference 2.22e-16, all 12 signals matching. The evaluator must reproduce that check
and record the number.

Three freezes against known failure modes. dtl is pre-declared as NOT the prediction
for triggered flow, with the 6C figures, because T covers the whole fragility-weighted
side while the trigger fires only the trend-following slice; Stage C therefore carries
no pass threshold at all. Inference is a 13-week block bootstrap over calendar weeks
taking every market in a block, since crossings cluster cross-sectionally; the IID
version is forbidden and may not be reported even as a comparison. And `supported`
needs the sign to hold in 6 of 10 asset classes, because the classes are unbalanced
and the yen-carry cluster is five markets that are one bet.

Point-in-time status is stated per stage rather than as a blanket. Stage A is clean by
construction, since F* is anchor-invariant. Stage B is a mechanism claim, where a first
difference on revised values is the better input. Any real-time-actionable framing
voids the verdict and belongs to 7.8's deferred vintage replay instead.

Filed here rather than in npf because this directory's README is the status register
that stops a handoff being executed twice, and npf has none. It runs in npf by a cold
session, and the verdict is written there beside the 10 one.

566 passed, 93 skipped. test_references resolves every citation in it.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Asks one thing and refuses the obvious next one: is Phi or I rank-independent of
what NPF's trend book already reads, measured before anything in npf is touched.
Whether NPF should trade D is explicitly out of scope, and a positive result here
is stated in advance to be permission to write a second pre-registered piece of
work rather than permission to trade.

The other two terms are ruled out by measurement rather than by taste. The trigger
distance is an identity with the trailing k-day return (D9), and NPF's book is
Donchian plus an EMA regime gate, so as an entry input it would re-express momentum
the book already trades. C is vol-scaled positioning extremity against three years
of own history while NPF's winning arm is index_oinorm, the OI-normalised cotmetrics
index: different formula, same underlying quantity, and the two packages are kept as
peer consumers precisely so there are not two disagreeing answers.

That leaves Phi and I. But the collinearity claim is deliberately not extended by
analogy, because it is measured not to hold: nearest_trigger records that the trigger
is TSMOM and not a breakout, and on 6C the TSMOM level sits +4.14% from spot against
a Donchian 250d high of +5.31% and low of -0.77%. Stage 1 measures the spanning.

Both stages add ZERO variants to the SearchSpaceLog by design, and that is the whole
reason for the shape. The book is 3/4 FAIL at n_variants=12 with GENERAL failing the
conservative WRC at 0.061 long, so a search that adds arms would raise the
multiple-testing denominator on a pillar unrelated to what it is testing and could
convert a marginal pass into a fail. Stage 1 produces no trades at all; Stage 2
annotates the book's existing trade log rather than generating a new one.

Phi's weight caveat is handled rather than noted, because without it the study is
uninterpretable: A.11 and C6-C8 establish Phi has no signal independent of the
weights, so a "Phi is orthogonal" result may report only that the weight table is
orthogonal to momentum. The w_SD [0.2, 0.4] order-preserving band re-run is therefore
required, and a conclusion that flips inside the band is a finding about weights.

Stage 2 takes the candidate from the report week BEFORE entry, since a Tuesday report
is not public until Friday. That costs information and removes a lookahead channel.
Its result is pre-declared descriptive and may not be called an edge.

Filed here for the same reason as its companion, that this directory's README is the
status register and npf has none, with the wrinkle named: this is npf-owned work, and
it should move first if npf grows a register of its own.

566 passed, 93 skipped.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@mspinola
mspinola merged commit 4809c73 into main Aug 6, 2026
5 checks passed
@mspinola
mspinola deleted the claude/mechanism-test-handoff branch August 6, 2026 02:18
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant