3.5 KiB
2026-08-23 — research runner and durable paper workflow
Plan status
- Frozen Tourism research runner: complete.
- Immutable blocked/ready report store: complete.
- Revision-aware independent-event selection: complete.
- Next-trading-session event execution: complete.
- Durable local paper ledger: complete.
- Real validated event study: blocked by evidence gates, by design.
Changed files
backend/app/research.py— immutable research reports, gate evaluation, frozen input manifest, deterministic event-study runner.backend/app/prices.py— verified snapshot loading and raw-hash integrity checks.backend/app/event_study.py— revision-aware readiness, UTC release-key canonicalization, next-session execution anchor.backend/app/vintages.py— timezone-equivalent publication timestamps now classify as the same release revision.backend/app/paper.py— atomic JSON persistence and restart-safe loading.backend/app/__init__.py— research endpoints, durable ledger configuration, API version0.5.0.backend/scripts/run_tourism_research.py— headless research check CLI.backend/tests/test_research.py,test_paper.py,test_event_study.py,test_api.py— report, persistence, revision and calendar edge coverage.frontend/src/App.vue,frontend/src/style.css— Research Run panel, human-readable gate reason, result cards and navigation.README.md— operator workflow and current boundary.
Live workflow evidence
GET /api/v1/health
HTTP 200; mode=research, version=0.5.0
POST /api/v1/research/tourism/run
HTTP 200; report status=blocked; run_id persisted
GET /api/v1/research/tourism/latest
HTTP 200; same run_id returned
GET /api/v1/prices/health
HTTP 200; symbols=9, quality=revised_vendor_history, point_in_time=false
GET /api/v1/backtest/tourism?min_events=12
HTTP 409; 1 independent vintage / 12 required
The stored report contains the single BOT vintage ID/hash, the Yahoo price snapshot ID/hash, configuration, separate vintage and price gates, and the exact blocking reason. Re-running the same inputs returns the same immutable report rather than creating a second result.
Verification
PYTHONPATH=backend .venv/bin/python -W error -m unittest discover -s backend/tests -v
Ran 54 tests ... OK
npm run build
Vite build completed successfully.
npm audit --omit=dev --audit-level=high
found 0 vulnerabilities
python /tmp/set50_platform_security_scan.py
{}
python -m compileall -q backend
git diff --check
Safety boundary
The app is operationally usable for live BOT ingestion, lineage/replay inspection, deterministic signal review, frozen research-run checks, and paper-only recording. It is not yet allowed to claim Tourism alpha or run a validated backtest because the archive has one independent BOT release and the available price history is revised vendor history.
No LLM, webhook, MT5 bridge or live order path was added.
Independent review
passed: true
security_concerns: []
logic_errors: []
Non-blocking backlog: add explicit concurrent-writer tests for atomic JSON stores and retain integration coverage for timezone-equivalent revisions and holiday/weekend execution scheduling.
Exact next action
Continue collecting independent BOT releases. Evaluate an official/contracted price source with defensible availability timestamps or maintain a forward market-observation archive. Raise the research gate only after both requirements are true: enough independent releases and point-in-time price coverage for every event window.