Skip to content

Claude/phase 8.2 lean mvp - #160

Merged
strycker merged 34 commits into
mainfrom
claude/phase-8.2-lean-mvp
Oct 2, 2026
Merged

strycker merged 34 commits into
mainfrom
claude/phase-8.2-lean-mvp

Conversation

@strycker

@strycker strycker commented Oct 2, 2026

Copy link
Copy Markdown
Owner

No description provided.

claude added 30 commits October 1, 2026 17:36
…iew suspended, park + module map + N4/N6/N7

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018uY2PDfrfhs9KL6vSbBAvB
…a gap, scoreboard window, parking map

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018uY2PDfrfhs9KL6vSbBAvB
…pwire/scoreboard/notebooks

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018uY2PDfrfhs9KL6vSbBAvB
…N not green, import-only diff gate, notebook outputs check); STATE planned

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018uY2PDfrfhs9KL6vSbBAvB
- allocation_mode_from_config enum check and the live-config pin
- serving.main then weekly.main in no_regime mode: suspended regime view, mode line, no-regime target traded in full
- no_regime_target is the one-state tilt over returns up to as_of

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018uY2PDfrfhs9KL6vSbBAvB
- report.allocation_mode (absent = regime_tilt; live config no_regime, pinned)
- no_regime_target: one-state belief + returns_by_regime_stats over returns <= as_of + vol_targeted_tilt
- belief and hysteresis still advance; the page collapses them into a suspended regime view
- page prints the active allocation mode under the trades heading

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018uY2PDfrfhs9KL6vSbBAvB
- switch to no_regime executes the full target with a note; same-month re-run identical; next month bands
- executed_weights without a mode record counts as regime_tilt; neither checkpoint gives no note
- band-free configs write no mode record

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018uY2PDfrfhs9KL6vSbBAvB
…A-15)

- allocation_mode checkpoint (mode, as_of, changed_from), loaded before save, gated like executed_weights
- mode_switch: executed_weights without a record counts as regime_tilt; a switch sets held=None
- the switch note is shown under the trades heading and survives a same-month re-run

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018uY2PDfrfhs9KL6vSbBAvB
- pre_band_cash beside pre_band_target_weights so parity can compare the tilt's full output

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018uY2PDfrfhs9KL6vSbBAvB
…d ablation leg

- synthetic: weekly stepped month by month equals the tilt-off driver's tilt and rebalance at rel 1e-9
- tracked data: NO_REGISTRY ablation re-run reproduces the tracked return and scale; final-step tilt
  equals the weekly no-regime target at 2020-11-30; registry sha and count 46 unchanged

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018uY2PDfrfhs9KL6vSbBAvB
- the q2-ii constant-posterior sentence names the served posterior in the suspended block
- the regime_tilt page keeps its sentence byte for byte

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018uY2PDfrfhs9KL6vSbBAvB
… 2568

- DECISIONS A-13 built (code default regime_tilt when absent, live config no_regime and pinned)
- DECISIONS A-15: a mode switch executes the new target in full and says so
- CLAUDE.md / README.md: recorded test count 2550 -> 2568 (test_docs_recorded_counts)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018uY2PDfrfhs9KL6vSbBAvB
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018uY2PDfrfhs9KL6vSbBAvB
…ry test

- git mv labeling/stability.py to parked/stability.py, no shim
- repoint scripts/run_subsample_stability.py and the two stability tests (import lines only)
- boundary test: fresh-interpreter sys.modules check over report/ and tripwire/, AST scan
  with scanner self-check, moved-not-copied location test

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018uY2PDfrfhs9KL6vSbBAvB
…joint driver

- QUALITY_TIER_RULE, annualized_sharpe, quality_tier move verbatim to evaluation/deflated_sharpe.py;
  the parked joint_driver re-imports the same objects
- git mv backtest/joint_driver.py to parked/joint_driver.py, no shim
- repoint scripts and record tests (import lines), plus one orchestrator-approved retarget of the
  monkeypatch in test_the_boundary_is_exclusive to the deflated_sharpe module (assertion unchanged)
- boundary test: joint_driver location and quality_tier moved-not-copied

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018uY2PDfrfhs9KL6vSbBAvB
- git mv labeling/classifier2.py to parked/classifier2.py, no shim
- repoint the parked joint_driver, three scripts and four tests (import lines only)
- boundary test: classifier2 location; no importer of an old path remains in src, scripts or tests

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018uY2PDfrfhs9KL6vSbBAvB
…2576

- platform_design/MODULE-MAP.md: M0-M9+, parked modules, parked-only helpers, boundary
- guide section 3: pointer to the map; M9+ row names parked/{stability,classifier2,joint_driver}
- recorded counts 2568 to 2576 at the four test_docs_recorded_counts sites (numbers only)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018uY2PDfrfhs9KL6vSbBAvB
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018uY2PDfrfhs9KL6vSbBAvB
… and build_weekly_page

- evaluate_tripwire: per-signal state/value/threshold/as-of, STALE after 5 business days,
  UNAVAILABLE on a missing input, NaN tail never green, escalation over current signals
- page section: UNKNOWN unless all three signals are current; STALE (would be RED)
- build_weekly_page writes into output_dir; the book ignores the tripwire
- build_scratch_serving: two cold copies give byte-identical pages

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018uY2PDfrfhs9KL6vSbBAvB
…serving (D-04)

- monitor.evaluate_tripwire + value helpers (run_tripwire and the bool functions unchanged)
- weekly.build_weekly_page(cfg, cm, output_dir) extracted from main; tripwire rendered
  before the trades heading, advisory, never an all-clear without three current signals
- serving.build_scratch_serving copies the serving inputs into a scratch namespace
- config: tripwire.stale_business_days 5 (ruling A1), report.scoreboard_trial_tag

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018uY2PDfrfhs9KL6vSbBAvB
…arpe-vs-hurdle figure

- common 1972-2020 window for all five legs, own-span footnote, rel 1e-9 reconciliation
- run date from the 08.1-pit-tilt-vs-ablation registry rows; tracked numbers read-only
- withheld columns on a mismatch, an unavailable line on a missing KPI table
- baseline_curves shared by the plotting delegate; scoreboard imports no plotting

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018uY2PDfrfhs9KL6vSbBAvB
…-hurdle figure (D-05)

- report/scoreboard.py: scoreboard_table, format_scoreboard, before_after_table, E07_CAVEAT
  (no matplotlib); five legs on the strategy window, reconciled to the KPI table or withheld
- backtest/baselines.baseline_curves: the baseline derivation moved verbatim;
  plotting.recompute_baseline_curves is now a one-line delegate
- weekly: scoreboard rendered between the tripwire and the trades heading
- plotting/backtest.plot_sharpe_vs_hurdle for N7

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018uY2PDfrfhs9KL6vSbBAvB
…headless

- weekly.served_posterior_path: the served posterior over every complete full-span month
- P7: two cold scratch serving builds, identical pages, scored month, STALE, mode, tripwire
- P8: backtest filtered belief (499 distinct of 502) beside the served posterior (1 of 233)
- P9: before/after table, scoreboard, five curves on 1972-2020, Sharpe vs the hurdle at the
  live count, E-07 line, a guard cell, and the answer: the regime view stays advisory (G-06)
- each ends in one pending sign-off cell; scratch lives in the gitignored notebook dir

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018uY2PDfrfhs9KL6vSbBAvB
…ata build

- main() fetches fred_daily exactly once with the build cfg (mocked, network guard on)
- a raising fetch logs a WARNING naming fred_daily_raw and keeps the exit code

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018uY2PDfrfhs9KL6vSbBAvB
… tripwire

- fetch_fred_daily after build_monthly_spine; advisory input, so a failure only warns
- logs the last date on success

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018uY2PDfrfhs9KL6vSbBAvB
- platform/checkpoints.py exposes PLATFORM_REPORT_DIR (same import statement, no new site)
- scoreboard reads it at call time instead of importing OUTPUT_DIR from the package root
- build_scratch_serving takes CheckpointManager from the platform checkpoints seam

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018uY2PDfrfhs9KL6vSbBAvB
…counts 2640

- DECISIONS: A-14 built with its Form (rulings A1, A3), L1-04 parked, G-01 P7-P9, G-07 built, G-08
- README: allocation mode, suspended regime line, tripwire STALE/UNAVAILABLE, fred_daily_raw,
  static scoreboard with the E-07 caveat, P7-P9 headless command
- recorded test counts 2576 -> 2640 (numbers only)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018uY2PDfrfhs9KL6vSbBAvB
…TATE/ROADMAP executed 3/3

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018uY2PDfrfhs9KL6vSbBAvB
…ivered; next is Glenn's call (regime rebuild vs Phase 9)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018uY2PDfrfhs9KL6vSbBAvB
Glenn Strycker and others added 4 commits October 2, 2026 10:38
…ule test files

Import order only; no assertion or behaviour change.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018uY2PDfrfhs9KL6vSbBAvB
… major version

CI's Python 3.10 job runs pandas 2.x, whose pct_change() forward-fills
interior gaps by default; pandas 3 does not. The tracked results were
produced under pandas 3, so on 3.10 the SPY and 60/40 baselines differed
(SPY TLW 5.658 vs 5.688) and the scoreboard refused to reconcile.

- pass fill_method=None at all 14 platform pct_change call sites, pinning
  the pandas-3 behaviour everywhere (no change to any tracked number);
- compare datetime indexes at one resolution (pandas 2 reads ns, pandas 3
  keeps us) in the scoreboard coverage check and the no-regime parity test.

Full suite 2640 passed on both Python 3.10/pandas 2.3 and 3.11/pandas 3.0.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018uY2PDfrfhs9KL6vSbBAvB
@strycker
strycker merged commit 96e4eaa into main Oct 2, 2026
7 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants