From bc54dfdfe4bf7d53426ea6e54e272640d0c08d66 Mon Sep 17 00:00:00 2001 From: Pigbibi <20649888+Pigbibi@users.noreply.github.com> Date: Wed, 10 Jun 2026 15:23:28 +0800 Subject: [PATCH] Use shared runtime logs bucket --- .../workflows/publish-snapshot-artifacts.yml | 32 +++++++++---------- .../workflows/publish-strategy-plugins.yml | 8 ++--- .../workflows/snapshot-artifact-health.yml | 4 +-- .../workflows/update-source-input-data.yml | 8 ++--- docs/artifact_contract.md | 4 +-- docs/operator_runbook.md | 20 ++++++------ docs/operator_runbook.zh-CN.md | 20 ++++++------ .../test_strategy_plugin_publish_workflow.py | 6 ++-- 8 files changed, 51 insertions(+), 51 deletions(-) diff --git a/.github/workflows/publish-snapshot-artifacts.yml b/.github/workflows/publish-snapshot-artifacts.yml index 9a8c15a..07578a6 100644 --- a/.github/workflows/publish-snapshot-artifacts.yml +++ b/.github/workflows/publish-snapshot-artifacts.yml @@ -98,24 +98,24 @@ jobs: CURRENT_HOLDINGS: ${{ inputs.current_holdings }} PORTFOLIO_TOTAL_EQUITY: ${{ inputs.portfolio_total_equity }} MIN_ADV20_USD: ${{ inputs.min_adv20_usd }} - SCHEDULED_PRICES_PATH: ${{ vars.SCHEDULED_US_EQUITY_PRICES_PATH || 'gs://qsl-runtime-logs-interactivebrokersquant/strategy-artifacts/us_equity/inputs/r1000_official_monthly_v2_alias/r1000_price_history.csv' }} - SCHEDULED_UNIVERSE_PATH: ${{ vars.SCHEDULED_US_EQUITY_UNIVERSE_PATH || 'gs://qsl-runtime-logs-interactivebrokersquant/strategy-artifacts/us_equity/inputs/r1000_official_monthly_v2_alias/r1000_universe_history.csv' }} - SCHEDULED_SOURCE_INPUT_MANIFEST_PATH: ${{ vars.SCHEDULED_US_EQUITY_SOURCE_INPUT_MANIFEST_PATH || 'gs://qsl-runtime-logs-interactivebrokersquant/strategy-artifacts/us_equity/inputs/r1000_official_monthly_v2_alias/r1000_source_input_manifest.json' }} + SCHEDULED_PRICES_PATH: ${{ vars.SCHEDULED_US_EQUITY_PRICES_PATH || 'gs://qsl-runtime-logs-shared/strategy-artifacts/us_equity/inputs/r1000_official_monthly_v2_alias/r1000_price_history.csv' }} + SCHEDULED_UNIVERSE_PATH: ${{ vars.SCHEDULED_US_EQUITY_UNIVERSE_PATH || 'gs://qsl-runtime-logs-shared/strategy-artifacts/us_equity/inputs/r1000_official_monthly_v2_alias/r1000_universe_history.csv' }} + SCHEDULED_SOURCE_INPUT_MANIFEST_PATH: ${{ vars.SCHEDULED_US_EQUITY_SOURCE_INPUT_MANIFEST_PATH || 'gs://qsl-runtime-logs-shared/strategy-artifacts/us_equity/inputs/r1000_official_monthly_v2_alias/r1000_source_input_manifest.json' }} SCHEDULED_RUSSELL_CONFIG_PATH: ${{ vars.SCHEDULED_RUSSELL_1000_CONFIG_PATH || '' }} - SCHEDULED_RUSSELL_GCS_PREFIX: ${{ vars.SCHEDULED_RUSSELL_1000_GCS_PREFIX || 'gs://qsl-runtime-logs-interactivebrokersquant/strategy-artifacts/us_equity/russell_1000_multi_factor_defensive_staging' }} - SCHEDULED_MEGA_CAP_DYNAMIC_TOP20_PRICES_PATH: ${{ vars.SCHEDULED_MEGA_CAP_DYNAMIC_TOP20_PRICES_PATH || vars.SCHEDULED_US_EQUITY_PRICES_PATH || 'gs://qsl-runtime-logs-interactivebrokersquant/strategy-artifacts/us_equity/inputs/r1000_official_monthly_v2_alias/r1000_price_history.csv' }} - SCHEDULED_MEGA_CAP_DYNAMIC_TOP20_UNIVERSE_PATH: ${{ vars.SCHEDULED_MEGA_CAP_DYNAMIC_TOP20_UNIVERSE_PATH || 'gs://qsl-runtime-logs-interactivebrokersquant/strategy-artifacts/us_equity/inputs/r1000_official_monthly_v2_alias/r1000_latest_holdings_snapshot.csv' }} - SCHEDULED_MEGA_CAP_DYNAMIC_TOP20_GCS_PREFIX: ${{ vars.SCHEDULED_MEGA_CAP_DYNAMIC_TOP20_GCS_PREFIX || 'gs://qsl-runtime-logs-interactivebrokersquant/strategy-artifacts/us_equity/mega_cap_leader_rotation_dynamic_top20_staging' }} - SCHEDULED_MEGA_CAP_AGGRESSIVE_PRICES_PATH: ${{ vars.SCHEDULED_MEGA_CAP_AGGRESSIVE_PRICES_PATH || vars.SCHEDULED_MEGA_CAP_DYNAMIC_TOP20_PRICES_PATH || vars.SCHEDULED_US_EQUITY_PRICES_PATH || 'gs://qsl-runtime-logs-interactivebrokersquant/strategy-artifacts/us_equity/inputs/r1000_official_monthly_v2_alias/r1000_price_history.csv' }} - SCHEDULED_MEGA_CAP_AGGRESSIVE_UNIVERSE_PATH: ${{ vars.SCHEDULED_MEGA_CAP_AGGRESSIVE_UNIVERSE_PATH || vars.SCHEDULED_MEGA_CAP_DYNAMIC_TOP20_UNIVERSE_PATH || 'gs://qsl-runtime-logs-interactivebrokersquant/strategy-artifacts/us_equity/inputs/r1000_official_monthly_v2_alias/r1000_latest_holdings_snapshot.csv' }} - SCHEDULED_MEGA_CAP_AGGRESSIVE_GCS_PREFIX: ${{ vars.SCHEDULED_MEGA_CAP_AGGRESSIVE_GCS_PREFIX || 'gs://qsl-runtime-logs-interactivebrokersquant/strategy-artifacts/us_equity/mega_cap_leader_rotation_aggressive_staging' }} - SCHEDULED_MEGA_CAP_TOP50_BALANCED_PRICES_PATH: ${{ vars.SCHEDULED_MEGA_CAP_TOP50_BALANCED_PRICES_PATH || vars.SCHEDULED_MEGA_CAP_AGGRESSIVE_PRICES_PATH || vars.SCHEDULED_MEGA_CAP_DYNAMIC_TOP20_PRICES_PATH || vars.SCHEDULED_US_EQUITY_PRICES_PATH || 'gs://qsl-runtime-logs-interactivebrokersquant/strategy-artifacts/us_equity/inputs/r1000_official_monthly_v2_alias/r1000_price_history.csv' }} - SCHEDULED_MEGA_CAP_TOP50_BALANCED_UNIVERSE_PATH: ${{ vars.SCHEDULED_MEGA_CAP_TOP50_BALANCED_UNIVERSE_PATH || vars.SCHEDULED_MEGA_CAP_AGGRESSIVE_UNIVERSE_PATH || vars.SCHEDULED_MEGA_CAP_DYNAMIC_TOP20_UNIVERSE_PATH || 'gs://qsl-runtime-logs-interactivebrokersquant/strategy-artifacts/us_equity/inputs/r1000_official_monthly_v2_alias/r1000_latest_holdings_snapshot.csv' }} - SCHEDULED_MEGA_CAP_TOP50_BALANCED_GCS_PREFIX: ${{ vars.SCHEDULED_MEGA_CAP_TOP50_BALANCED_GCS_PREFIX || 'gs://qsl-runtime-logs-interactivebrokersquant/strategy-artifacts/us_equity/mega_cap_leader_rotation_top50_balanced_staging' }} - SCHEDULED_DYNAMIC_MEGA_LEVERAGED_PULLBACK_PRICES_PATH: ${{ vars.SCHEDULED_DYNAMIC_MEGA_LEVERAGED_PULLBACK_PRICES_PATH || vars.SCHEDULED_MEGA_CAP_DYNAMIC_TOP20_PRICES_PATH || vars.SCHEDULED_US_EQUITY_PRICES_PATH || 'gs://qsl-runtime-logs-interactivebrokersquant/strategy-artifacts/us_equity/inputs/r1000_official_monthly_v2_alias/r1000_price_history.csv' }} - SCHEDULED_DYNAMIC_MEGA_LEVERAGED_PULLBACK_UNIVERSE_PATH: ${{ vars.SCHEDULED_DYNAMIC_MEGA_LEVERAGED_PULLBACK_UNIVERSE_PATH || vars.SCHEDULED_MEGA_CAP_DYNAMIC_TOP20_UNIVERSE_PATH || 'gs://qsl-runtime-logs-interactivebrokersquant/strategy-artifacts/us_equity/inputs/r1000_official_monthly_v2_alias/r1000_latest_holdings_snapshot.csv' }} + SCHEDULED_RUSSELL_GCS_PREFIX: ${{ vars.SCHEDULED_RUSSELL_1000_GCS_PREFIX || 'gs://qsl-runtime-logs-shared/strategy-artifacts/us_equity/russell_1000_multi_factor_defensive_staging' }} + SCHEDULED_MEGA_CAP_DYNAMIC_TOP20_PRICES_PATH: ${{ vars.SCHEDULED_MEGA_CAP_DYNAMIC_TOP20_PRICES_PATH || vars.SCHEDULED_US_EQUITY_PRICES_PATH || 'gs://qsl-runtime-logs-shared/strategy-artifacts/us_equity/inputs/r1000_official_monthly_v2_alias/r1000_price_history.csv' }} + SCHEDULED_MEGA_CAP_DYNAMIC_TOP20_UNIVERSE_PATH: ${{ vars.SCHEDULED_MEGA_CAP_DYNAMIC_TOP20_UNIVERSE_PATH || 'gs://qsl-runtime-logs-shared/strategy-artifacts/us_equity/inputs/r1000_official_monthly_v2_alias/r1000_latest_holdings_snapshot.csv' }} + SCHEDULED_MEGA_CAP_DYNAMIC_TOP20_GCS_PREFIX: ${{ vars.SCHEDULED_MEGA_CAP_DYNAMIC_TOP20_GCS_PREFIX || 'gs://qsl-runtime-logs-shared/strategy-artifacts/us_equity/mega_cap_leader_rotation_dynamic_top20_staging' }} + SCHEDULED_MEGA_CAP_AGGRESSIVE_PRICES_PATH: ${{ vars.SCHEDULED_MEGA_CAP_AGGRESSIVE_PRICES_PATH || vars.SCHEDULED_MEGA_CAP_DYNAMIC_TOP20_PRICES_PATH || vars.SCHEDULED_US_EQUITY_PRICES_PATH || 'gs://qsl-runtime-logs-shared/strategy-artifacts/us_equity/inputs/r1000_official_monthly_v2_alias/r1000_price_history.csv' }} + SCHEDULED_MEGA_CAP_AGGRESSIVE_UNIVERSE_PATH: ${{ vars.SCHEDULED_MEGA_CAP_AGGRESSIVE_UNIVERSE_PATH || vars.SCHEDULED_MEGA_CAP_DYNAMIC_TOP20_UNIVERSE_PATH || 'gs://qsl-runtime-logs-shared/strategy-artifacts/us_equity/inputs/r1000_official_monthly_v2_alias/r1000_latest_holdings_snapshot.csv' }} + SCHEDULED_MEGA_CAP_AGGRESSIVE_GCS_PREFIX: ${{ vars.SCHEDULED_MEGA_CAP_AGGRESSIVE_GCS_PREFIX || 'gs://qsl-runtime-logs-shared/strategy-artifacts/us_equity/mega_cap_leader_rotation_aggressive_staging' }} + SCHEDULED_MEGA_CAP_TOP50_BALANCED_PRICES_PATH: ${{ vars.SCHEDULED_MEGA_CAP_TOP50_BALANCED_PRICES_PATH || vars.SCHEDULED_MEGA_CAP_AGGRESSIVE_PRICES_PATH || vars.SCHEDULED_MEGA_CAP_DYNAMIC_TOP20_PRICES_PATH || vars.SCHEDULED_US_EQUITY_PRICES_PATH || 'gs://qsl-runtime-logs-shared/strategy-artifacts/us_equity/inputs/r1000_official_monthly_v2_alias/r1000_price_history.csv' }} + SCHEDULED_MEGA_CAP_TOP50_BALANCED_UNIVERSE_PATH: ${{ vars.SCHEDULED_MEGA_CAP_TOP50_BALANCED_UNIVERSE_PATH || vars.SCHEDULED_MEGA_CAP_AGGRESSIVE_UNIVERSE_PATH || vars.SCHEDULED_MEGA_CAP_DYNAMIC_TOP20_UNIVERSE_PATH || 'gs://qsl-runtime-logs-shared/strategy-artifacts/us_equity/inputs/r1000_official_monthly_v2_alias/r1000_latest_holdings_snapshot.csv' }} + SCHEDULED_MEGA_CAP_TOP50_BALANCED_GCS_PREFIX: ${{ vars.SCHEDULED_MEGA_CAP_TOP50_BALANCED_GCS_PREFIX || 'gs://qsl-runtime-logs-shared/strategy-artifacts/us_equity/mega_cap_leader_rotation_top50_balanced_staging' }} + SCHEDULED_DYNAMIC_MEGA_LEVERAGED_PULLBACK_PRICES_PATH: ${{ vars.SCHEDULED_DYNAMIC_MEGA_LEVERAGED_PULLBACK_PRICES_PATH || vars.SCHEDULED_MEGA_CAP_DYNAMIC_TOP20_PRICES_PATH || vars.SCHEDULED_US_EQUITY_PRICES_PATH || 'gs://qsl-runtime-logs-shared/strategy-artifacts/us_equity/inputs/r1000_official_monthly_v2_alias/r1000_price_history.csv' }} + SCHEDULED_DYNAMIC_MEGA_LEVERAGED_PULLBACK_UNIVERSE_PATH: ${{ vars.SCHEDULED_DYNAMIC_MEGA_LEVERAGED_PULLBACK_UNIVERSE_PATH || vars.SCHEDULED_MEGA_CAP_DYNAMIC_TOP20_UNIVERSE_PATH || 'gs://qsl-runtime-logs-shared/strategy-artifacts/us_equity/inputs/r1000_official_monthly_v2_alias/r1000_latest_holdings_snapshot.csv' }} SCHEDULED_DYNAMIC_MEGA_LEVERAGED_PULLBACK_PRODUCT_MAP_PATH: ${{ vars.SCHEDULED_DYNAMIC_MEGA_LEVERAGED_PULLBACK_PRODUCT_MAP_PATH || '' }} - SCHEDULED_DYNAMIC_MEGA_LEVERAGED_PULLBACK_GCS_PREFIX: ${{ vars.SCHEDULED_DYNAMIC_MEGA_LEVERAGED_PULLBACK_GCS_PREFIX || 'gs://qsl-runtime-logs-interactivebrokersquant/strategy-artifacts/us_equity/dynamic_mega_leveraged_pullback_staging' }} + SCHEDULED_DYNAMIC_MEGA_LEVERAGED_PULLBACK_GCS_PREFIX: ${{ vars.SCHEDULED_DYNAMIC_MEGA_LEVERAGED_PULLBACK_GCS_PREFIX || 'gs://qsl-runtime-logs-shared/strategy-artifacts/us_equity/dynamic_mega_leveraged_pullback_staging' }} steps: - name: Checkout diff --git a/.github/workflows/publish-strategy-plugins.yml b/.github/workflows/publish-strategy-plugins.yml index 3613afa..676b247 100644 --- a/.github/workflows/publish-strategy-plugins.yml +++ b/.github/workflows/publish-strategy-plugins.yml @@ -74,8 +74,8 @@ jobs: PRICE_END: ${{ inputs.price_end }} INPUT_MARKET_REGIME_GCS_PREFIX: ${{ inputs.market_regime_gcs_prefix }} INPUT_MARKET_REGIME_SOXL_GCS_PREFIX: ${{ inputs.market_regime_soxl_gcs_prefix }} - MARKET_REGIME_TQQQ_GCS_PREFIX: ${{ vars.MARKET_REGIME_CONTROL_GCS_PREFIX || 'gs://qsl-runtime-logs-interactivebrokersquant/strategy-artifacts/us_equity/tqqq_growth_income/plugins/market_regime_control' }} - MARKET_REGIME_SOXL_GCS_PREFIX: ${{ vars.MARKET_REGIME_CONTROL_SOXL_GCS_PREFIX || 'gs://qsl-runtime-logs-interactivebrokersquant/strategy-artifacts/us_equity/market_regime_notification/plugins/market_regime_control' }} + MARKET_REGIME_TQQQ_GCS_PREFIX: ${{ vars.MARKET_REGIME_CONTROL_GCS_PREFIX || 'gs://qsl-runtime-logs-shared/strategy-artifacts/us_equity/tqqq_growth_income/plugins/market_regime_control' }} + MARKET_REGIME_SOXL_GCS_PREFIX: ${{ vars.MARKET_REGIME_CONTROL_SOXL_GCS_PREFIX || 'gs://qsl-runtime-logs-shared/strategy-artifacts/us_equity/market_regime_notification/plugins/market_regime_control' }} YFINANCE_PROXY: ${{ secrets.YFINANCE_PROXY }} STRATEGY_PROFILE: ${{ matrix.strategy_profile }} PLUGIN_TARGET_TYPE: ${{ matrix.target_type }} @@ -379,7 +379,7 @@ jobs: PRICE_START: ${{ inputs.price_start || '2010-01-01' }} PRICE_END: ${{ inputs.price_end }} INPUT_TQQQ_GCS_PREFIX: ${{ inputs.gcs_prefix }} - TQQQ_GCS_PREFIX: ${{ vars.CRISIS_RESPONSE_SHADOW_GCS_PREFIX || 'gs://qsl-runtime-logs-interactivebrokersquant/strategy-artifacts/us_equity/tqqq_growth_income/plugins/crisis_response_shadow' }} + TQQQ_GCS_PREFIX: ${{ vars.CRISIS_RESPONSE_SHADOW_GCS_PREFIX || 'gs://qsl-runtime-logs-shared/strategy-artifacts/us_equity/tqqq_growth_income/plugins/crisis_response_shadow' }} YFINANCE_PROXY: ${{ secrets.YFINANCE_PROXY }} STRATEGY_PROFILE: ${{ matrix.strategy_profile }} PLUGIN_NAME: crisis_response_shadow @@ -583,7 +583,7 @@ jobs: PRICE_START: ${{ inputs.price_start || '2010-01-01' }} PRICE_END: ${{ inputs.price_end }} INPUT_TACO_GCS_PREFIX: ${{ inputs.taco_gcs_prefix }} - TACO_GCS_PREFIX: ${{ vars.TACO_REBOUND_SHADOW_GCS_PREFIX || 'gs://qsl-runtime-logs-interactivebrokersquant/strategy-artifacts/us_equity/tqqq_growth_income/plugins/taco_rebound_shadow' }} + TACO_GCS_PREFIX: ${{ vars.TACO_REBOUND_SHADOW_GCS_PREFIX || 'gs://qsl-runtime-logs-shared/strategy-artifacts/us_equity/tqqq_growth_income/plugins/taco_rebound_shadow' }} YFINANCE_PROXY: ${{ secrets.YFINANCE_PROXY }} STRATEGY_PROFILE: tqqq_growth_income PLUGIN_NAME: taco_rebound_shadow diff --git a/.github/workflows/snapshot-artifact-health.yml b/.github/workflows/snapshot-artifact-health.yml index 57b5668..fe5f102 100644 --- a/.github/workflows/snapshot-artifact-health.yml +++ b/.github/workflows/snapshot-artifact-health.yml @@ -36,8 +36,8 @@ jobs: GCP_WORKLOAD_IDENTITY_SERVICE_ACCOUNT: ${{ vars.GCP_WORKLOAD_IDENTITY_SERVICE_ACCOUNT }} PROFILE: ${{ matrix.profile }} MAX_MONTH_LAG: ${{ inputs.max_month_lag || '1' }} - SCHEDULED_RUSSELL_GCS_PREFIX: ${{ vars.SCHEDULED_RUSSELL_1000_GCS_PREFIX || 'gs://qsl-runtime-logs-interactivebrokersquant/strategy-artifacts/us_equity/russell_1000_multi_factor_defensive_staging' }} - SCHEDULED_MEGA_CAP_TOP50_BALANCED_GCS_PREFIX: ${{ vars.SCHEDULED_MEGA_CAP_TOP50_BALANCED_GCS_PREFIX || 'gs://qsl-runtime-logs-interactivebrokersquant/strategy-artifacts/us_equity/mega_cap_leader_rotation_top50_balanced_staging' }} + SCHEDULED_RUSSELL_GCS_PREFIX: ${{ vars.SCHEDULED_RUSSELL_1000_GCS_PREFIX || 'gs://qsl-runtime-logs-shared/strategy-artifacts/us_equity/russell_1000_multi_factor_defensive_staging' }} + SCHEDULED_MEGA_CAP_TOP50_BALANCED_GCS_PREFIX: ${{ vars.SCHEDULED_MEGA_CAP_TOP50_BALANCED_GCS_PREFIX || 'gs://qsl-runtime-logs-shared/strategy-artifacts/us_equity/mega_cap_leader_rotation_top50_balanced_staging' }} steps: - name: Checkout diff --git a/.github/workflows/update-source-input-data.yml b/.github/workflows/update-source-input-data.yml index ed9394c..d0ebd9a 100644 --- a/.github/workflows/update-source-input-data.yml +++ b/.github/workflows/update-source-input-data.yml @@ -14,7 +14,7 @@ on: output_prefix: description: GCS prefix for refreshed source inputs. required: false - default: gs://qsl-runtime-logs-interactivebrokersquant/strategy-artifacts/us_equity/inputs/r1000_official_monthly_v2_alias + default: gs://qsl-runtime-logs-shared/strategy-artifacts/us_equity/inputs/r1000_official_monthly_v2_alias type: string universe_start: description: Earliest iShares monthly universe snapshot request date. @@ -76,7 +76,7 @@ jobs: GCP_PROJECT_ID: ${{ vars.GCP_PROJECT_ID || 'interactivebrokersquant' }} GCP_WORKLOAD_IDENTITY_PROVIDER: ${{ vars.GCP_WORKLOAD_IDENTITY_PROVIDER }} GCP_WORKLOAD_IDENTITY_SERVICE_ACCOUNT: ${{ vars.GCP_WORKLOAD_IDENTITY_SERVICE_ACCOUNT }} - OUTPUT_PREFIX: ${{ inputs.output_prefix || 'gs://qsl-runtime-logs-interactivebrokersquant/strategy-artifacts/us_equity/inputs/r1000_official_monthly_v2_alias' }} + OUTPUT_PREFIX: ${{ inputs.output_prefix || 'gs://qsl-runtime-logs-shared/strategy-artifacts/us_equity/inputs/r1000_official_monthly_v2_alias' }} EXECUTE_PUBLISH: ${{ github.event_name == 'schedule' && 'true' || inputs.execute_publish }} UNIVERSE_START: ${{ inputs.universe_start || '2018-01-01' }} UNIVERSE_END: ${{ inputs.universe_end }} @@ -88,8 +88,8 @@ jobs: SAFE_HAVEN: ${{ inputs.safe_haven || 'BOXX' }} EXTRA_SYMBOLS: ${{ inputs.extra_symbols || 'QQQ,SPY,BOXX' }} CHUNK_SIZE: ${{ inputs.chunk_size || '100' }} - SCHEDULED_RUSSELL_GCS_PREFIX: ${{ vars.SCHEDULED_RUSSELL_1000_GCS_PREFIX || 'gs://qsl-runtime-logs-interactivebrokersquant/strategy-artifacts/us_equity/russell_1000_multi_factor_defensive_staging' }} - SCHEDULED_MEGA_CAP_TOP50_BALANCED_GCS_PREFIX: ${{ vars.SCHEDULED_MEGA_CAP_TOP50_BALANCED_GCS_PREFIX || 'gs://qsl-runtime-logs-interactivebrokersquant/strategy-artifacts/us_equity/mega_cap_leader_rotation_top50_balanced_staging' }} + SCHEDULED_RUSSELL_GCS_PREFIX: ${{ vars.SCHEDULED_RUSSELL_1000_GCS_PREFIX || 'gs://qsl-runtime-logs-shared/strategy-artifacts/us_equity/russell_1000_multi_factor_defensive_staging' }} + SCHEDULED_MEGA_CAP_TOP50_BALANCED_GCS_PREFIX: ${{ vars.SCHEDULED_MEGA_CAP_TOP50_BALANCED_GCS_PREFIX || 'gs://qsl-runtime-logs-shared/strategy-artifacts/us_equity/mega_cap_leader_rotation_top50_balanced_staging' }} steps: - name: Checkout diff --git a/docs/artifact_contract.md b/docs/artifact_contract.md index 09507fb..5e8bff6 100644 --- a/docs/artifact_contract.md +++ b/docs/artifact_contract.md @@ -33,8 +33,8 @@ Required baseline fields: Current runtime-facing US equity snapshot artifacts are published under profile-specific `us_equity` prefixes: ```text -gs://qsl-runtime-logs-interactivebrokersquant/strategy-artifacts/us_equity/russell_1000_multi_factor_defensive_staging/ -gs://qsl-runtime-logs-interactivebrokersquant/strategy-artifacts/us_equity/mega_cap_leader_rotation_top50_balanced_staging/ +gs://qsl-runtime-logs-shared/strategy-artifacts/us_equity/russell_1000_multi_factor_defensive_staging/ +gs://qsl-runtime-logs-shared/strategy-artifacts/us_equity/mega_cap_leader_rotation_top50_balanced_staging/ ``` `tech_communication_pullback_enhancement` remains as archived research-only code and is no longer exposed by scheduled publish, artifact health, or runtime switching workflows. diff --git a/docs/operator_runbook.md b/docs/operator_runbook.md index e01d41e..15d6af4 100644 --- a/docs/operator_runbook.md +++ b/docs/operator_runbook.md @@ -79,20 +79,20 @@ The workflow always uploads generated files as a GitHub Actions artifact. `Update Source Input Data` runs once per month at `00:15 UTC` on the 1st day of the month. It refreshes the shared Russell 1000 inputs used by monthly snapshot profiles: ```text -gs://qsl-runtime-logs-interactivebrokersquant/strategy-artifacts/us_equity/inputs/r1000_official_monthly_v2_alias/r1000_price_history.csv -gs://qsl-runtime-logs-interactivebrokersquant/strategy-artifacts/us_equity/inputs/r1000_official_monthly_v2_alias/r1000_universe_history.csv -gs://qsl-runtime-logs-interactivebrokersquant/strategy-artifacts/us_equity/inputs/r1000_official_monthly_v2_alias/r1000_symbol_aliases.csv -gs://qsl-runtime-logs-interactivebrokersquant/strategy-artifacts/us_equity/inputs/r1000_official_monthly_v2_alias/r1000_universe_snapshot_metadata.csv -gs://qsl-runtime-logs-interactivebrokersquant/strategy-artifacts/us_equity/inputs/r1000_official_monthly_v2_alias/r1000_latest_holdings_snapshot.csv +gs://qsl-runtime-logs-shared/strategy-artifacts/us_equity/inputs/r1000_official_monthly_v2_alias/r1000_price_history.csv +gs://qsl-runtime-logs-shared/strategy-artifacts/us_equity/inputs/r1000_official_monthly_v2_alias/r1000_universe_history.csv +gs://qsl-runtime-logs-shared/strategy-artifacts/us_equity/inputs/r1000_official_monthly_v2_alias/r1000_symbol_aliases.csv +gs://qsl-runtime-logs-shared/strategy-artifacts/us_equity/inputs/r1000_official_monthly_v2_alias/r1000_universe_snapshot_metadata.csv +gs://qsl-runtime-logs-shared/strategy-artifacts/us_equity/inputs/r1000_official_monthly_v2_alias/r1000_latest_holdings_snapshot.csv ``` `Publish Snapshot Artifacts` runs once per month at `00:45 UTC` and builds: ```text profiles=russell_1000_multi_factor_defensive,mega_cap_leader_rotation_top50_balanced -prices_path=gs://qsl-runtime-logs-interactivebrokersquant/strategy-artifacts/us_equity/inputs/r1000_official_monthly_v2_alias/r1000_price_history.csv -russell_universe_path=gs://qsl-runtime-logs-interactivebrokersquant/strategy-artifacts/us_equity/inputs/r1000_official_monthly_v2_alias/r1000_universe_history.csv -mega_top50_balanced_universe_path=gs://qsl-runtime-logs-interactivebrokersquant/strategy-artifacts/us_equity/inputs/r1000_official_monthly_v2_alias/r1000_latest_holdings_snapshot.csv +prices_path=gs://qsl-runtime-logs-shared/strategy-artifacts/us_equity/inputs/r1000_official_monthly_v2_alias/r1000_price_history.csv +russell_universe_path=gs://qsl-runtime-logs-shared/strategy-artifacts/us_equity/inputs/r1000_official_monthly_v2_alias/r1000_universe_history.csv +mega_top50_balanced_universe_path=gs://qsl-runtime-logs-shared/strategy-artifacts/us_equity/inputs/r1000_official_monthly_v2_alias/r1000_latest_holdings_snapshot.csv execute_publish=true ``` @@ -100,8 +100,8 @@ Default scheduled output prefixes: | Profile | Extra config | GCS prefix | | --- | --- | --- | -| `russell_1000_multi_factor_defensive` | none | `gs://qsl-runtime-logs-interactivebrokersquant/strategy-artifacts/us_equity/russell_1000_multi_factor_defensive_staging` | -| `mega_cap_leader_rotation_top50_balanced` | none | `gs://qsl-runtime-logs-interactivebrokersquant/strategy-artifacts/us_equity/mega_cap_leader_rotation_top50_balanced_staging` | +| `russell_1000_multi_factor_defensive` | none | `gs://qsl-runtime-logs-shared/strategy-artifacts/us_equity/russell_1000_multi_factor_defensive_staging` | +| `mega_cap_leader_rotation_top50_balanced` | none | `gs://qsl-runtime-logs-shared/strategy-artifacts/us_equity/mega_cap_leader_rotation_top50_balanced_staging` | The publish workflow keeps a defensive month-end trading-day guard: if the resolved `snapshot_as_of` is not the last NYSE trading day of that snapshot month, it writes a skip artifact and does not publish to GCS. diff --git a/docs/operator_runbook.zh-CN.md b/docs/operator_runbook.zh-CN.md index 991a574..737bd54 100644 --- a/docs/operator_runbook.zh-CN.md +++ b/docs/operator_runbook.zh-CN.md @@ -77,20 +77,20 @@ workflow 每次都会把生成文件上传为 GitHub Actions artifact。 `Update Source Input Data` 每月 1 日 `00:15 UTC` 自动运行,也就是 Asia/Shanghai 同日 `08:15`。它刷新月度 snapshot profiles 共用的 Russell 1000 输入数据: ```text -gs://qsl-runtime-logs-interactivebrokersquant/strategy-artifacts/us_equity/inputs/r1000_official_monthly_v2_alias/r1000_price_history.csv -gs://qsl-runtime-logs-interactivebrokersquant/strategy-artifacts/us_equity/inputs/r1000_official_monthly_v2_alias/r1000_universe_history.csv -gs://qsl-runtime-logs-interactivebrokersquant/strategy-artifacts/us_equity/inputs/r1000_official_monthly_v2_alias/r1000_symbol_aliases.csv -gs://qsl-runtime-logs-interactivebrokersquant/strategy-artifacts/us_equity/inputs/r1000_official_monthly_v2_alias/r1000_universe_snapshot_metadata.csv -gs://qsl-runtime-logs-interactivebrokersquant/strategy-artifacts/us_equity/inputs/r1000_official_monthly_v2_alias/r1000_latest_holdings_snapshot.csv +gs://qsl-runtime-logs-shared/strategy-artifacts/us_equity/inputs/r1000_official_monthly_v2_alias/r1000_price_history.csv +gs://qsl-runtime-logs-shared/strategy-artifacts/us_equity/inputs/r1000_official_monthly_v2_alias/r1000_universe_history.csv +gs://qsl-runtime-logs-shared/strategy-artifacts/us_equity/inputs/r1000_official_monthly_v2_alias/r1000_symbol_aliases.csv +gs://qsl-runtime-logs-shared/strategy-artifacts/us_equity/inputs/r1000_official_monthly_v2_alias/r1000_universe_snapshot_metadata.csv +gs://qsl-runtime-logs-shared/strategy-artifacts/us_equity/inputs/r1000_official_monthly_v2_alias/r1000_latest_holdings_snapshot.csv ``` `Publish Snapshot Artifacts` 每月 1 日 `00:45 UTC` 自动运行,构建: ```text profiles=russell_1000_multi_factor_defensive,mega_cap_leader_rotation_top50_balanced -prices_path=gs://qsl-runtime-logs-interactivebrokersquant/strategy-artifacts/us_equity/inputs/r1000_official_monthly_v2_alias/r1000_price_history.csv -russell_universe_path=gs://qsl-runtime-logs-interactivebrokersquant/strategy-artifacts/us_equity/inputs/r1000_official_monthly_v2_alias/r1000_universe_history.csv -mega_top50_balanced_universe_path=gs://qsl-runtime-logs-interactivebrokersquant/strategy-artifacts/us_equity/inputs/r1000_official_monthly_v2_alias/r1000_latest_holdings_snapshot.csv +prices_path=gs://qsl-runtime-logs-shared/strategy-artifacts/us_equity/inputs/r1000_official_monthly_v2_alias/r1000_price_history.csv +russell_universe_path=gs://qsl-runtime-logs-shared/strategy-artifacts/us_equity/inputs/r1000_official_monthly_v2_alias/r1000_universe_history.csv +mega_top50_balanced_universe_path=gs://qsl-runtime-logs-shared/strategy-artifacts/us_equity/inputs/r1000_official_monthly_v2_alias/r1000_latest_holdings_snapshot.csv execute_publish=true ``` @@ -98,8 +98,8 @@ execute_publish=true | Profile | Extra config | GCS prefix | | --- | --- | --- | -| `russell_1000_multi_factor_defensive` | none | `gs://qsl-runtime-logs-interactivebrokersquant/strategy-artifacts/us_equity/russell_1000_multi_factor_defensive_staging` | -| `mega_cap_leader_rotation_top50_balanced` | none | `gs://qsl-runtime-logs-interactivebrokersquant/strategy-artifacts/us_equity/mega_cap_leader_rotation_top50_balanced_staging` | +| `russell_1000_multi_factor_defensive` | none | `gs://qsl-runtime-logs-shared/strategy-artifacts/us_equity/russell_1000_multi_factor_defensive_staging` | +| `mega_cap_leader_rotation_top50_balanced` | none | `gs://qsl-runtime-logs-shared/strategy-artifacts/us_equity/mega_cap_leader_rotation_top50_balanced_staging` | workflow 仍保留月末交易日 guard:如果解析得到的 `snapshot_as_of` 不是该月份最后一个 NYSE 交易日,会写出 skip artifact,并且不会发布到 GCS。 diff --git a/tests/test_strategy_plugin_publish_workflow.py b/tests/test_strategy_plugin_publish_workflow.py index e4984f6..19c53ab 100644 --- a/tests/test_strategy_plugin_publish_workflow.py +++ b/tests/test_strategy_plugin_publish_workflow.py @@ -28,11 +28,11 @@ def test_strategy_plugin_publish_workflow_publishes_shadow_artifact() -> None: assert 'notification_target = "${PLUGIN_NOTIFICATION_TARGET}"' in workflow assert "--notification-targets" in workflow assert ( - "gs://qsl-runtime-logs-interactivebrokersquant/strategy-artifacts/us_equity/" + "gs://qsl-runtime-logs-shared/strategy-artifacts/us_equity/" "tqqq_growth_income/plugins/market_regime_control" ) in workflow assert ( - "gs://qsl-runtime-logs-interactivebrokersquant/strategy-artifacts/us_equity/" + "gs://qsl-runtime-logs-shared/strategy-artifacts/us_equity/" "market_regime_notification/plugins/market_regime_control" ) in workflow assert "soxl_soxx_trend_income/plugins/market_regime_control" not in workflow @@ -62,7 +62,7 @@ def test_strategy_plugin_publish_workflow_keeps_legacy_artifact_jobs() -> None: assert "PLUGIN_NAME: crisis_response_shadow" in workflow assert "PLUGIN_NAME: taco_rebound_shadow" in workflow assert ( - "gs://qsl-runtime-logs-interactivebrokersquant/strategy-artifacts/us_equity/" + "gs://qsl-runtime-logs-shared/strategy-artifacts/us_equity/" "tqqq_growth_income/plugins/crisis_response_shadow" ) in workflow assert "INPUT_SOXL_GCS_PREFIX" not in workflow