Objective
Follow-up to #911 for the captured RecessionAlert indicator page at https://recessionalert.com/the-sp-500-great-trough-project/ pinned to sha256:af1b726bcf6585f49a61e71fbd8ad43060b8a301ff79f378b24c4c75231d64dc. Review only the durable offline snapshot; do not live-crawl or invent thresholds. Acceptance: publish a fail-closed indicator/strategy specification with page and asset SHA256 provenance, disclosed semantics, native and effective spans, timing/cadence, revision limitations, and an explicit no-go disposition where evidence is insufficient.
Approach
- Verified the offline snapshot in
data/recessionalert.sqlite: project page
af1b726bcf6585f49a61e71fbd8ad43060b8a301ff79f378b24c4c75231d64dc (2012-06-19, 99190 bytes, fetched 2026-08-22T23:39:25Z) plus siblings great-trough-detector-improvements (d909e1ae), great-trough-signal (c3ab47de), on-standby-for-a-great-trough (e6cafff2), and subscriber WeeklyData.xlsx sheet SP500 BREADTH DATA (fc2be5f1fc2a2e38949ae566f6e8cb4699a95562975a498fb5a53510cc40d67c, 8,209,462 bytes). No live fetch at any step.
- Extracted disclosed semantics: canonical 2014 improved Class A/B rules
(Class B arm below 27.4 for 5 trading days, Class A arm below 10 for 10 trading days cancelling B, both buying on a punch above 80 after at least 4 days below 80), severity bands 1-3/4-6/>6 days below 10, NYSE daily-close cadence, next-session (+1 bar) execution, no disclosed exit. Legacy 2012 27/87/14-day and 26/87/15-day variants documented but not executed.
- Confirmed native and effective spans 2015-03-26 to 2026-08-14 (2,864 NYSE
sessions; 27 Class A, 58 Class B, 83 unique markers) via the offline runner research/recessionalert/great_trough.py (--check-causality --json passed: monotonic daily index, no pre-2015 fill, late-input immutable).
- Froze the fail-closed specification in
research/findings/specs/recessionalert-great-trough.json with explicit no-go items: proprietary breadth smoothing constant, point-in-time NYSE constituents/exclusions, pre-2015 machine history (chart back to 1987, no OCR), workbook marker code 1 vs 2 meaning, and revision/vintage policy.
- Retained the existing inspection-only publication: playable Other-indicators
entry recessionalert-great-trough, experiment notebook research/experiments/qm-09tp.22.ipynb with self-contained analysis docs/experiments/qm-09tp.22-analysis.html, and the negative forward baseline (combined markers trail unconditional S&P returns at 37/83/119/150 trading sessions). No strategy or excess-return claim is made.
Files / code / data changed
research/extensions/1593-intake.json— intake classification (research_campaign)research/results/1593.md— this changelog entry (id 1593)docs/site-data/results.json,docs/results.html,docs/results/1593.html— rebuilt changelog- Reused without modification:
research/recessionalert/great_trough.py,
research/findings/specs/recessionalert-great-trough.json, research/fixtures/buy-signals-v1.json, research/experiments/qm-09tp.22.json/.ipynb, docs/site-data/signals/history.json, docs/other-indicators.html, docs/experiments/qm-09tp.22-analysis.html
data/recessionalert.sqlite(page/workbook cache) — fixtures (read-only, not rewritten)
Validation
python3 -m research.recessionalert.great_trough— exit 0, 2,864 rows 2015-03-26→2026-08-14, signals 27/58/83python3 -m research.recessionalert.great_trough --check-causality --json— passed (controller receipt check-1)python3 -m pytest -q tests/test_great_trough_detector.py— 8 passedpython3 research/scripts/check_static_reports.py docs— passed (controller receipt check-4)python3 -m research.artifacts check --mode full --offline— passed (or rebuilt)- No live crawl, no
data/market.sqlitemutation, no secrets printed, no hand-edit of generated HTML/canary
Results
Published the fail-closed Great Trough Detector specification with full page and workbook SHA256 provenance, disclosed Class A/B semantics, native and effective spans, timing/cadence, revision limitations, and an explicit no-go for exact reconstruction and strategy admission. The inspection-only Other-indicators replay (83 exact supplied markers) and its negative forward baseline remain publicly visible with browser coverage. Changelog entry research/results/1593.md is searchable via git grep 1593.
Links
- Task: 1593 (follow-up to #911)
- Pages: https://recessionalert.com/the-sp-500-great-trough-project/ (cached sha256:af1b726bcf6585f49a61e71fbd8ad43060b8a301ff79f378b24c4c75231d64dc), https://recessionalert.com/great-trough-detector-improvements/ (sha256:d909e1aeabb28170037c91eff1df1e24f9dc592f3bf08d3dd69915734f9d2e94), https://recessionalert.com/great-trough-signal/ (sha256:c3ab47de93133ac9842dc4d0c437275949577196ad4d2d026d8fbe839716b538), https://recessionalert.com/on-standby-for-a-great-trough/ (sha256:e6cafff2554dad6824641584d019cea04de08d748300db74954c49282879f8b8)
- Workbook: https://recessionalert.com/excel-data/ WeeklyData.xlsx sha256:fc2be5f1fc2a2e38949ae566f6e8cb4699a95562975a498fb5a53510cc40d67c sheet SP500 BREADTH DATA cols 21-23
- Runner:
research/recessionalert/great_trough.py - Spec:
research/findings/specs/recessionalert-great-trough.json - Registry:
research/fixtures/buy-signals-v1.json - History:
docs/site-data/signals/history.json - Page:
docs/other-indicators.html - Experiment:
docs/experiments/qm-09tp.22.htmlanddocs/experiments/qm-09tp.22-analysis.html