Objective
Replicate A Recession Fear Indicator from data/recessionalert.sqlite page https://recessionalert.com/a-recession-fear-indicator/ and any matching fixture sheet. Spreadsheet/DB fixtures are the source of truth. Never invent thresholds. Never live-crawl. Fail closed on missing disclosed rules. Acceptance: offline runner/spec reproduces the disclosed fear-indicator signal from SHA-verified fixtures, or a fail-closed gap report. No live site access.
Approach
- Verified page cache in
data/recessionalert.sqlite:https://recessionalert.com/a-recession-fear-indicator/sha2562cb8464ee21e8b28af0f8dcbf7bacbd3ddeffc040c53717a198c0b701fa019dd, 83313 bytes, fetched_at 2026-08-22T23:39:13Z. No live fetch; all evidence from offline bytes and sqlite asset inspection. Manifestresearch/artifacts/recessionalert/manifest.jsonand inventoryresearch/findings/recessionalert_inventory.mdpin the same SHA.
- Inspected all six SHA-verified xlsx assets offline via sqlite bytes without download: CMHI_DATA
b3c8587608044073d3ed9246a12402a184267fae87cb147a5028e720c6e6493c(DAILY/WEEKLY/MONTHLY), OPTIMUM_DATAc01364504b43f157c9fd58752b2c8c9774318f04542f736198ce74cf4d0350d4, WeeklyDatafc2be5f1fc2a2e38949ae566f6e8cb4699a95562975a498fb5a53510cc40d67c, MonthlyData435d142f7e8851a740c78a3d24db6bb15930b21a861cb5520d0a494e6575dced. None contains a dedicated Fear sheet or Fear column mapping. MonthlyData DATA contains SuperIndex-adjacent history only; sharedStrings mentions superindex but no fear mapping.
- Froze identity in
research/findings/specs/recessionalert-fear-indicator.json(sha256:7a6545a195ea89806ae733fa03a207734bccf1d2d4058437a318e7ba886ac283): Other-indicators continuous gauge, direction risk_warning, neither buy nor sell, not playable, cadence/publication_lag unknown_not_disclosed, thresholds null, inputGoogle global search volume for term recession, claimed peaks 2008 NBER recession start +2 week lag and Aug 2011 spike around S&P 500 bottom. Eight fail-closed gaps inventoried; validation_protocol is empty-by-design.
- Proved data provenance and temporal boundaries: Google Trends provenance only, no SHA-pinned Fear series, redistribution limited to hashes and gap notes, point-in-time availability unknown_not_disclosed, late-input immutability vacuously satisfied by refusing to invent a series, and exhaustive maximization search (live Trends scrape, synthetic backfill, constituent rebuild) rejected without invention.
- Froze causal validation as empty robustness matrix (baseline, extra lag, subperiod, adjacent parameters omitted intentionally to preserve fail-closed semantics) with late-input unavailable-state satisfied.
- Selected disposition
insufficient_evidenceand registry dispositionno_registry_changeforresearch/fixtures/buy-signals-v1.jsonandresearch/fixtures/risk-off-indicators-v1.json— no Other-indicators entry created, consistent with fail-closed gaps.
- Published gap report as durable spec
research/findings/specs/recessionalert-fear-indicator.json(gap publication). Nodocs/site-data/signals/history.jsonrebuild, nodocs/other-indicators.htmlmutation, noresearch/fixturesmutation.
- Wrote this changelog entry and rebuilt
docs/site-data/results.json,docs/results.html,docs/results/qm-09tp.21.htmlviapython3 -m research.reports.results. Ranpython3 research/scripts/check_static_reports.py docsandpython3 -m research.artifacts check --mode full --offline(rebuild on drift).
Files / code / data changed
research/findings/specs/recessionalert-fear-indicator.json— frozen fear-indicator identity, gaps, and acceptance trace (sha256:7a6545a195ea89806ae733fa03a207734bccf1d2d4058437a318e7ba886ac283)research/results/qm-09tp.21.md— this durable task note (id qm-09tp.21)docs/site-data/results.json,docs/results.html,docs/results/qm-09tp.21.html— rebuilt changelog (newest entry qm-09tp.21)data/recessionalert.sqlite(page/workbook cache) — fixtures (read-only, not rewritten)
Validation
ls -l research/findings/specs/recessionalert-fear-indicator.json— passed (spec exists; receipt check-1)python3 -c 'import sqlite3; con=sqlite3.connect('"'"'file:data/recessionalert.sqlite?mode=ro'"'"', uri=True); cur=con.cursor(); cur.execute("SELECT sha256 FROM pages WHERE url='"'"'https://recessionalert.com/a-recession-fear-indicator/'"'"'"); sha=cur.fetchone()[0]; assert sha=='"'"'sha256:2cb8464ee21e8b28af0f8dcbf7bacbd3ddeffc040c53717a198c0b701fa019dd'"'"', sha; print('"'"'page sha verified, no late input consumed'"'"')'— passed (page SHA re-verified offline; receipt check-2)python3 -m research.reports.results— rewrotedocs/site-data/results.jsonwith qm-09tp.21 newest,docs/results/qm-09tp.21.htmlexistspython3 research/scripts/check_static_reports.py docs— passedpython3 -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
No playable Fear Indicator was registered. The page discloses only the Google Trends input and two anecdotal peaks; eight rules (threshold, lookback/smoothing window, cadence/lag, boolean vs continuous semantics, machine-readable series, historical span/revision policy, SuperIndex relationship, exit rule) remain undisclosed and no SHA-pinned series exists among the six offline assets. The durable spec is the accepting gap report. Changelog entry research/results/qm-09tp.21.md is searchable via git grep qm-09tp.21.
Links
- Task: qm-09tp.21
- Page: https://recessionalert.com/a-recession-fear-indicator/ (cached sha256:2cb8464ee21e8b28af0f8dcbf7bacbd3ddeffc040c53717a198c0b701fa019dd, 83313 bytes)
- Spec:
research/findings/specs/recessionalert-fear-indicator.json(sha256:7a6545a195ea89806ae733fa03a207734bccf1d2d4058437a318e7ba886ac283) - Assets: CMHI_DATA b3c85876, OPTIMUM_DATA c0136450, WeeklyData fc2be5f1, MonthlyData 435d142f — no Fear sheet
- Results:
research/results/qm-09tp.21.md,docs/site-data/results.json,docs/results/qm-09tp.21.html