aether-quant 0.0.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- aether_quant-0.0.1/.devcontainer/README.md +12 -0
- aether_quant-0.0.1/.devcontainer/devcontainer.json +14 -0
- aether_quant-0.0.1/.devcontainer/dind-v1-test/devcontainer.json +14 -0
- aether_quant-0.0.1/.dockerignore +51 -0
- aether_quant-0.0.1/.env.compose.example +12 -0
- aether_quant-0.0.1/.env.live.example +33 -0
- aether_quant-0.0.1/.gitattributes +2 -0
- aether_quant-0.0.1/.githooks/README.md +14 -0
- aether_quant-0.0.1/.githooks/pre-commit +29 -0
- aether_quant-0.0.1/.github/ISSUE_TEMPLATE/bug_report.md +50 -0
- aether_quant-0.0.1/.github/ISSUE_TEMPLATE/config.yml +8 -0
- aether_quant-0.0.1/.github/ISSUE_TEMPLATE/feature_request.md +32 -0
- aether_quant-0.0.1/.github/PULL_REQUEST_TEMPLATE.md +37 -0
- aether_quant-0.0.1/.github/workflows/ci.yml +158 -0
- aether_quant-0.0.1/.github/workflows/release.yml +130 -0
- aether_quant-0.0.1/.gitignore +192 -0
- aether_quant-0.0.1/AGENTS.md +144 -0
- aether_quant-0.0.1/CODE_OF_CONDUCT.md +56 -0
- aether_quant-0.0.1/CONTRIBUTING.md +167 -0
- aether_quant-0.0.1/Dockerfile +53 -0
- aether_quant-0.0.1/Dockerfile.lean +14 -0
- aether_quant-0.0.1/LICENSE +133 -0
- aether_quant-0.0.1/PKG-INFO +7 -0
- aether_quant-0.0.1/README.md +1231 -0
- aether_quant-0.0.1/REPRODUCIBILITY.md +65 -0
- aether_quant-0.0.1/RUNBOOK.md +122 -0
- aether_quant-0.0.1/SECURITY.md +64 -0
- aether_quant-0.0.1/aether_quant.egg-info/PKG-INFO +7 -0
- aether_quant-0.0.1/aether_quant.egg-info/SOURCES.txt +546 -0
- aether_quant-0.0.1/aether_quant.egg-info/dependency_links.txt +1 -0
- aether_quant-0.0.1/aether_quant.egg-info/entry_points.txt +2 -0
- aether_quant-0.0.1/aether_quant.egg-info/scm_file_list.json +543 -0
- aether_quant-0.0.1/aether_quant.egg-info/scm_version.json +8 -0
- aether_quant-0.0.1/aether_quant.egg-info/top_level.txt +13 -0
- aether_quant-0.0.1/analyzer/README.md +69 -0
- aether_quant-0.0.1/analyzer/__init__.py +17 -0
- aether_quant-0.0.1/analyzer/market_analyzer.py +521 -0
- aether_quant-0.0.1/aq_cli.py +3633 -0
- aether_quant-0.0.1/audit/README.md +47 -0
- aether_quant-0.0.1/audit/__init__.py +38 -0
- aether_quant-0.0.1/audit/hash_chain.py +52 -0
- aether_quant-0.0.1/audit/postgres_audit.py +61 -0
- aether_quant-0.0.1/audit/postgres_worker.py +402 -0
- aether_quant-0.0.1/audit/redis_queue.py +124 -0
- aether_quant-0.0.1/audit/status_export.py +62 -0
- aether_quant-0.0.1/backtests/.gitkeep +1 -0
- aether_quant-0.0.1/config.json +2333 -0
- aether_quant-0.0.1/cpp_inference_ext/README.md +60 -0
- aether_quant-0.0.1/cpp_inference_ext/pyproject.toml +3 -0
- aether_quant-0.0.1/cpp_inference_ext/setup.py +31 -0
- aether_quant-0.0.1/cpp_inference_ext/src/linear_batched.cpp +62 -0
- aether_quant-0.0.1/data/alternative/estimize/consensus/aapl/.keep +0 -0
- aether_quant-0.0.1/data/alternative/estimize/estimate/.keep +0 -0
- aether_quant-0.0.1/data/alternative/estimize/release/.keep +0 -0
- aether_quant-0.0.1/data/alternative/sec/aapl/.keep +0 -0
- aether_quant-0.0.1/data/alternative/trading-economics/.keep +0 -0
- aether_quant-0.0.1/data/alternative/trading-economics/calendar/.keep +0 -0
- aether_quant-0.0.1/data/alternative/trading-economics/earnings/.keep +0 -0
- aether_quant-0.0.1/data/alternative/trading-economics/indicator/.keep +0 -0
- aether_quant-0.0.1/data/reference/forex_pair_specs.json +108 -0
- aether_quant-0.0.1/data/reference/futures_contract_specs.json +45 -0
- aether_quant-0.0.1/data/reference/sector_mapping.json +106 -0
- aether_quant-0.0.1/data_pipeline/README.md +257 -0
- aether_quant-0.0.1/data_pipeline/__init__.py +6 -0
- aether_quant-0.0.1/data_pipeline/bar_synthesis.py +97 -0
- aether_quant-0.0.1/data_pipeline/dividend_backfill.py +243 -0
- aether_quant-0.0.1/data_pipeline/factor_file_backfill.py +276 -0
- aether_quant-0.0.1/data_pipeline/fetch.py +206 -0
- aether_quant-0.0.1/data_pipeline/fred_backfill.py +435 -0
- aether_quant-0.0.1/data_pipeline/ib_backfill.py +287 -0
- aether_quant-0.0.1/data_pipeline/v2_manifest.py +75 -0
- aether_quant-0.0.1/data_pipeline/yfinance_backfill.py +501 -0
- aether_quant-0.0.1/development/Changelog.md +1888 -0
- aether_quant-0.0.1/development/Problems.md +1646 -0
- aether_quant-0.0.1/development/README.md +36 -0
- aether_quant-0.0.1/development/architecture.md +2090 -0
- aether_quant-0.0.1/development/asset_universe.md +189 -0
- aether_quant-0.0.1/development/backtest_equity_chart.png +0 -0
- aether_quant-0.0.1/development/backups/Changelog.md.bak_pre_condense +5567 -0
- aether_quant-0.0.1/development/backups/Changelog.md.bak_pre_condense_v54 +1395 -0
- aether_quant-0.0.1/development/backups/Problems.md.bak_pre_condense +4983 -0
- aether_quant-0.0.1/development/backups/Problems.md.bak_pre_condense_v54 +1524 -0
- aether_quant-0.0.1/development/backups/README.md +22 -0
- aether_quant-0.0.1/development/infrastructure.md +775 -0
- aether_quant-0.0.1/development/logo.png +0 -0
- aether_quant-0.0.1/development/monte_carlo_equity_curves.png +0 -0
- aether_quant-0.0.1/development/project_structure.md +70 -0
- aether_quant-0.0.1/docker-compose.yml +292 -0
- aether_quant-0.0.1/evaluation/README.md +152 -0
- aether_quant-0.0.1/evaluation/__init__.py +73 -0
- aether_quant-0.0.1/evaluation/ablation.py +310 -0
- aether_quant-0.0.1/evaluation/benchmark_comparison.py +195 -0
- aether_quant-0.0.1/evaluation/confidence_threshold_calibration.py +157 -0
- aether_quant-0.0.1/evaluation/factor_neutralization_check.py +94 -0
- aether_quant-0.0.1/evaluation/feature_parity.py +321 -0
- aether_quant-0.0.1/evaluation/feature_reconciliation.py +286 -0
- aether_quant-0.0.1/evaluation/impact_model.py +77 -0
- aether_quant-0.0.1/evaluation/kill_switch_replay.py +186 -0
- aether_quant-0.0.1/evaluation/limit_fill_simulator.py +152 -0
- aether_quant-0.0.1/evaluation/model_predictions.py +192 -0
- aether_quant-0.0.1/evaluation/monte_carlo.py +161 -0
- aether_quant-0.0.1/evaluation/public_benchmarks.py +117 -0
- aether_quant-0.0.1/evaluation/rank_book_simulator.py +494 -0
- aether_quant-0.0.1/evaluation/rank_ic_core.py +204 -0
- aether_quant-0.0.1/evaluation/rank_signal_calibration.py +690 -0
- aether_quant-0.0.1/evaluation/rolling_ic_gate_calibration.py +190 -0
- aether_quant-0.0.1/evaluation/rolling_ic_gate_replay.py +138 -0
- aether_quant-0.0.1/execution/README.md +281 -0
- aether_quant-0.0.1/execution/__init__.py +80 -0
- aether_quant-0.0.1/execution/config_cache.py +48 -0
- aether_quant-0.0.1/execution/cost_model.py +213 -0
- aether_quant-0.0.1/execution/lean_config_render.py +131 -0
- aether_quant-0.0.1/execution/live_credentials.py +38 -0
- aether_quant-0.0.1/execution/live_credentials_io.py +52 -0
- aether_quant-0.0.1/execution/order_gate.py +388 -0
- aether_quant-0.0.1/execution/paper_readiness.py +181 -0
- aether_quant-0.0.1/execution/paper_readiness_io.py +54 -0
- aether_quant-0.0.1/execution/paper_readiness_report.py +103 -0
- aether_quant-0.0.1/execution/paper_readiness_scheduler.py +137 -0
- aether_quant-0.0.1/execution/reconciliation.py +160 -0
- aether_quant-0.0.1/execution/runtime_config_io.py +38 -0
- aether_quant-0.0.1/execution/secret_scan.py +73 -0
- aether_quant-0.0.1/experience/README.md +68 -0
- aether_quant-0.0.1/experience/__init__.py +22 -0
- aether_quant-0.0.1/experience/observation_metrics.py +124 -0
- aether_quant-0.0.1/experience/postgres_worker.py +392 -0
- aether_quant-0.0.1/experience/redis_queue.py +374 -0
- aether_quant-0.0.1/experience/simulated_portfolio.py +191 -0
- aether_quant-0.0.1/experts/README.md +37 -0
- aether_quant-0.0.1/experts/__init__.py +17 -0
- aether_quant-0.0.1/experts/expert_datasets.py +184 -0
- aether_quant-0.0.1/features/README.md +77 -0
- aether_quant-0.0.1/features/__init__.py +137 -0
- aether_quant-0.0.1/features/alt_data_features.py +154 -0
- aether_quant-0.0.1/features/bond_features.py +275 -0
- aether_quant-0.0.1/features/cross_asset_sensitivity.py +79 -0
- aether_quant-0.0.1/features/derivatives_macro_features.py +72 -0
- aether_quant-0.0.1/features/macro_features.py +79 -0
- aether_quant-0.0.1/features/options_greeks.py +329 -0
- aether_quant-0.0.1/features/sector_map.py +53 -0
- aether_quant-0.0.1/features/technical_indicators.py +185 -0
- aether_quant-0.0.1/generate_backtest_report.py +311 -0
- aether_quant-0.0.1/generate_evaluation_report.py +712 -0
- aether_quant-0.0.1/inference/README.md +105 -0
- aether_quant-0.0.1/inference/__init__.py +36 -0
- aether_quant-0.0.1/inference/exported_model.py +929 -0
- aether_quant-0.0.1/inference/parallel_inference.py +160 -0
- aether_quant-0.0.1/inference/strategy_selector_inference.py +75 -0
- aether_quant-0.0.1/json_safety.py +130 -0
- aether_quant-0.0.1/lean.json +649 -0
- aether_quant-0.0.1/liquidity/README.md +97 -0
- aether_quant-0.0.1/liquidity/__init__.py +15 -0
- aether_quant-0.0.1/liquidity/market_liquidity.py +335 -0
- aether_quant-0.0.1/main.py +7779 -0
- aether_quant-0.0.1/ml/README.md +84 -0
- aether_quant-0.0.1/ml/_backup_pre_v537/expert_models/bearish/metrics.json +314 -0
- aether_quant-0.0.1/ml/_backup_pre_v537/expert_models/bearish/model.pt +0 -0
- aether_quant-0.0.1/ml/_backup_pre_v537/expert_models/bearish/model_weights.json +1900 -0
- aether_quant-0.0.1/ml/_backup_pre_v537/expert_models/bearish/multitask_model.json +1954 -0
- aether_quant-0.0.1/ml/_backup_pre_v537/expert_models/bearish/multitask_training_metrics.json +202 -0
- aether_quant-0.0.1/ml/_backup_pre_v537/expert_models/bullish/metrics.json +308 -0
- aether_quant-0.0.1/ml/_backup_pre_v537/expert_models/bullish/model.pt +0 -0
- aether_quant-0.0.1/ml/_backup_pre_v537/expert_models/bullish/model_weights.json +1902 -0
- aether_quant-0.0.1/ml/_backup_pre_v537/expert_models/bullish/multitask_model.json +1954 -0
- aether_quant-0.0.1/ml/_backup_pre_v537/expert_models/bullish/multitask_training_metrics.json +227 -0
- aether_quant-0.0.1/ml/_backup_pre_v537/expert_models/sideways/metrics.json +325 -0
- aether_quant-0.0.1/ml/_backup_pre_v537/expert_models/sideways/model.pt +0 -0
- aether_quant-0.0.1/ml/_backup_pre_v537/expert_models/sideways/model_weights.json +1901 -0
- aether_quant-0.0.1/ml/_backup_pre_v537/expert_models/sideways/multitask_model.json +1954 -0
- aether_quant-0.0.1/ml/_backup_pre_v537/expert_models/sideways/multitask_training_metrics.json +192 -0
- aether_quant-0.0.1/ml/_backup_pre_v537/expert_models/volatility/metrics.json +295 -0
- aether_quant-0.0.1/ml/_backup_pre_v537/expert_models/volatility/model.pt +0 -0
- aether_quant-0.0.1/ml/_backup_pre_v537/expert_models/volatility/model_weights.json +1901 -0
- aether_quant-0.0.1/ml/_backup_pre_v537/expert_models/volatility/multitask_model.json +1954 -0
- aether_quant-0.0.1/ml/_backup_pre_v537/expert_models/volatility/multitask_training_metrics.json +232 -0
- aether_quant-0.0.1/ml/_backup_pre_v537/feature_schema.json +2378 -0
- aether_quant-0.0.1/ml/_backup_pre_v537/gating_feature_schema.json +30 -0
- aether_quant-0.0.1/ml/_backup_pre_v537/gating_model.json +570 -0
- aether_quant-0.0.1/ml/_backup_pre_v537/gating_training_metrics.json +262 -0
- aether_quant-0.0.1/ml/_backup_pre_v537/model.pt +0 -0
- aether_quant-0.0.1/ml/_backup_pre_v537/model_weights.json +11017 -0
- aether_quant-0.0.1/ml/_backup_pre_v537/multitask_feature_schema.json +70 -0
- aether_quant-0.0.1/ml/_backup_pre_v537/multitask_model.json +7448 -0
- aether_quant-0.0.1/ml/_backup_pre_v537/multitask_training_metrics.json +11852 -0
- aether_quant-0.0.1/ml/_backup_pre_v537/scaler.pkl +0 -0
- aether_quant-0.0.1/ml/_backup_pre_v537/scaler_stats.json +156 -0
- aether_quant-0.0.1/ml/_backup_pre_v537/sequence_feature_schema.json +71 -0
- aether_quant-0.0.1/ml/_backup_pre_v537/sequence_model.json +16695 -0
- aether_quant-0.0.1/ml/_backup_pre_v537/sequence_training_metrics.json +11872 -0
- aether_quant-0.0.1/ml/_backup_pre_v537/training_metrics.json +633 -0
- aether_quant-0.0.1/moe/README.md +147 -0
- aether_quant-0.0.1/moe/__init__.py +19 -0
- aether_quant-0.0.1/moe/gating.py +414 -0
- aether_quant-0.0.1/monitoring/README.md +23 -0
- aether_quant-0.0.1/monitoring/__init__.py +2 -0
- aether_quant-0.0.1/monitoring/api_server.py +187 -0
- aether_quant-0.0.1/monitoring/assets_status.py +90 -0
- aether_quant-0.0.1/monitoring/evaluation_state.py +127 -0
- aether_quant-0.0.1/monitoring/neural_network_state.py +490 -0
- aether_quant-0.0.1/monitoring/strategy_catalog.py +39 -0
- aether_quant-0.0.1/notifications/README.md +52 -0
- aether_quant-0.0.1/notifications/__init__.py +13 -0
- aether_quant-0.0.1/notifications/postgres_telegram.py +99 -0
- aether_quant-0.0.1/notifications/telegram_alerts.py +82 -0
- aether_quant-0.0.1/notifications/telegram_client.py +79 -0
- aether_quant-0.0.1/notifications/telegram_worker.py +215 -0
- aether_quant-0.0.1/performance/README.md +79 -0
- aether_quant-0.0.1/performance/__init__.py +45 -0
- aether_quant-0.0.1/performance/postgres_triggers.py +345 -0
- aether_quant-0.0.1/performance/rank_ic_monitor.py +56 -0
- aether_quant-0.0.1/performance/trigger_worker.py +189 -0
- aether_quant-0.0.1/performance/triggers.py +956 -0
- aether_quant-0.0.1/portfolio/README.md +447 -0
- aether_quant-0.0.1/portfolio/__init__.py +41 -0
- aether_quant-0.0.1/portfolio/book_construction.py +786 -0
- aether_quant-0.0.1/portfolio/book_neutrality.py +178 -0
- aether_quant-0.0.1/portfolio/hrp_allocation.py +159 -0
- aether_quant-0.0.1/portfolio/options_arbitrage_detector.py +232 -0
- aether_quant-0.0.1/portfolio/options_assignment_risk.py +119 -0
- aether_quant-0.0.1/portfolio/options_margin_sizing.py +333 -0
- aether_quant-0.0.1/portfolio/options_strategy.py +1999 -0
- aether_quant-0.0.1/portfolio/rank_signal.py +219 -0
- aether_quant-0.0.1/portfolio/rolling_ic_gate.py +183 -0
- aether_quant-0.0.1/pyproject.toml +123 -0
- aether_quant-0.0.1/regime/README.md +53 -0
- aether_quant-0.0.1/regime/__init__.py +17 -0
- aether_quant-0.0.1/regime/market_regime.py +187 -0
- aether_quant-0.0.1/requirements/README.md +28 -0
- aether_quant-0.0.1/requirements/lean-runtime.txt +12 -0
- aether_quant-0.0.1/requirements/requirements-dev.txt +63 -0
- aether_quant-0.0.1/requirements/requirements.txt +44 -0
- aether_quant-0.0.1/retraining/README.md +145 -0
- aether_quant-0.0.1/retraining/__init__.py +107 -0
- aether_quant-0.0.1/retraining/artifacts.py +284 -0
- aether_quant-0.0.1/retraining/auto_rollback.py +109 -0
- aether_quant-0.0.1/retraining/backtest_gate.py +77 -0
- aether_quant-0.0.1/retraining/lean_backtest.py +64 -0
- aether_quant-0.0.1/retraining/orchestrator.py +898 -0
- aether_quant-0.0.1/retraining/planning.py +246 -0
- aether_quant-0.0.1/retraining/postgres_registry.py +385 -0
- aether_quant-0.0.1/retraining/rollback_hardening.py +42 -0
- aether_quant-0.0.1/retraining/status_export.py +179 -0
- aether_quant-0.0.1/retraining/validation_gate.py +339 -0
- aether_quant-0.0.1/retraining/vault_client.py +108 -0
- aether_quant-0.0.1/retraining/vault_commands.py +52 -0
- aether_quant-0.0.1/retraining/worker.py +356 -0
- aether_quant-0.0.1/risk/README.md +275 -0
- aether_quant-0.0.1/risk/__init__.py +38 -0
- aether_quant-0.0.1/risk/asset_class_router.py +584 -0
- aether_quant-0.0.1/risk/forex_risk.py +158 -0
- aether_quant-0.0.1/risk/futures_risk.py +202 -0
- aether_quant-0.0.1/risk/kill_switch.py +261 -0
- aether_quant-0.0.1/risk/manual_override.py +118 -0
- aether_quant-0.0.1/risk/position_sizing.py +303 -0
- aether_quant-0.0.1/risk/rl_sizing.py +189 -0
- aether_quant-0.0.1/risk_controls.py +386 -0
- aether_quant-0.0.1/scripts/README.md +66 -0
- aether_quant-0.0.1/scripts/feature_parity_audit.py +390 -0
- aether_quant-0.0.1/scripts/gate_sweep.py +234 -0
- aether_quant-0.0.1/scripts/gate_sweep_score_stage.py +73 -0
- aether_quant-0.0.1/scripts/order_events_audit.py +205 -0
- aether_quant-0.0.1/scripts/overlap_vs_sharpe_analysis.py +82 -0
- aether_quant-0.0.1/scripts/profile_inference.py +585 -0
- aether_quant-0.0.1/scripts/profile_subsystems.py +616 -0
- aether_quant-0.0.1/scripts/promotion_gate_null_calibration.py +153 -0
- aether_quant-0.0.1/scripts/promotion_gate_null_gate_scheme.py +133 -0
- aether_quant-0.0.1/scripts/render_lean_credentials.py +47 -0
- aether_quant-0.0.1/scripts/run_lean_cli_windows.py +49 -0
- aether_quant-0.0.1/setup.cfg +4 -0
- aether_quant-0.0.1/tests/README.md +45 -0
- aether_quant-0.0.1/tests/test_ablation.py +287 -0
- aether_quant-0.0.1/tests/test_alt_data_features.py +139 -0
- aether_quant-0.0.1/tests/test_api_server.py +180 -0
- aether_quant-0.0.1/tests/test_aq_cli.py +3666 -0
- aether_quant-0.0.1/tests/test_aq_test_ruff_flag.py +67 -0
- aether_quant-0.0.1/tests/test_asset_class_router.py +512 -0
- aether_quant-0.0.1/tests/test_assets_status.py +112 -0
- aether_quant-0.0.1/tests/test_audit_postgres_worker.py +274 -0
- aether_quant-0.0.1/tests/test_audit_queue.py +85 -0
- aether_quant-0.0.1/tests/test_audit_status_export.py +66 -0
- aether_quant-0.0.1/tests/test_auto_rollback.py +186 -0
- aether_quant-0.0.1/tests/test_backtest_gate.py +65 -0
- aether_quant-0.0.1/tests/test_bar_synthesis_parity.py +58 -0
- aether_quant-0.0.1/tests/test_bond_features.py +220 -0
- aether_quant-0.0.1/tests/test_book_neutrality.py +215 -0
- aether_quant-0.0.1/tests/test_ci_workflows.py +138 -0
- aether_quant-0.0.1/tests/test_cli_help_surface.py +142 -0
- aether_quant-0.0.1/tests/test_confidence_threshold_calibration.py +119 -0
- aether_quant-0.0.1/tests/test_config_cache.py +87 -0
- aether_quant-0.0.1/tests/test_cost_model.py +246 -0
- aether_quant-0.0.1/tests/test_cross_asset_sensitivity.py +106 -0
- aether_quant-0.0.1/tests/test_derivatives_macro_features.py +100 -0
- aether_quant-0.0.1/tests/test_dividend_backfill.py +184 -0
- aether_quant-0.0.1/tests/test_dockerignore_secrets.py +104 -0
- aether_quant-0.0.1/tests/test_evaluation_state.py +175 -0
- aether_quant-0.0.1/tests/test_experience_queue.py +416 -0
- aether_quant-0.0.1/tests/test_expert_datasets.py +86 -0
- aether_quant-0.0.1/tests/test_expert_models.py +186 -0
- aether_quant-0.0.1/tests/test_exported_model.py +1073 -0
- aether_quant-0.0.1/tests/test_factor_file_backfill.py +224 -0
- aether_quant-0.0.1/tests/test_feature_parity.py +125 -0
- aether_quant-0.0.1/tests/test_feature_reconciliation.py +233 -0
- aether_quant-0.0.1/tests/test_fetch.py +462 -0
- aether_quant-0.0.1/tests/test_forex_risk.py +124 -0
- aether_quant-0.0.1/tests/test_fred_backfill.py +350 -0
- aether_quant-0.0.1/tests/test_futures_risk.py +211 -0
- aether_quant-0.0.1/tests/test_gating_network.py +542 -0
- aether_quant-0.0.1/tests/test_generate_backtest_report.py +259 -0
- aether_quant-0.0.1/tests/test_generate_evaluation_report.py +561 -0
- aether_quant-0.0.1/tests/test_hash_chain.py +85 -0
- aether_quant-0.0.1/tests/test_hrp_book_sizing.py +243 -0
- aether_quant-0.0.1/tests/test_ib_backfill.py +335 -0
- aether_quant-0.0.1/tests/test_impact_model.py +67 -0
- aether_quant-0.0.1/tests/test_json_safety.py +95 -0
- aether_quant-0.0.1/tests/test_kill_switch.py +406 -0
- aether_quant-0.0.1/tests/test_kill_switch_replay.py +215 -0
- aether_quant-0.0.1/tests/test_lean_backtest.py +67 -0
- aether_quant-0.0.1/tests/test_lean_backtest_ml_coverage.py +300 -0
- aether_quant-0.0.1/tests/test_lean_config_render.py +109 -0
- aether_quant-0.0.1/tests/test_lean_runtime_imports.py +89 -0
- aether_quant-0.0.1/tests/test_learned_topology.py +486 -0
- aether_quant-0.0.1/tests/test_limit_fill_simulator.py +155 -0
- aether_quant-0.0.1/tests/test_live_credentials.py +63 -0
- aether_quant-0.0.1/tests/test_live_credentials_io.py +67 -0
- aether_quant-0.0.1/tests/test_macro_features.py +49 -0
- aether_quant-0.0.1/tests/test_manual_override.py +171 -0
- aether_quant-0.0.1/tests/test_market_analyzer.py +695 -0
- aether_quant-0.0.1/tests/test_market_liquidity.py +221 -0
- aether_quant-0.0.1/tests/test_market_regime.py +109 -0
- aether_quant-0.0.1/tests/test_market_topology.py +902 -0
- aether_quant-0.0.1/tests/test_model_predictions.py +252 -0
- aether_quant-0.0.1/tests/test_monte_carlo.py +120 -0
- aether_quant-0.0.1/tests/test_neural_network_state.py +433 -0
- aether_quant-0.0.1/tests/test_observation_metrics.py +181 -0
- aether_quant-0.0.1/tests/test_options_arbitrage_detector.py +170 -0
- aether_quant-0.0.1/tests/test_options_assignment_risk.py +195 -0
- aether_quant-0.0.1/tests/test_options_greeks.py +225 -0
- aether_quant-0.0.1/tests/test_options_margin_sizing.py +178 -0
- aether_quant-0.0.1/tests/test_options_strategy.py +524 -0
- aether_quant-0.0.1/tests/test_options_strategy_multileg.py +572 -0
- aether_quant-0.0.1/tests/test_order_events_audit.py +135 -0
- aether_quant-0.0.1/tests/test_order_gate.py +563 -0
- aether_quant-0.0.1/tests/test_paper_readiness.py +266 -0
- aether_quant-0.0.1/tests/test_paper_readiness_io.py +83 -0
- aether_quant-0.0.1/tests/test_paper_readiness_report.py +88 -0
- aether_quant-0.0.1/tests/test_paper_readiness_scheduler.py +104 -0
- aether_quant-0.0.1/tests/test_parallel_inference.py +280 -0
- aether_quant-0.0.1/tests/test_portfolio_book_construction.py +1105 -0
- aether_quant-0.0.1/tests/test_position_sizing.py +341 -0
- aether_quant-0.0.1/tests/test_postgres_audit.py +83 -0
- aether_quant-0.0.1/tests/test_postgres_telegram.py +101 -0
- aether_quant-0.0.1/tests/test_postgres_triggers.py +244 -0
- aether_quant-0.0.1/tests/test_postgres_worker.py +333 -0
- aether_quant-0.0.1/tests/test_profile_inference.py +161 -0
- aether_quant-0.0.1/tests/test_profile_subsystems.py +134 -0
- aether_quant-0.0.1/tests/test_promotion_gate_era_rule.py +94 -0
- aether_quant-0.0.1/tests/test_public_benchmarks.py +194 -0
- aether_quant-0.0.1/tests/test_rank_book_simulator.py +375 -0
- aether_quant-0.0.1/tests/test_rank_ic_core.py +156 -0
- aether_quant-0.0.1/tests/test_rank_ic_monitor.py +137 -0
- aether_quant-0.0.1/tests/test_rank_signal.py +242 -0
- aether_quant-0.0.1/tests/test_rank_signal_calibration.py +664 -0
- aether_quant-0.0.1/tests/test_reconciliation.py +223 -0
- aether_quant-0.0.1/tests/test_retraining_artifacts.py +465 -0
- aether_quant-0.0.1/tests/test_retraining_orchestrator.py +703 -0
- aether_quant-0.0.1/tests/test_retraining_planning.py +257 -0
- aether_quant-0.0.1/tests/test_retraining_postgres_registry.py +216 -0
- aether_quant-0.0.1/tests/test_retraining_worker.py +392 -0
- aether_quant-0.0.1/tests/test_risk_controls.py +632 -0
- aether_quant-0.0.1/tests/test_rl_sizing.py +193 -0
- aether_quant-0.0.1/tests/test_rl_sizing_v541.py +83 -0
- aether_quant-0.0.1/tests/test_rollback_hardening.py +53 -0
- aether_quant-0.0.1/tests/test_rolling_ic_gate.py +165 -0
- aether_quant-0.0.1/tests/test_rolling_ic_gate_calibration.py +138 -0
- aether_quant-0.0.1/tests/test_rolling_ic_gate_replay.py +153 -0
- aether_quant-0.0.1/tests/test_runtime_config_io.py +54 -0
- aether_quant-0.0.1/tests/test_secret_scan.py +63 -0
- aether_quant-0.0.1/tests/test_sector_map.py +66 -0
- aether_quant-0.0.1/tests/test_simulated_portfolio.py +237 -0
- aether_quant-0.0.1/tests/test_status_export.py +138 -0
- aether_quant-0.0.1/tests/test_strategy_catalog.py +37 -0
- aether_quant-0.0.1/tests/test_strategy_selector_inference.py +83 -0
- aether_quant-0.0.1/tests/test_technical_indicators.py +261 -0
- aether_quant-0.0.1/tests/test_telegram_alerts.py +77 -0
- aether_quant-0.0.1/tests/test_telegram_client.py +66 -0
- aether_quant-0.0.1/tests/test_telegram_worker.py +199 -0
- aether_quant-0.0.1/tests/test_train_alt_data_features.py +206 -0
- aether_quant-0.0.1/tests/test_train_asset_class_context_features.py +87 -0
- aether_quant-0.0.1/tests/test_train_bond_features.py +244 -0
- aether_quant-0.0.1/tests/test_train_cross_asset_sensitivity.py +136 -0
- aether_quant-0.0.1/tests/test_train_cross_sectional_batching.py +162 -0
- aether_quant-0.0.1/tests/test_train_cross_sectional_features.py +701 -0
- aether_quant-0.0.1/tests/test_train_derivatives_macro_features.py +220 -0
- aether_quant-0.0.1/tests/test_train_gate_friendliness.py +141 -0
- aether_quant-0.0.1/tests/test_train_gating.py +179 -0
- aether_quant-0.0.1/tests/test_train_indicators.py +229 -0
- aether_quant-0.0.1/tests/test_train_macro_features.py +157 -0
- aether_quant-0.0.1/tests/test_train_multitask.py +567 -0
- aether_quant-0.0.1/tests/test_train_multitask_architecture.py +189 -0
- aether_quant-0.0.1/tests/test_train_optimizer_and_swa.py +171 -0
- aether_quant-0.0.1/tests/test_train_pipeline.py +1017 -0
- aether_quant-0.0.1/tests/test_train_ranking_loss.py +418 -0
- aether_quant-0.0.1/tests/test_train_ranking_validation.py +907 -0
- aether_quant-0.0.1/tests/test_train_residual_rank_targets.py +266 -0
- aether_quant-0.0.1/tests/test_train_rl_sizing.py +244 -0
- aether_quant-0.0.1/tests/test_train_select_model_context_columns.py +33 -0
- aether_quant-0.0.1/tests/test_train_sequence.py +207 -0
- aether_quant-0.0.1/tests/test_train_sequence_architecture.py +310 -0
- aether_quant-0.0.1/tests/test_train_strategy_selector.py +145 -0
- aether_quant-0.0.1/tests/test_train_threshold_and_early_stop.py +94 -0
- aether_quant-0.0.1/tests/test_train_topology.py +171 -0
- aether_quant-0.0.1/tests/test_train_walk_forward_windows.py +176 -0
- aether_quant-0.0.1/tests/test_trigger_worker.py +219 -0
- aether_quant-0.0.1/tests/test_triggers.py +646 -0
- aether_quant-0.0.1/tests/test_v2_pipeline_manifest.py +41 -0
- aether_quant-0.0.1/tests/test_v543_new_features.py +169 -0
- aether_quant-0.0.1/tests/test_v547_bug_hunt.py +497 -0
- aether_quant-0.0.1/tests/test_validation_gate.py +323 -0
- aether_quant-0.0.1/tests/test_vault_client.py +109 -0
- aether_quant-0.0.1/tests/test_vault_commands.py +65 -0
- aether_quant-0.0.1/tests/test_walk_forward_multimodel.py +225 -0
- aether_quant-0.0.1/tests/test_yfinance_backfill.py +416 -0
- aether_quant-0.0.1/topology/README.md +122 -0
- aether_quant-0.0.1/topology/__init__.py +23 -0
- aether_quant-0.0.1/topology/learned_topology.py +301 -0
- aether_quant-0.0.1/topology/market_topology.py +710 -0
- aether_quant-0.0.1/train.py +7390 -0
- aether_quant-0.0.1/train_gating.py +453 -0
- aether_quant-0.0.1/train_multitask.py +853 -0
- aether_quant-0.0.1/train_rl_sizing.py +461 -0
- aether_quant-0.0.1/train_sequence.py +836 -0
- aether_quant-0.0.1/train_strategy_selector.py +274 -0
- aether_quant-0.0.1/train_topology.py +341 -0
- aether_quant-0.0.1/visualization/README.md +68 -0
- aether_quant-0.0.1/visualization/forex_order_sizing.jsonl +991 -0
- aether_quant-0.0.1/webui/.gitignore +24 -0
- aether_quant-0.0.1/webui/.oxlintrc.json +8 -0
- aether_quant-0.0.1/webui/README.md +173 -0
- aether_quant-0.0.1/webui/index.html +13 -0
- aether_quant-0.0.1/webui/overview_v2_12.png +0 -0
- aether_quant-0.0.1/webui/package-lock.json +4014 -0
- aether_quant-0.0.1/webui/package.json +41 -0
- aether_quant-0.0.1/webui/public/favicon.svg +1 -0
- aether_quant-0.0.1/webui/public/icons.svg +24 -0
- aether_quant-0.0.1/webui/risk_v2_12.png +0 -0
- aether_quant-0.0.1/webui/src/App.tsx +58 -0
- aether_quant-0.0.1/webui/src/api/client.ts +33 -0
- aether_quant-0.0.1/webui/src/api/hooks.ts +123 -0
- aether_quant-0.0.1/webui/src/components/evaluation/AblationPanel.test.tsx +82 -0
- aether_quant-0.0.1/webui/src/components/evaluation/AblationPanel.tsx +103 -0
- aether_quant-0.0.1/webui/src/components/evaluation/BenchmarkPanel.test.tsx +71 -0
- aether_quant-0.0.1/webui/src/components/evaluation/BenchmarkPanel.tsx +99 -0
- aether_quant-0.0.1/webui/src/components/evaluation/BookHistoryReconciliationPanel.test.tsx +79 -0
- aether_quant-0.0.1/webui/src/components/evaluation/BookHistoryReconciliationPanel.tsx +129 -0
- aether_quant-0.0.1/webui/src/components/evaluation/BookSpreadCalibrationPanel.test.tsx +39 -0
- aether_quant-0.0.1/webui/src/components/evaluation/BookSpreadCalibrationPanel.tsx +66 -0
- aether_quant-0.0.1/webui/src/components/evaluation/CapacityStressPanel.tsx +99 -0
- aether_quant-0.0.1/webui/src/components/evaluation/MonteCarloPanel.test.tsx +81 -0
- aether_quant-0.0.1/webui/src/components/evaluation/MonteCarloPanel.tsx +100 -0
- aether_quant-0.0.1/webui/src/components/evaluation/RankBookPerformancePanel.test.tsx +60 -0
- aether_quant-0.0.1/webui/src/components/evaluation/RankBookPerformancePanel.tsx +66 -0
- aether_quant-0.0.1/webui/src/components/evaluation/WalkForwardStabilityPanel.test.tsx +93 -0
- aether_quant-0.0.1/webui/src/components/evaluation/WalkForwardStabilityPanel.tsx +132 -0
- aether_quant-0.0.1/webui/src/components/heatmap/AssetHeatmap.tsx +43 -0
- aether_quant-0.0.1/webui/src/components/layout/AppShell.tsx +77 -0
- aether_quant-0.0.1/webui/src/components/layout/Panel.tsx +13 -0
- aether_quant-0.0.1/webui/src/components/monitoring/AssetsStatusPanel.tsx +69 -0
- aether_quant-0.0.1/webui/src/components/monitoring/AuditLogPanel.tsx +49 -0
- aether_quant-0.0.1/webui/src/components/monitoring/CountTable.tsx +21 -0
- aether_quant-0.0.1/webui/src/components/monitoring/KillSwitchPanel.test.tsx +54 -0
- aether_quant-0.0.1/webui/src/components/monitoring/KillSwitchPanel.tsx +77 -0
- aether_quant-0.0.1/webui/src/components/monitoring/MonitoringFeeds.tsx +35 -0
- aether_quant-0.0.1/webui/src/components/monitoring/ObservationPanel.tsx +50 -0
- aether_quant-0.0.1/webui/src/components/monitoring/PaperReadinessPanel.tsx +58 -0
- aether_quant-0.0.1/webui/src/components/monitoring/PerformanceTriggersPanel.tsx +63 -0
- aether_quant-0.0.1/webui/src/components/monitoring/RawStateViewer.tsx +28 -0
- aether_quant-0.0.1/webui/src/components/monitoring/ReconciliationPanel.test.tsx +55 -0
- aether_quant-0.0.1/webui/src/components/monitoring/ReconciliationPanel.tsx +75 -0
- aether_quant-0.0.1/webui/src/components/monitoring/RetrainingStatusPanel.test.tsx +76 -0
- aether_quant-0.0.1/webui/src/components/monitoring/RetrainingStatusPanel.tsx +106 -0
- aether_quant-0.0.1/webui/src/components/neuralnet/NeuralNetworkScene3D.tsx +229 -0
- aether_quant-0.0.1/webui/src/components/neuralnet/NeuralNetworkStatsPanel.test.tsx +128 -0
- aether_quant-0.0.1/webui/src/components/neuralnet/NeuralNetworkStatsPanel.tsx +253 -0
- aether_quant-0.0.1/webui/src/components/neuralnet/TrainingRecipePanel.test.tsx +63 -0
- aether_quant-0.0.1/webui/src/components/neuralnet/TrainingRecipePanel.tsx +68 -0
- aether_quant-0.0.1/webui/src/components/optionsstrategy/CorporateActionsPanel.tsx +42 -0
- aether_quant-0.0.1/webui/src/components/optionsstrategy/DividendScheduleSummaryPanel.tsx +43 -0
- aether_quant-0.0.1/webui/src/components/optionsstrategy/ForexPairDetailPanel.tsx +51 -0
- aether_quant-0.0.1/webui/src/components/optionsstrategy/HeldMultiLegPositionsPanel.tsx +71 -0
- aether_quant-0.0.1/webui/src/components/optionsstrategy/StrategyCatalogBrowser.tsx +48 -0
- aether_quant-0.0.1/webui/src/components/optionsstrategy/StrategySelectorScoresPanel.tsx +48 -0
- aether_quant-0.0.1/webui/src/components/portfolio/BookNeutralityPanel.test.tsx +28 -0
- aether_quant-0.0.1/webui/src/components/portfolio/BookNeutralityPanel.tsx +57 -0
- aether_quant-0.0.1/webui/src/components/risk/AssetSizingTable.test.tsx +52 -0
- aether_quant-0.0.1/webui/src/components/risk/AssetSizingTable.tsx +211 -0
- aether_quant-0.0.1/webui/src/components/risk/DerivativesMacroPanel.tsx +107 -0
- aether_quant-0.0.1/webui/src/components/risk/LiquidityTable.tsx +122 -0
- aether_quant-0.0.1/webui/src/components/risk/MacroSnapshotPanel.test.tsx +46 -0
- aether_quant-0.0.1/webui/src/components/risk/MacroSnapshotPanel.tsx +57 -0
- aether_quant-0.0.1/webui/src/components/risk/NetEdgePanel.test.tsx +54 -0
- aether_quant-0.0.1/webui/src/components/risk/NetEdgePanel.tsx +74 -0
- aether_quant-0.0.1/webui/src/components/risk/RiskBar.tsx +14 -0
- aether_quant-0.0.1/webui/src/components/risk/RiskCore.tsx +65 -0
- aether_quant-0.0.1/webui/src/components/risk/SensitivityPanel.test.tsx +37 -0
- aether_quant-0.0.1/webui/src/components/risk/SensitivityPanel.tsx +75 -0
- aether_quant-0.0.1/webui/src/components/risk/StrategyRiskCards.tsx +35 -0
- aether_quant-0.0.1/webui/src/components/scene3d/Scene3D.tsx +94 -0
- aether_quant-0.0.1/webui/src/components/scorecards/Scorecards.tsx +27 -0
- aether_quant-0.0.1/webui/src/components/signals/Badge.tsx +43 -0
- aether_quant-0.0.1/webui/src/components/signals/PositionsList.tsx +36 -0
- aether_quant-0.0.1/webui/src/components/signals/RankSignalPanel.test.tsx +43 -0
- aether_quant-0.0.1/webui/src/components/signals/RankSignalPanel.tsx +50 -0
- aether_quant-0.0.1/webui/src/components/signals/SignalBoard.tsx +45 -0
- aether_quant-0.0.1/webui/src/components/topology/ClusterList.tsx +45 -0
- aether_quant-0.0.1/webui/src/components/topology/TopologyLearningPanel.tsx +93 -0
- aether_quant-0.0.1/webui/src/components/topology/TopologyScene3D.test.tsx +51 -0
- aether_quant-0.0.1/webui/src/components/topology/TopologyScene3D.tsx +139 -0
- aether_quant-0.0.1/webui/src/components/tracing/AssetPerformancePanel.tsx +56 -0
- aether_quant-0.0.1/webui/src/components/tracing/BacktestEquityPanel.tsx +93 -0
- aether_quant-0.0.1/webui/src/components/tracing/DivergingBarChart.test.tsx +41 -0
- aether_quant-0.0.1/webui/src/components/tracing/DivergingBarChart.tsx +49 -0
- aether_quant-0.0.1/webui/src/components/tracing/LineChart.test.tsx +73 -0
- aether_quant-0.0.1/webui/src/components/tracing/LineChart.tsx +195 -0
- aether_quant-0.0.1/webui/src/components/tracing/MetricsSnapshotPanel.tsx +46 -0
- aether_quant-0.0.1/webui/src/components/tracing/ObservationEquityPanel.tsx +72 -0
- aether_quant-0.0.1/webui/src/index.css +11 -0
- aether_quant-0.0.1/webui/src/lib/downsample.ts +13 -0
- aether_quant-0.0.1/webui/src/lib/format.test.ts +74 -0
- aether_quant-0.0.1/webui/src/lib/format.ts +25 -0
- aether_quant-0.0.1/webui/src/main.tsx +18 -0
- aether_quant-0.0.1/webui/src/pages/EvaluationPage.tsx +36 -0
- aether_quant-0.0.1/webui/src/pages/NeuralNetworkPage.tsx +19 -0
- aether_quant-0.0.1/webui/src/pages/OperationsPage.tsx +37 -0
- aether_quant-0.0.1/webui/src/pages/OptionsStrategyPage.tsx +27 -0
- aether_quant-0.0.1/webui/src/pages/Overview.tsx +28 -0
- aether_quant-0.0.1/webui/src/pages/RiskPage.tsx +26 -0
- aether_quant-0.0.1/webui/src/pages/TopologyPage.tsx +20 -0
- aether_quant-0.0.1/webui/src/pages/TracingPage.tsx +30 -0
- aether_quant-0.0.1/webui/src/pages/pages.test.tsx +208 -0
- aether_quant-0.0.1/webui/src/test/setup.ts +24 -0
- aether_quant-0.0.1/webui/src/types/audit.ts +20 -0
- aether_quant-0.0.1/webui/src/types/evaluation.ts +284 -0
- aether_quant-0.0.1/webui/src/types/state.ts +954 -0
- aether_quant-0.0.1/webui/src/types/tracing.ts +26 -0
- aether_quant-0.0.1/webui/tsconfig.app.json +25 -0
- aether_quant-0.0.1/webui/tsconfig.json +7 -0
- aether_quant-0.0.1/webui/tsconfig.node.json +23 -0
- aether_quant-0.0.1/webui/vite.config.ts +25 -0
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
# .devcontainer
|
|
2
|
+
|
|
3
|
+
GitHub Codespaces / VS Code Dev Container definition for Aether Quant
|
|
4
|
+
(`devcontainer.json`), plus a `dind-v1-test/` variant used to test
|
|
5
|
+
Docker-in-Docker setups.
|
|
6
|
+
|
|
7
|
+
The container is the `mcr.microsoft.com/devcontainers/python:3.11` image with
|
|
8
|
+
an sshd feature (Codespaces training access) and a post-create command that
|
|
9
|
+
installs the CPU PyTorch build plus both requirements files. This is the
|
|
10
|
+
environment behind this project's own "train in the cloud" convention — see
|
|
11
|
+
[`RUNBOOK.md`](../RUNBOOK.md) and
|
|
12
|
+
[`development/infrastructure.md`](../development/infrastructure.md).
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "Aether Quant",
|
|
3
|
+
"image": "mcr.microsoft.com/devcontainers/python:3.11",
|
|
4
|
+
"features": {
|
|
5
|
+
"ghcr.io/devcontainers/features/sshd:1": {
|
|
6
|
+
"version": "latest"
|
|
7
|
+
}
|
|
8
|
+
},
|
|
9
|
+
"hostRequirements": {
|
|
10
|
+
"cpus": 2,
|
|
11
|
+
"memory": "8gb"
|
|
12
|
+
},
|
|
13
|
+
"postCreateCommand": "pip install torch --index-url https://download.pytorch.org/whl/cpu && pip install -r requirements/requirements.txt && pip install -r requirements/requirements-dev.txt"
|
|
14
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "Aether Quant DinD v1 Test",
|
|
3
|
+
"image": "mcr.microsoft.com/devcontainers/python:3.11",
|
|
4
|
+
"features": {
|
|
5
|
+
"ghcr.io/devcontainers/features/sshd:1": {
|
|
6
|
+
"version": "latest"
|
|
7
|
+
},
|
|
8
|
+
"ghcr.io/devcontainers/features/docker-in-docker:1": {}
|
|
9
|
+
},
|
|
10
|
+
"hostRequirements": {
|
|
11
|
+
"cpus": 2,
|
|
12
|
+
"memory": "8gb"
|
|
13
|
+
}
|
|
14
|
+
}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
__pycache__/
|
|
2
|
+
*.pyc
|
|
3
|
+
*.pyo
|
|
4
|
+
.venv/
|
|
5
|
+
node_modules/
|
|
6
|
+
webui/node_modules/
|
|
7
|
+
webui/dist/
|
|
8
|
+
backtests/
|
|
9
|
+
.lean/
|
|
10
|
+
.git/
|
|
11
|
+
.claude/
|
|
12
|
+
Aether-quant-Obsidian-Vault/
|
|
13
|
+
# Large data directories not needed by the FastAPI server
|
|
14
|
+
data/
|
|
15
|
+
ml/
|
|
16
|
+
storage/
|
|
17
|
+
|
|
18
|
+
# Local secrets and broker/API credentials - mirrors .gitignore's own list.
|
|
19
|
+
# Being .gitignore'd does NOT keep a file out of the image: the engine build
|
|
20
|
+
# does `COPY . .`, and that same image is published to ghcr (single fat
|
|
21
|
+
# target, no slim variant), so anything not excluded here is baked into a
|
|
22
|
+
# public registry layer - recoverable via `docker history`/`docker save` even
|
|
23
|
+
# if a later commit removes it. lean.live.json is the rendered, secret-bearing
|
|
24
|
+
# config `aq render-lean-config` produces (execution/lean_config_render.py);
|
|
25
|
+
# lean.json itself is git-tracked with empty placeholders but is excluded too,
|
|
26
|
+
# so a locally-populated copy can never leak. Keep this list in sync with
|
|
27
|
+
# .gitignore's "Local secrets" block.
|
|
28
|
+
.env
|
|
29
|
+
.env.*
|
|
30
|
+
!.env.compose.example
|
|
31
|
+
!.env.live.example
|
|
32
|
+
ib_config.py
|
|
33
|
+
*_config.local.py
|
|
34
|
+
config.local.json
|
|
35
|
+
lean.local.json
|
|
36
|
+
lean.live.json
|
|
37
|
+
lean.json
|
|
38
|
+
*.key
|
|
39
|
+
*.pem
|
|
40
|
+
|
|
41
|
+
# cpp_inference_ext/'s compiled build artifacts - mirrors .gitignore's own
|
|
42
|
+
# exclusion list. Docker now builds this extension fresh for the
|
|
43
|
+
# container's own Python 3.11 (see Dockerfile) - a locally-pre-built
|
|
44
|
+
# stray .pyd/.so from a developer's own (ABI-incompatible) host Python
|
|
45
|
+
# must never leak into the build context and get baked into the image,
|
|
46
|
+
# which is published to a public ghcr registry.
|
|
47
|
+
cpp_inference_ext/build/
|
|
48
|
+
cpp_inference_ext/*.egg-info/
|
|
49
|
+
cpp_inference_ext/*.pyd
|
|
50
|
+
cpp_inference_ext/*.so
|
|
51
|
+
cpp_inference_ext/install_log*.txt
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
# Copy this file to .env (untracked, .gitignore'd) and fill in real values.
|
|
2
|
+
# docker-compose.yml reads .env automatically for ${VAR} substitutions.
|
|
3
|
+
|
|
4
|
+
# PostgreSQL (defaults already work for local dev — override for anything else)
|
|
5
|
+
POSTGRES_DB=aether_quant
|
|
6
|
+
POSTGRES_USER=aether
|
|
7
|
+
POSTGRES_PASSWORD=aether_dev_password
|
|
8
|
+
|
|
9
|
+
# Telegram alerts (V2-19) — required for notifications.telegram_worker to
|
|
10
|
+
# actually send messages; leave blank to run the worker as a safe no-op.
|
|
11
|
+
AETHER_TELEGRAM_BOT_TOKEN=
|
|
12
|
+
AETHER_TELEGRAM_CHAT_ID=
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# Copy this file to .env.live (untracked, .gitignore'd) and fill in real
|
|
2
|
+
# values before switching phase_v2.runtime.mode to "live" (V2-22). Never
|
|
3
|
+
# commit .env.live.
|
|
4
|
+
#
|
|
5
|
+
# Two consumers read these AETHER_* vars:
|
|
6
|
+
# 1. execution/live_credentials_io.py - a pre-flight credential-presence check.
|
|
7
|
+
# 2. scripts/render_lean_credentials.py (`aq render-lean-config`) - renders a
|
|
8
|
+
# gitignored lean.live.json with these values overlaid onto the empty,
|
|
9
|
+
# tracked lean.json template, which live/paper deployment then uses via
|
|
10
|
+
# `--lean-config lean.live.json`. Lean does NOT expand env vars out of
|
|
11
|
+
# lean.json itself, which is why this render step exists (the tracked
|
|
12
|
+
# lean.json stays all-empty so it is safe to share; see
|
|
13
|
+
# development/infrastructure.md's "Live Deployment Betreiben (V2-22)"
|
|
14
|
+
# runbook and execution/lean_config_render.py).
|
|
15
|
+
|
|
16
|
+
# --- Interactive Brokers live credentials ---
|
|
17
|
+
AETHER_IB_ACCOUNT=
|
|
18
|
+
AETHER_IB_USER_NAME=
|
|
19
|
+
AETHER_IB_PASSWORD=
|
|
20
|
+
AETHER_IB_TRADING_MODE=paper
|
|
21
|
+
|
|
22
|
+
# --- Live market-data provider keys (only the one you actually use) ---
|
|
23
|
+
# Populate whichever feed lean.json's live-paper/live environment is configured
|
|
24
|
+
# for; leave the rest blank. These render into lean.json's matching fields.
|
|
25
|
+
AETHER_POLYGON_API_KEY=
|
|
26
|
+
AETHER_IEX_CLOUD_API_KEY=
|
|
27
|
+
|
|
28
|
+
# --- Database password for live deployments ---
|
|
29
|
+
# The default 'aether_dev_password' is fine for local dev but is published in
|
|
30
|
+
# the repo. Live mode refuses to start while the Postgres DSN still uses that
|
|
31
|
+
# default (execution/live_credentials.py::postgres_dsn_is_live_safe). Set a real
|
|
32
|
+
# one here (and in .env / .env.compose) before going live.
|
|
33
|
+
POSTGRES_PASSWORD=
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
# .githooks
|
|
2
|
+
|
|
3
|
+
Optional git hooks, opt-in per clone (never auto-installed on a fresh
|
|
4
|
+
checkout):
|
|
5
|
+
|
|
6
|
+
```powershell
|
|
7
|
+
git config core.hooksPath .githooks
|
|
8
|
+
```
|
|
9
|
+
|
|
10
|
+
Currently one hook: `pre-commit`, which invokes `aq secrets-check`
|
|
11
|
+
(`execution/secret_scan.py`) and blocks the commit if a populated secret
|
|
12
|
+
field is about to land in the tracked `lean.json` or a real `.env` file is
|
|
13
|
+
tracked by git. This is what actually stops a secret from being committed —
|
|
14
|
+
see [`SECURITY.md`](../SECURITY.md) for the reporting policy.
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
#!/bin/sh
|
|
2
|
+
# Aether Quant pre-commit secret guard (Phase V2-22 security).
|
|
3
|
+
#
|
|
4
|
+
# Blocks a commit that would publish a secret: a populated secret field in the
|
|
5
|
+
# tracked lean.json, or a tracked real `.env` file. All detection lives in
|
|
6
|
+
# `aq secrets-check` (execution/secret_scan.py) - this hook just invokes it.
|
|
7
|
+
#
|
|
8
|
+
# Enable once per clone (opt-in, so it never surprises a fresh checkout):
|
|
9
|
+
# git config core.hooksPath .githooks
|
|
10
|
+
#
|
|
11
|
+
# Runs under git's POSIX sh (git-bash on Windows), so keep it portable.
|
|
12
|
+
|
|
13
|
+
set -e
|
|
14
|
+
|
|
15
|
+
repo_root=$(git rev-parse --show-toplevel)
|
|
16
|
+
cd "$repo_root"
|
|
17
|
+
|
|
18
|
+
# Prefer the installed `aq` console script; fall back to running the module
|
|
19
|
+
# directly with whichever Python is on PATH (venv-activated shells get theirs).
|
|
20
|
+
if command -v aq >/dev/null 2>&1; then
|
|
21
|
+
aq secrets-check
|
|
22
|
+
elif command -v python >/dev/null 2>&1; then
|
|
23
|
+
python aq_cli.py secrets-check
|
|
24
|
+
elif command -v python3 >/dev/null 2>&1; then
|
|
25
|
+
python3 aq_cli.py secrets-check
|
|
26
|
+
else
|
|
27
|
+
echo "pre-commit: could not find 'aq' or 'python' to run secrets-check" >&2
|
|
28
|
+
exit 1
|
|
29
|
+
fi
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: Bug report
|
|
3
|
+
about: Something is broken, wrong, or behaves differently than documented.
|
|
4
|
+
title: "[bug] "
|
|
5
|
+
labels: ["bug"]
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## What happened
|
|
9
|
+
|
|
10
|
+
<!-- One or two sentences. Lead with the observable failure. -->
|
|
11
|
+
|
|
12
|
+
## Where
|
|
13
|
+
|
|
14
|
+
<!-- File(s)/module(s)/CLI command(s) involved, e.g. `aq evaluate --rank-book`, portfolio/book_construction.py -->
|
|
15
|
+
|
|
16
|
+
## Expected vs actual
|
|
17
|
+
|
|
18
|
+
- **Expected:**
|
|
19
|
+
- **Actual:**
|
|
20
|
+
|
|
21
|
+
## Reproduction
|
|
22
|
+
|
|
23
|
+
<!--
|
|
24
|
+
Minimal steps from a clean clone. Include the exact command(s) and any
|
|
25
|
+
config.json keys involved (`aq config get <dotted.key>` output helps).
|
|
26
|
+
-->
|
|
27
|
+
|
|
28
|
+
```text
|
|
29
|
+
<commands / steps>
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
## Evidence
|
|
33
|
+
|
|
34
|
+
<!-- Test output, log excerpt, or backtest artifact reference. Paste the
|
|
35
|
+
smallest relevant slice; link large files instead of pasting them. -->
|
|
36
|
+
|
|
37
|
+
```text
|
|
38
|
+
<output>
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
## Environment
|
|
42
|
+
|
|
43
|
+
- OS:
|
|
44
|
+
- Python version:
|
|
45
|
+
- Commit / tag:
|
|
46
|
+
|
|
47
|
+
## Checklist
|
|
48
|
+
|
|
49
|
+
- [ ] I ran `aq test` and can name the failing/passing state
|
|
50
|
+
- [ ] I checked `development/Problems.md` for a known entry covering this
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
blank_issues_enabled: false
|
|
2
|
+
contact_links:
|
|
3
|
+
- name: Question / usage help
|
|
4
|
+
url: https://github.com/leon1706-lol/Aether-quant/discussions
|
|
5
|
+
about: Ask here before opening an issue — most setup questions are answered in README.md, development/infrastructure.md, or CONTRIBUTING.md.
|
|
6
|
+
- name: Security vulnerability
|
|
7
|
+
url: https://github.com/leon1706-lol/Aether-quant/security/advisories/new
|
|
8
|
+
about: Report privately via GitHub Security Advisories — do NOT open a public issue (see SECURITY.md).
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: Feature request
|
|
3
|
+
about: A new subsystem, module, CLI capability, or behavioral improvement.
|
|
4
|
+
title: "[feature] "
|
|
5
|
+
labels: ["enhancement"]
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## Problem to solve
|
|
9
|
+
|
|
10
|
+
<!-- What can't you do today? Describe the user-facing need, not the implementation. -->
|
|
11
|
+
|
|
12
|
+
## Proposed behavior
|
|
13
|
+
|
|
14
|
+
<!-- What should exist after this ships? Include the intended CLI/config surface if any:
|
|
15
|
+
new `aq` command/flag? new `phase_v2.*` config block (remember: flags ship `false`
|
|
16
|
+
until verified)? new output artifact? -->
|
|
17
|
+
|
|
18
|
+
## Scope guardrails
|
|
19
|
+
|
|
20
|
+
<!-- This repo's conventions shape every feature. Confirm how yours fits: -->
|
|
21
|
+
|
|
22
|
+
- [ ] Ships backward-compatible: additive `None`-default parameters / default-off config keys; an unmodified `config.json` reproduces today's behavior exactly.
|
|
23
|
+
- [ ] Testable without Lean: pure logic lives in a package module, not `main.py`; tests planned/attached.
|
|
24
|
+
- [ ] Docs plan: README/sub-readmes + `development/Changelog.md` entry (and `development/architecture.md` when it changes system structure).
|
|
25
|
+
|
|
26
|
+
## Alternatives considered
|
|
27
|
+
|
|
28
|
+
<!-- What did you rule out and why? -->
|
|
29
|
+
|
|
30
|
+
## Extra context
|
|
31
|
+
|
|
32
|
+
<!-- Related Problems.md entries (#N), prior Changelog rounds, or backtest evidence. -->
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
<!-- Title style: `V<version> <short what-and-why>` for release-bound PRs,
|
|
2
|
+
matching the repo's commit history; otherwise a plain descriptive title. -->
|
|
3
|
+
|
|
4
|
+
## What & why
|
|
5
|
+
|
|
6
|
+
<!-- One paragraph: what changed and the problem/round it belongs to.
|
|
7
|
+
Reference development/Problems.md entries (#N) where applicable. -->
|
|
8
|
+
|
|
9
|
+
## Changes
|
|
10
|
+
|
|
11
|
+
-
|
|
12
|
+
-
|
|
13
|
+
|
|
14
|
+
## Behavior contract
|
|
15
|
+
|
|
16
|
+
<!-- This repo's hard rule: prove what changed and for whom. -->
|
|
17
|
+
|
|
18
|
+
- [ ] Default behavior is byte-identical when new flags/params are absent (`None`-default / default-off convention), **or** the behavior change is intentional and listed below:
|
|
19
|
+
- <!-- intentional changes here -->
|
|
20
|
+
- New config keys: <!-- `phase_v2.*` keys + defaults, or "none" -->
|
|
21
|
+
|
|
22
|
+
## Verification
|
|
23
|
+
|
|
24
|
+
<!-- How was this confirmed? The suite must be green before review. -->
|
|
25
|
+
|
|
26
|
+
- [ ] `aq test` green (N passed): <!-- paste count -->
|
|
27
|
+
- New tests: <!-- files + what they pin down -->
|
|
28
|
+
- Manual checks: <!-- CLI dry-runs, real-data spot checks -->
|
|
29
|
+
- Real Lean backtest: <!-- not run in PRs by convention; note if one is required before merge -->
|
|
30
|
+
|
|
31
|
+
## Docs updated
|
|
32
|
+
|
|
33
|
+
- [ ] README / sub-package README
|
|
34
|
+
- [ ] `development/Changelog.md` (append-only entry)
|
|
35
|
+
- [ ] `development/Problems.md` (if a bug was found/fixed)
|
|
36
|
+
- [ ] `development/architecture.md` / `development/infrastructure.md` (if structure/services changed)
|
|
37
|
+
- [ ] Obsidian vault regenerated (`generate_code_graph.py` → `regenerate_vault.py --append-handoff`)
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
name: CI
|
|
2
|
+
|
|
3
|
+
# V5.3.9 - deep CI suite: windows+ubuntu pytest matrix with a calibrated
|
|
4
|
+
# coverage fail-under gate (82% measured - 2), ruff lint, the full webui
|
|
5
|
+
# vitest suite, an offline CLI smoke battery, and workflow self-validation.
|
|
6
|
+
on:
|
|
7
|
+
push:
|
|
8
|
+
branches: [main]
|
|
9
|
+
pull_request:
|
|
10
|
+
|
|
11
|
+
# V5.4.2 - cancel superseded runs on rapid-fire pushes (ported from Aether-Vault)
|
|
12
|
+
concurrency:
|
|
13
|
+
group: ci-${{ github.ref }}
|
|
14
|
+
cancel-in-progress: true
|
|
15
|
+
|
|
16
|
+
jobs:
|
|
17
|
+
python-tests:
|
|
18
|
+
runs-on: ${{ matrix.os }}
|
|
19
|
+
timeout-minutes: 30
|
|
20
|
+
strategy:
|
|
21
|
+
fail-fast: false
|
|
22
|
+
matrix:
|
|
23
|
+
os: [ubuntu-latest, windows-latest]
|
|
24
|
+
steps:
|
|
25
|
+
- uses: actions/checkout@v4
|
|
26
|
+
|
|
27
|
+
- uses: actions/setup-python@v5
|
|
28
|
+
with:
|
|
29
|
+
python-version: "3.11"
|
|
30
|
+
cache: "pip"
|
|
31
|
+
|
|
32
|
+
- name: Syntax-check main.py (no Lean runtime available in CI - see development/Problems.md #69)
|
|
33
|
+
run: python -m py_compile main.py
|
|
34
|
+
|
|
35
|
+
- name: Install dependencies
|
|
36
|
+
run: |
|
|
37
|
+
pip install -r requirements/requirements.txt -r requirements/requirements-dev.txt
|
|
38
|
+
pip install pytest-cov
|
|
39
|
+
|
|
40
|
+
- name: Run full test suite with coverage gate
|
|
41
|
+
run: >
|
|
42
|
+
pytest -m "not lean_backtest" -ra
|
|
43
|
+
--cov --cov-report=term-missing --cov-report=xml
|
|
44
|
+
--cov-fail-under=80
|
|
45
|
+
|
|
46
|
+
- name: Upload coverage artifact
|
|
47
|
+
if: matrix.os == 'ubuntu-latest'
|
|
48
|
+
uses: actions/upload-artifact@v4
|
|
49
|
+
with:
|
|
50
|
+
name: coverage-xml
|
|
51
|
+
path: coverage.xml
|
|
52
|
+
|
|
53
|
+
python-lint:
|
|
54
|
+
runs-on: ubuntu-latest
|
|
55
|
+
steps:
|
|
56
|
+
- uses: actions/checkout@v4
|
|
57
|
+
|
|
58
|
+
- uses: actions/setup-python@v5
|
|
59
|
+
with:
|
|
60
|
+
python-version: "3.11"
|
|
61
|
+
|
|
62
|
+
# V5.3.11 FIX: bare `ruff check .` — NOT `aq test --ruff` (which
|
|
63
|
+
# requires importing aq_cli → pandas via the full package chain, but
|
|
64
|
+
# this job intentionally has a minimal environment). Local devs use
|
|
65
|
+
# `aq test --ruff`; CI uses bare ruff for speed.
|
|
66
|
+
# V5.4.7: ruff is PINNED - the previous unbounded range let new ruff
|
|
67
|
+
# releases add rules and break CI independently of any repo change.
|
|
68
|
+
- name: Install ruff
|
|
69
|
+
run: pip install "ruff==0.16.4"
|
|
70
|
+
|
|
71
|
+
- name: Ruff check (E/F ruleset calibrated in pyproject.toml)
|
|
72
|
+
run: ruff check .
|
|
73
|
+
|
|
74
|
+
- name: Syntax-check main.py
|
|
75
|
+
run: python -m py_compile main.py
|
|
76
|
+
|
|
77
|
+
dependency-audit:
|
|
78
|
+
runs-on: ubuntu-latest
|
|
79
|
+
timeout-minutes: 15
|
|
80
|
+
steps:
|
|
81
|
+
- uses: actions/checkout@v4
|
|
82
|
+
|
|
83
|
+
- uses: actions/setup-python@v5
|
|
84
|
+
with:
|
|
85
|
+
python-version: "3.11"
|
|
86
|
+
|
|
87
|
+
- name: Install pip-audit
|
|
88
|
+
run: pip install pip-audit
|
|
89
|
+
|
|
90
|
+
- name: Audit runtime dependencies for known CVEs
|
|
91
|
+
run: |
|
|
92
|
+
pip install -r requirements/requirements.txt
|
|
93
|
+
pip-audit --requirement requirements/requirements.txt --desc
|
|
94
|
+
|
|
95
|
+
- name: Audit dev dependencies for known CVEs
|
|
96
|
+
run: |
|
|
97
|
+
pip-audit --requirement requirements/requirements-dev.txt --desc
|
|
98
|
+
|
|
99
|
+
webui-tests:
|
|
100
|
+
runs-on: ubuntu-latest
|
|
101
|
+
timeout-minutes: 20
|
|
102
|
+
defaults:
|
|
103
|
+
run:
|
|
104
|
+
working-directory: webui
|
|
105
|
+
steps:
|
|
106
|
+
- uses: actions/checkout@v4
|
|
107
|
+
|
|
108
|
+
- uses: actions/setup-node@v4
|
|
109
|
+
with:
|
|
110
|
+
node-version: "20"
|
|
111
|
+
cache: "npm"
|
|
112
|
+
cache-dependency-path: webui/package-lock.json
|
|
113
|
+
|
|
114
|
+
- run: npm ci
|
|
115
|
+
- run: npx tsc -b
|
|
116
|
+
- run: npx oxlint
|
|
117
|
+
# V5.3.9 - the full frontend suite finally runs in CI too.
|
|
118
|
+
- run: npx vitest run --pool=threads
|
|
119
|
+
- run: npm run build
|
|
120
|
+
|
|
121
|
+
cli-smoke:
|
|
122
|
+
runs-on: ubuntu-latest
|
|
123
|
+
timeout-minutes: 15
|
|
124
|
+
steps:
|
|
125
|
+
- uses: actions/checkout@v4
|
|
126
|
+
|
|
127
|
+
- uses: actions/setup-python@v5
|
|
128
|
+
with:
|
|
129
|
+
python-version: "3.11"
|
|
130
|
+
|
|
131
|
+
- name: Install package editable
|
|
132
|
+
run: |
|
|
133
|
+
pip install -r requirements/requirements.txt
|
|
134
|
+
pip install -e .
|
|
135
|
+
|
|
136
|
+
- name: CLI smoke battery (offline, deterministic)
|
|
137
|
+
run: |
|
|
138
|
+
aq --help > /dev/null
|
|
139
|
+
aq evaluate --help > /dev/null
|
|
140
|
+
aq config get phase1.universe.name
|
|
141
|
+
aq secrets-check
|
|
142
|
+
|
|
143
|
+
workflows-lint:
|
|
144
|
+
runs-on: ubuntu-latest
|
|
145
|
+
timeout-minutes: 10
|
|
146
|
+
steps:
|
|
147
|
+
- uses: actions/checkout@v4
|
|
148
|
+
|
|
149
|
+
# V5.3.10 - single-step pinned install + validate: the previous two-step
|
|
150
|
+
# pattern (PATH append, then bare `actionlint`) failed with
|
|
151
|
+
# "command not found" on the runner. Pinned to v1.7.7 for
|
|
152
|
+
# reproducibility (meta-tested in tests/test_ci_workflows.py).
|
|
153
|
+
- name: Validate workflow files (actionlint v1.7.7)
|
|
154
|
+
run: |
|
|
155
|
+
curl -sSL -o actionlint.tar.gz \
|
|
156
|
+
https://github.com/rhysd/actionlint/releases/download/v1.7.7/actionlint_1.7.7_linux_amd64.tar.gz
|
|
157
|
+
tar -xzf actionlint.tar.gz actionlint
|
|
158
|
+
./actionlint -no-color -verbose
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
name: Release
|
|
2
|
+
|
|
3
|
+
# Releasing is a manual, deliberate act: tag a commit on main and push the
|
|
4
|
+
# tag. Nothing else triggers this workflow - matches this project's existing
|
|
5
|
+
# bias toward no uncontrolled automatic actions (see e.g. retraining's
|
|
6
|
+
# manual promote/rollback).
|
|
7
|
+
on:
|
|
8
|
+
push:
|
|
9
|
+
tags: ["v*.*.*"]
|
|
10
|
+
|
|
11
|
+
jobs:
|
|
12
|
+
# V5.3.9 - NON-BLOCKING visibility job: runs the full offline suite on the
|
|
13
|
+
# tagged commit so release-time gaps are visible right next to the
|
|
14
|
+
# artifacts. Deliberately NOT wired into `needs:` of the publish jobs
|
|
15
|
+
# (user decision): releases proceed regardless; read this job's result to
|
|
16
|
+
# see where the gaps are.
|
|
17
|
+
tag-tests:
|
|
18
|
+
runs-on: ubuntu-latest
|
|
19
|
+
steps:
|
|
20
|
+
- uses: actions/checkout@v4
|
|
21
|
+
|
|
22
|
+
- uses: actions/setup-python@v5
|
|
23
|
+
with:
|
|
24
|
+
python-version: "3.11"
|
|
25
|
+
cache: "pip"
|
|
26
|
+
|
|
27
|
+
- name: Install dependencies
|
|
28
|
+
run: |
|
|
29
|
+
pip install -r requirements/requirements.txt -r requirements/requirements-dev.txt
|
|
30
|
+
|
|
31
|
+
- name: Run full offline suite (visibility only - does not gate the release)
|
|
32
|
+
run: pytest -m "not lean_backtest" -ra
|
|
33
|
+
|
|
34
|
+
publish-pypi:
|
|
35
|
+
runs-on: ubuntu-latest
|
|
36
|
+
environment: pypi # must match the Environment name configured in PyPI's Trusted Publisher setup
|
|
37
|
+
permissions:
|
|
38
|
+
# Required for PyPI Trusted Publishing (OIDC) - no PyPI token is ever
|
|
39
|
+
# stored as a secret. Requires a one-time Trusted Publisher setup on
|
|
40
|
+
# the PyPI project page (repo + this workflow filename).
|
|
41
|
+
id-token: write
|
|
42
|
+
steps:
|
|
43
|
+
- uses: actions/checkout@v4
|
|
44
|
+
with:
|
|
45
|
+
fetch-depth: 0 # full history/tags - required for setuptools-scm
|
|
46
|
+
|
|
47
|
+
- uses: actions/setup-python@v5
|
|
48
|
+
with:
|
|
49
|
+
python-version: "3.11"
|
|
50
|
+
|
|
51
|
+
- name: Build sdist and wheel
|
|
52
|
+
run: |
|
|
53
|
+
pip install build
|
|
54
|
+
python -m build
|
|
55
|
+
|
|
56
|
+
- name: Publish to PyPI
|
|
57
|
+
uses: pypa/gh-action-pypi-publish@release/v1
|
|
58
|
+
|
|
59
|
+
publish-docker:
|
|
60
|
+
runs-on: ubuntu-latest
|
|
61
|
+
permissions:
|
|
62
|
+
contents: read
|
|
63
|
+
packages: write
|
|
64
|
+
env:
|
|
65
|
+
# Hardcoded lowercase, not derived from ${{ github.repository }}:
|
|
66
|
+
# the repo is leon1706-lol/Aether-quant (capital A), but Docker image
|
|
67
|
+
# references must be all-lowercase - using github.repository directly
|
|
68
|
+
# would fail with "invalid reference format".
|
|
69
|
+
IMAGE_NAME: ghcr.io/leon1706-lol/aether-quant
|
|
70
|
+
steps:
|
|
71
|
+
- uses: actions/checkout@v4
|
|
72
|
+
|
|
73
|
+
- uses: docker/setup-buildx-action@v3
|
|
74
|
+
|
|
75
|
+
- uses: docker/login-action@v3
|
|
76
|
+
with:
|
|
77
|
+
registry: ghcr.io
|
|
78
|
+
username: ${{ github.actor }}
|
|
79
|
+
password: ${{ secrets.GITHUB_TOKEN }}
|
|
80
|
+
|
|
81
|
+
- id: meta
|
|
82
|
+
uses: docker/metadata-action@v5
|
|
83
|
+
with:
|
|
84
|
+
images: ${{ env.IMAGE_NAME }}
|
|
85
|
+
tags: |
|
|
86
|
+
type=semver,pattern={{version}}
|
|
87
|
+
type=raw,value=latest
|
|
88
|
+
|
|
89
|
+
- uses: docker/build-push-action@v6
|
|
90
|
+
with:
|
|
91
|
+
context: .
|
|
92
|
+
push: true
|
|
93
|
+
tags: ${{ steps.meta.outputs.tags }}
|
|
94
|
+
labels: ${{ steps.meta.outputs.labels }}
|
|
95
|
+
# GitHub Actions cache backend - without this, every release
|
|
96
|
+
# build started cold (no layer reuse across releases) even
|
|
97
|
+
# though the Dockerfile itself is already correctly ordered
|
|
98
|
+
# (deps installed before source COPY, see development/Problems.md).
|
|
99
|
+
# mode=max caches every intermediate layer, not just the final
|
|
100
|
+
# image, so the npm ci/pip install layers survive between runs.
|
|
101
|
+
cache-from: type=gha
|
|
102
|
+
cache-to: type=gha,mode=max
|
|
103
|
+
|
|
104
|
+
# Creates the GitHub Release itself, once per tag. Notes are auto-generated
|
|
105
|
+
# (commit list since the previous tag); the body additionally points at the
|
|
106
|
+
# matching development/Changelog.md entry, which is this repo's canonical
|
|
107
|
+
# per-version record (see CONTRIBUTING.md's versioning section).
|
|
108
|
+
github-release:
|
|
109
|
+
runs-on: ubuntu-latest
|
|
110
|
+
permissions:
|
|
111
|
+
contents: write
|
|
112
|
+
steps:
|
|
113
|
+
- uses: actions/checkout@v4
|
|
114
|
+
|
|
115
|
+
- name: Create GitHub Release with changelog link
|
|
116
|
+
env:
|
|
117
|
+
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
118
|
+
run: |
|
|
119
|
+
TAG="${GITHUB_REF_NAME}"
|
|
120
|
+
VERSION="${TAG#v}"
|
|
121
|
+
BODY=$(cat <<EOF
|
|
122
|
+
See [development/Changelog.md](https://github.com/${GITHUB_REPOSITORY}/blob/main/development/Changelog.md) for the full entry for \`V${VERSION}\` and every prior release. This repo keeps its changelog as an append-only historical record; each tagged version corresponds to a \`## V<version>\` section there.
|
|
123
|
+
|
|
124
|
+
---
|
|
125
|
+
EOF
|
|
126
|
+
)
|
|
127
|
+
gh release create "$TAG" \
|
|
128
|
+
--title "Aether Quant ${TAG}" \
|
|
129
|
+
--notes "$BODY" \
|
|
130
|
+
--generate-notes
|