Files
set50-system/docs/engineering-log/2026-08-23-research-run.md
2026-08-23 14:42:02 +07:00

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 version 0.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.