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** |