From 222a8f135f69b76f45ee2ed6581876f9c0743ea9 Mon Sep 17 00:00:00 2001 From: Matt Spinola Date: Thu, 6 Aug 2026 19:15:28 -0400 Subject: [PATCH] Close the forced-flow mechanism handoff: supported as written, marginal once the label is removed Executed 2026-08-06 in npf, per section 7. Section 8 appended, body untouched. Verdict and every number live in npf/docs/crowdmon/2026-08-06-forced-flow-mechanism-verdict.md with its reproducer; this file carries a pointer and a one-line result, never a copy. Section 5.6's criteria return `supported` on both report types. That must not be quoted on its own: section 5.3's own placebo carries 73.8% (disaggregated) and 51.9% (tff) of the effect and is itself significant, where section 5.3 says it should be near zero if the crossing is what matters rather than the group label. The label IS the sign of pool_net, and pool_net mean-reverts, so a long book shrinking and a short book growing produces the predicted sign on weeks when nothing was triggered. Removing the label leaves -0.001388 (p 0.047) on disaggregated and -0.002657 (p 0.0099) on tff, about 1.2% and 1.9% of the pool against headline figures of 4.5% and 4.0%. Disaggregated would not survive a correction across even the two report types. A marginal lean, not a clean confirmation. Four places this specification was wrong or unexecutable, recorded in section 8 rather than corrected in the body: - Section 5.6 attaches no criterion to the placebo, so the criteria can be, and here are, satisfied by an effect that is mostly the group label. That gap is the most useful thing this run produced. - Section 4's control cannot be read from the panel and section 3 already says why: trigger_*_pool_agrees is 39 rows over one week. Recomputed over all 1,051 weeks from published pool_net plus propadj. pool_agrees reduces to the SIGN of pool_net and has no lookback dependence at all. - Section 4's "the two groups share the price mechanics exactly" is false as measured. The contradicted group crosses more often in both report types, 25.60% against 20.11% and 24.20% against 21.80%. - Section 5.5's p-value cannot be computed as written. Measured, p_literal runs 0.465 to 0.526 across all six variants including those whose recentred p_null is 0.0000. Section 3.1's equivalence reproduced exactly at 2.220446049250313e-16 over 96 comparisons rather than the required 12, all 96 signals matching. Store pinned: 267 parquets, zero moved during the run, byte copy outside the repo. Variant count 8, not 6, per section 5.8's own instruction. One declared deviation from section 6: the equivalence check runs in crowdmon's own venv rather than installing crowdmon into the shared npf/.venv. No number moves. Section 7's premise that npf has no register stopped being true on 2026-08-06. The file stays here anyway: it is tracked and now closed here, and moving a closed handoff would only cost a second lineage. Co-Authored-By: Claude Opus 5 --- .../2026-08-05-forced-flow-mechanism-test.md | 66 ++++++++++++++++++- docs/handoffs/README.md | 2 +- 2 files changed, 65 insertions(+), 3 deletions(-) diff --git a/docs/handoffs/2026-08-05-forced-flow-mechanism-test.md b/docs/handoffs/2026-08-05-forced-flow-mechanism-test.md index a2f02fd..7a1b088 100644 --- a/docs/handoffs/2026-08-05-forced-flow-mechanism-test.md +++ b/docs/handoffs/2026-08-05-forced-flow-mechanism-test.md @@ -1,6 +1,6 @@ # Handoff: pre-registration for the forced-flow mechanism test, to be executed by a cold session -**Status:** open +**Status:** complete (executed 2026-08-06 in `npf`, PR #79). Verdict a **marginal lean**, see §8. Written 2026-08-05, before computing any statistic below. @@ -342,4 +342,66 @@ copy: `2026-08-03-index-share.md` records what two lineages of one document cost ## 8. Outcome -*To be appended by the executing session. Leave `Status: open` until then.* +**Executed 2026-08-06 in `npf`**, by a session that has written none of this package. Verdict +and every number: `npf/docs/crowdmon/2026-08-06-forced-flow-mechanism-verdict.md`, reproducer +beside it. A pointer and a one-line result, never a copy. + +**§5.6's criteria return `supported` on both report types, and the headline should not be +quoted on its own.** §5.3's own placebo carries **73.8%** (Disaggregated) and **51.9%** (TFF) of +the effect and is itself significant, where §5.3 says it "should be near zero if the crossing is +what matters rather than the group label". Removing the label leaves a real but small residual: +a difference-in-differences of **-0.001388 (p 0.047)** and **-0.002657 (p 0.0099)**, roughly +1.2% and 1.9% of the pool against headline figures of 4.5% and 4.0%. Disaggregated would not +survive a correction across even the two report types. **A marginal lean, not a clean +confirmation.** + +§3.1's equivalence check reproduced **exactly**, 2.220446049250313e-16 over 96 comparisons +rather than the required 12, all 96 signals matching. Store pinned per §5.9: 267 parquets, +**zero moved during the run**, byte copy at +`~/code/cotdata_store_snapshots/2026-08-06-forced-flow-mechanism`. + +**Four places this specification was wrong or unexecutable, each with the measurement that +shows it.** They are recorded here rather than corrected above, because the body is the record +of what was actually asked. + +- **§5.6 has no placebo condition, and that is the gap the run found.** §5.3 pre-registers the + expectation and attaches no criterion, so the criteria can be satisfied, and here are + satisfied, by an effect that is mostly the group label. Anything re-running this should fix + that first; the difference-in-differences is the shape the fix should take. +- **§4's control cannot be read from the panel, and §3 already says why.** §4 says the control + "is already in the panel"; §3's own table measures `trigger_*_pool_agrees` at 39 rows over one + week, because `add_trigger_distance` is a point-in-time overlay. §3 is the correct one. The + control was recomputed over all 1,051 weeks from published `pool_net` plus `propadj`, along + §3.1's vectorisation. Worth carrying: **`pool_agrees` reduces to the SIGN of `pool_net` and + does not depend on the lookback at all**, which is what makes the placebo indispensable rather + than a courtesy. +- **§4's central design claim is false as measured.** "The two groups share the price mechanics + exactly and differ only in whether a forceable holder is present": the contradicted group + crosses **more often** in both report types, 25.60% against 20.11% (Disaggregated) and 24.20% + against 21.80% (TFF), because agreement selects weeks whose trend is less likely to reverse + inside five sessions. +- **§5.5's p-value cannot be computed as written.** A bootstrap resampling the observed data is + centred on the observed statistic, so "the fraction of draws at least as negative as observed" + is ~0.5 whatever is true. Measured, it is: `p_literal` runs 0.465 to 0.526 across all six + variants, including those whose recentred `p_null` is 0.0000. Both are reported; the criteria + use the recentred one. Precedent for recording rather than silently applying: §7.7 of + [`2026-08-02-validation-prereg.md`](2026-08-02-validation-prereg.md). + +**Variant count: 8, not §5.8's 6**, and §5.8 requires saying so. The two additions are the +difference-in-differences, one per report type. Also added and carrying no statistic: a per-side +descriptive table, and the equivalence check widened from 1 symbol to 8 (its reported figure is +a maximum, so widening can only tighten the gate). + +**One declared deviation from §6.** The equivalence check runs in **crowdmon's own venv** rather +than installing crowdmon into `npf/.venv`. That venv is shared by the main checkout and every +worktree, and installing into it changes what a concurrent session imports for the duration of a +run that does not need it. §6 is setup guidance rather than a threshold, statistic, universe or +criterion, so nothing frozen by §2 moved, and §6's own text says no crowdmon computation is +needed for Stages A and B. The phantom-package check §6 asks for is asserted in code before +anything is computed. + +**§7's premise about where this lives has since changed, and the file stays here anyway.** §7 +says it lives here because "`npf` has no equivalent" register. `npf` grew one on 2026-08-06 and +its companion, `2026-08-05-fragility-orthogonality.md`, moved there. This one does not move: it +is tracked here, it has now been executed and closed here, and moving a closed handoff would buy +nothing and cost a second lineage of one document. diff --git a/docs/handoffs/README.md b/docs/handoffs/README.md index f62c509..b40e218 100644 --- a/docs/handoffs/README.md +++ b/docs/handoffs/README.md @@ -48,7 +48,7 @@ A moved handoff leaves a **pointer row and no copy**. One document, one lineage. | [2026-08-02-template-followups.md](2026-08-02-template-followups.md) | **COMPLETE.** Five measurements and two doc corrections, `2026-08-02 §B33-§B37`. Its §3 hypothesis is **retired**: swap share does not predict template status, at any aggregation. Two of its own premises were corrected in place: the §1 dichotomy is not exhaustive (the fund is half the weeks and **two thirds of the contracts**), and the "median 0.993, no asymmetry" reading it inherited from `§B31` is direction cancelling. §A.2 now works a **real** market, live cattle, pinned by `tests/test_appendix_live.py`. Contract master deliberately **not** started. Executed 2026-08-02 on `claude/template-followups-doc-corrections-45de1d` and **never pushed**, which is what `2026-08-03-b-series-recovery.md` §1 recovered and §2 landed | | [2026-08-03-index-share.md](2026-08-03-index-share.md) | **COMPLETE as far as it can go, 2026-08-03.** The only handoff here authored in another repo (cotdata#97, moved here as PR #36; a second session filed a duplicate copy before checking the remote, which is what the claim-first convention below exists to stop). §1: **the premise is retired, exactly as §4 anticipated.** Index positioning is not meaningfully stickier than swap. Swap is the MORE persistent at 12 weeks (median 0.826 vs 0.777, index ahead in only 4 of 13), index is 14% steadier week to week, and **under the worst 5% of weeks the swap book moves less than the index book** (-0.00167 vs -0.00336), adding to net long in 3 of 13 where index never does. §2 was recorded as blocked on **§B33-B36**, and re-derived blind as **`2026-08-03 §C1-C4`**. **Both readings are now corrected** (`2026-08-03-b-series-recovery.md` §2, and this file's appended §7): §B33-B37 **existed all along**, on an unpushed branch, so 08-02 closed at **B37** rather than B32 and §2 was in fact executable in full a day before it was called blocked. The cited figures were **not invented**: "22 of 39" and "17 in both halves" reproduce exactly. Of §2's three headline figures one **cannot respond to `w_SD`** (the shape rule reads two nets and their signs), one (`A_agnostic`) is **defined by `§B34` at a median of 3.0237**, not undefined as §C4 first read it, and `Q_sell`/`Q_buy` answers: median `A` swings **42.0% on the 13 Supplemental markets** against 0.6% pooled, so **`w_SD` is load-bearing exactly where the handoff cares**. Unsought finding: swap sits at 0.305 of Managed Money on routine turnover and 0.067 under stress, so `swap: 0.4` is incoherent **between regimes, not between markets**. **Metals are permanently outside coverage, so most of §0 is still open.** Weight table unchanged | | [2026-08-03-swap-dealer-weight-decision.md](2026-08-03-swap-dealer-weight-decision.md) | **COMPLETE 2026-08-03 (PR #44), decided by the human as option (a): `swap: 0.4` stands.** Its §4 released exactly one piece of work and that work **corrected the handoff's own §1**: `single_weight_sweep` shipped, and re-swept over the order-preserving band it showed §1's 42.0% was the wrong BAND rather than wrong arithmetic. Honest figures **17.9% on the 13 Supplemental markets, 3.5% pooled** over `w_SD ∈ [0.2, 0.4]` (`§C10`). **Decided in parallel with `§C6-C8`, which landed as PR #43 while this was in flight and reached the same place by a different road**: §C6 closed option **(c)** by settling static weights independently, §C7 measured the cost of (a) as a **+19.6% median `Phi` inflation, worst on gold at +27.8% (2.30x cocoa) and precisely during stress weeks**, and §C8 showed most of that never reaches `D`, because the composite consumes a percentile and the median market-week moves only 5.9 of them. **§C8's split is the operating rule: on classic outrights the band is a footnote (Spearman 0.954, 18 of 20 top markets in common); on the ERCOT and PJM book it can invert a market's own history (Transco Zone 6 at -0.416), so publish the band there.** Two independent measurements, one decision, and no re-litigation. Option (c) is unscheduled rather than closed; metals remain permanently outside coverage | -| [2026-08-05-forced-flow-mechanism-test.md](2026-08-05-forced-flow-mechanism-test.md) | **OPEN, unclaimed.** Pre-registration for the forced-flow mechanism test: when the trigger says a pool is forced out at `F*` and price reaches `F*`, does that pool actually move? Not §10 again and reuses none of its spent episodes, being weekly and differential rather than episode-based. The control is `trigger_*_pool_agrees == False`, where the price level is real and the book is not there. Two measured contributions before freezing: the panel already carries **1,051 weeks** back to 2006 (only `trigger_*` is one week), and the full trigger history is vectorisable from **one price read per symbol** because `unadj` cancels out of `move_from_spot`, verified at 2.22e-16 against `trigger_prices`, so the docstring's ~95,000 reads are avoidable. Stage A is PIT-clean by construction; Stage B is a mechanism claim on revised values, and any real-time-actionable reading **voids the verdict**. Runs in `npf` by a cold session | +| [2026-08-05-forced-flow-mechanism-test.md](2026-08-05-forced-flow-mechanism-test.md) | **COMPLETE, executed 2026-08-06 in `npf` (PR #79). Verdict a MARGINAL LEAN, and §5.6's `supported` must not be quoted on its own.** When the trigger says a pool is forced out at `F*` and price reaches `F*`, does that pool move? The criteria pass on both report types, but **§5.3's own placebo carries 73.8% (Disaggregated) and 51.9% (TFF) of the effect** where §5.3 says it should be near zero, because the group label **is** the sign of `pool_net` and `pool_net` mean-reverts. Removing the label leaves **-0.001388 (p 0.047)** and **-0.002657 (p 0.0099)**, about 1.2% and 1.9% of the pool against headline figures of 4.5% and 4.0%; Disaggregated would not survive a correction across even the two report types. **The gap is the finding: §5.6 attaches no criterion to the placebo**, so the design as written cannot separate forced flow from positioning mean reversion, and a re-run should fix that first. Three more corrections in §8: §4's control is **not** readable from the panel (39 rows, one week, as §3 itself measures) and was recomputed over all 1,051 weeks, `pool_agrees` reducing to the SIGN of `pool_net` with **no lookback dependence**; §4's "the two groups share the price mechanics exactly" is **false as measured**, the contradicted group crossing more often in both types (25.60% vs 20.11%, 24.20% vs 21.80%); and §5.5's p-value **cannot be computed as written**, a self-centred bootstrap giving `p_literal` 0.465-0.526 across all six variants including those with `p_null` 0.0000. §3.1's equivalence reproduced exactly at 2.220446049250313e-16 over 96 comparisons. Count **8 variants, not 6**. Verdict: `npf/docs/crowdmon/2026-08-06-forced-flow-mechanism-verdict.md` | | **2026-08-05-fragility-orthogonality.md** — **MOVED to `npf/docs/handoffs/`, 2026-08-05, before execution.** Authored here and relocated the same day, which its own §7 named as conditional on `npf` growing a status register. It is **npf-owned work** (a question about npf's book) and `crowdmon` must not be read as commissioning strategy research. **No copy is kept here**, deliberately: `2026-08-03-index-share.md` records what two lineages of one file cost, and a pointer from the first day is the remedy this repo's `CLAUDE.md` states. Its cross-repo citations were qualified on the move and the change is recorded in its own §0; no threshold, statistic or criterion moved. Status is tracked **there**, not here | **MOVED** | | [2026-08-03-b-series-recovery.md](2026-08-03-b-series-recovery.md) | **COMPLETE, outcome as §7 and §8.** §1 recovered `claude/template-followups-doc-corrections-45de1d` (`11b7c81`), local-only with 2,070 insertions, by pushing it unaltered. §2 landed its content on `main` by **porting rather than merging** (the branch predates six merges and would have reverted `flow.py`, `check_skips.py`, `conftest.py` and the whole 08-03 lineage), so **that branch should be CLOSED unmerged**. `amendments-2026-08-02.md` is now B1-**B37**: it never closed at B32, it closed on a branch nobody could see. **§C4 is superseded**, having read `A_agnostic` as WEIGHT-agnostic where `§B34` defines it as DIRECTION-agnostic at a median of **3.0237**; corrected in place with both readings pinned. The cocoa split point is **resolved**: same date, 2025-10-21, differing only on which half that week falls in, and every other figure identical under both rules. §3 changed the citation convention to **path plus reproducer** and made the bare form fail loudly (`tests/test_references.py` over 368 references in 42 files; one unresolved at the time, `§C5`, recorded rather than deleted and then forced out by its own guard when #42 merged). §4 ran the band `w_SD ∈ {0.067, 0.2, 0.4, 0.7}` under a **settled static-weights decision** and filed `2026-08-03 §C6-C8`: `w_SD = 0.4` overstates fragile capital on 99.31% of market-weeks by a median +19.6%, **gold at +27.8% is 2.30x cocoa at +12.1% so the prediction holds**, and 0.067 moves the ceiling 10.0 to 14.925 so the band is not on one scale. Most of it never reaches the composite, which consumes `pct(Phi)`, except on **98 of 264 markets** where the two tables reorder a market's own weeks. **Weight table unchanged** |