This runbook covers the production release path for CryptoLivePoolPipelines.
Primary production outputs:
data/output/latest_universe.jsondata/output/latest_ranking.csvdata/output/live_pool.jsondata/output/live_pool_legacy.jsondata/output/artifact_manifest.jsondata/output/release_manifest.jsondata/output/release_status_summary.jsondata/output/release_status_summary.mddata/output/monthly_review.jsondata/output/monthly_review.mddata/output/monthly_telegram.txtdata/output/monthly_report_bundle/monthly_report_bundle.jsondata/output/monthly_report_bundle/ai_review_input.mddata/output/monthly_report_bundle/job_summary.md
Primary publish targets:
- GCS current pointers under
crypto-live-pool-pipelines/current - GCS versioned release objects under
crypto-live-pool-pipelines/releases/<version> - Firestore
strategy/CRYPTO_LIVE_POOL_ROTATION_LIVE_POOL
The GCS prefix, Firestore document, and source_project value use the
crypto-live-pool-pipelines v1 artifact namespace.
This repository owns the monthly live-pool membership, ranking, and published symbol order. Downstream runtime repositories should consume the validated artifact contract and preserve that order when passing the pool into strategy code.
Production path:
scripts/download_history.pyscripts/build_live_pool.pyscripts/validate_release_contract.pyscripts/publish_release.pyscripts/write_release_heartbeat.py
Research-only / non-publish path:
scripts/run_research_backtest.pyscripts/run_walkforward_validation.pyscripts/compare_external_data.pyscripts/sweep_external_data_profiles.pyscripts/run_monthly_shadow_build.py
Rules:
- Do not treat shadow outputs, external-data experiments, or research summaries as publish-ready production artifacts.
- Only
core_majorbuild outputs that pass contract validation should be published to downstream systems. - If a manual run uses
--as-of-datefor historical investigation, treat it as replay unless you intentionally publish with--allow-stale.
This repository owns the monthly reporting and publish-status summary layer for the upstream release.
Operator-facing summary entrypoints:
scripts/run_release_status_summary.pyfor the canonical release-status summary built from the current official artifactsscripts/run_monthly_review_briefing.pyfor the monthly review package; it requires same-cycle shadow outputs so review evidence always includes official and challenger coveragescripts/run_monthly_build_telegram.pyfor the optional short Telegram health notification or local preview textscripts/run_monthly_report_bundle.pyfor the standard monthly report bundle used by Actions artifacts and AI review handoffscripts/write_release_heartbeat.pyfor the lightweight logs-branch heartbeat record- Monthly live-pool ordering uses a deterministic tie-break:
final_score, thenconfidence, thenliquidity_stability, thenavg_quote_vol_180, thensymbol - Monthly review evidence includes the latest official/challenger track composition, overlap against the official pool, next-candidate boundary, and the deterministic tie-break order.
Boundary rules:
- Downstream execution systems should consume the validated release artifacts, not recreate the monthly report layer.
- Downstream systems should not rerank or rebuild the monthly live pool from local runtime indicators.
- Research reports and shadow-track diagnostics stay upstream and are not part of the minimum downstream execution contract.
- Telegram messages from this repository are operational release notifications, not trade execution alerts.
The monthly publish workflow creates a monthly-review issue, then dispatches CodexAuditBridge as the automated review and remediation path. The bridge owns provider selection through SELFHOSTED_CODEX_REVIEW_PROVIDER: auto is the default and runs the self-hosted Codex path first, falls back to the configured API reviewers when Codex setup or execution fails, and fails loudly when no API fallback key is configured. codex disables API fallback; api posts a combined API review; openai and anthropic post a single-provider API review only.
If the bridge dispatch fails, the monthly publish workflow fails loudly. Source-local legacy AI review workflows are intentionally removed; provider fallback lives in CodexAuditBridge.
- Refresh or verify local data:
.venv/bin/python scripts/download_history.py --top-liquid 90 --force-exchange-info- Build the production pool:
.venv/bin/python scripts/build_live_pool.py --universe-mode core_major- Run explicit contract validation:
.venv/bin/python scripts/validate_release_contract.py --mode core_major --expected-pool-size 5 --require-manifest --require-artifact-manifest- Run publish preflight without external writes:
.venv/bin/python scripts/publish_release.py --dry-run --mode core_major- Generate the canonical release-status summary:
.venv/bin/python scripts/run_release_status_summary.pyBefore the review package is generated, confirm the monthly shadow build has produced both
data/output/monthly_shadow_build_summary.json and
data/output/shadow_candidate_tracks/track_summary.csv. The hosted monthly publish
workflow runs this shadow build automatically before the review step.
- Generate the monthly review package:
.venv/bin/python scripts/run_monthly_review_briefing.py- Render the Telegram preview text without sending:
.venv/bin/python scripts/run_monthly_build_telegram.py --print-only --output-path data/output/monthly_telegram.txt- Assemble the monthly report bundle:
.venv/bin/python scripts/run_monthly_report_bundle.py- Only after steps 1-8 pass, run the real publish path through the workflow or a controlled manual execution.
requirements-lock.txtis present and matches the intended release dependency set.- Local artifacts are non-empty and pass
scripts/validate_release_contract.py. live_pool.json,live_pool_legacy.json, andrelease_manifest.jsonagree onas_of_date,version,mode,pool_size, andsource_project;artifact_manifest.jsonagrees onas_of_date,version,mode,source_project, andsymbol_count.GCP_PROJECT_ID,GCS_BUCKET,FIRESTORE_COLLECTION, andFIRESTORE_DOCUMENTare set correctly for real publish.- Historical backfills use
--allow-staleexplicitly; do not silently publish stale artifacts.
Symptoms:
validate_release_contract.pyexits non-zeropublish_release.pyfails during preflight
Actions:
- Re-run
scripts/build_live_pool.py - Inspect
data/output/latest_universe.json,latest_ranking.csv,live_pool.json,live_pool_legacy.json, andartifact_manifest.json - Confirm
pool_size,symbols,symbol_map,version, andsource_projectare present and aligned
Symptoms:
- Contract validation reports outputs are older than the allowed age window
Actions:
- Prefer rebuilding from refreshed raw data
- If you are intentionally replaying an older month, use
--allow-staleand record that the run is historical - Do not treat stale output as a healthy production release
Symptoms:
- Preflight errors for
GCP_PROJECT_ID,GCS_BUCKET, Firestore collection, or Firestore document
Actions:
- Fix the missing workflow variable first
- Re-run
scripts/publish_release.py --dry-run --mode core_major - Only retry real publish after dry-run is clean
Symptoms:
pool_sizemismatch- live pool symbols not found in ranking
- live pool symbols are not a subset of latest universe
Actions:
- Stop the release
- Review the latest build inputs and
config/default.yaml - Rebuild and validate before any downstream sync
Use rollback only when the newest publish is clearly bad or malformed.
- Identify the last known good version from:
- Firestore document history
- GCS
crypto-live-pool-pipelines/releases/<version>/ - the last good
data/output/release_manifest.json
- Restore the five canonical artifacts from that version into
data/output/:
latest_universe.jsonlatest_ranking.csvlive_pool.jsonlive_pool_legacy.jsonartifact_manifest.json
- Validate the restored payload locally:
.venv/bin/python scripts/validate_release_contract.py --mode core_major --expected-pool-size 5 --require-artifact-manifest- Regenerate the manifest and verify publish preflight:
.venv/bin/python scripts/publish_release.py --dry-run --mode core_major --allow-stale- Re-publish the restored version to GCS / Firestore through the controlled release path.
Rollback note:
--allow-staleis expected during rollback because the restored version is historical.- Record the rollback version and reason in the operator log or release notes.
- Confirm
release_status_summary.jsonreportsstatus=okfor the published month. - Confirm
data/output/monthly_report_bundle/job_summary.mdmatches the released month and includes the expected bundle file list. - Confirm the Actions run uploaded a
monthly-report-<as_of_date>artifact for download. - Confirm Firestore
strategy/CRYPTO_LIVE_POOL_ROTATION_LIVE_POOLcontains the expectedversion,mode,symbols, andsource_project. - Confirm GCS current pointers and versioned objects exist for the same version.
- Confirm downstream consumers are reading the new version without falling back to degraded sources.