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
Merged
Conversation
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>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to subscribe to this conversation on GitHub.
Already have an account?
Sign in.
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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.mdThe trigger distance is the least-evidenced column the package publishes.
2026-08-04 §D9established thatmove_from_spotis an identity with the trailingk-day return, so the distance carries no price information beyond momentum. Whattrigger.pyclaims 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
Dis elevated before a forced-exit episode, returneduninformative, 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 istrigger_*_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:
trigger_*is one week deep. An earlier reading confused the number of published snapshots with the depth of the panel inside them.unadjspot cancels out ofmove_from_spot, so the distance is a pure function ofpropadjand the whole history vectorises from one read per symbol. Verified againsttrigger_pricesat 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:
dtlTcovers the whole fragility-weighted side while the trigger fires only the trend-following slice. Stage C carries no pass threshold at allsupportedPoint-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.mdNull-first: is
PhiorIrank-independent of what NPF's trend book already reads? Measured before anything innpfis touched. Whether NPF should tradeDis 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
§D9identity, and NPF's book is Donchian plus an EMA regime gate.Cis vol-scaled positioning extremity against three years of own history while NPF's winning arm isindex_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_triggerrecords 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 atn_variants=12with 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-C8establish thatPhihas no signal independent of the weights, so a "Phiis orthogonal" result may report only that the weight table is orthogonal to momentum. Thew_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 andnpfhas none. Both run innpf, 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
npfgrows its owndocs/handoffs/with a register, it should move first.Verification
566 passed, 93 skipped, unchanged.
tests/test_references.pyresolves every citation in both files.🤖 Generated with Claude Code