aether-quant 4.12.3__tar.gz → 5.4.7__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.
Files changed (574) hide show
  1. aether_quant-5.4.7/.devcontainer/README.md +12 -0
  2. aether_quant-5.4.7/.githooks/README.md +14 -0
  3. aether_quant-5.4.7/.github/ISSUE_TEMPLATE/bug_report.md +50 -0
  4. aether_quant-5.4.7/.github/ISSUE_TEMPLATE/config.yml +8 -0
  5. aether_quant-5.4.7/.github/ISSUE_TEMPLATE/feature_request.md +32 -0
  6. aether_quant-5.4.7/.github/PULL_REQUEST_TEMPLATE.md +37 -0
  7. aether_quant-5.4.7/.github/workflows/ci.yml +158 -0
  8. {aether_quant-4.12.3 → aether_quant-5.4.7}/.github/workflows/release.yml +50 -0
  9. {aether_quant-4.12.3 → aether_quant-5.4.7}/.gitignore +29 -0
  10. aether_quant-5.4.7/AGENTS.md +144 -0
  11. aether_quant-5.4.7/CODE_OF_CONDUCT.md +56 -0
  12. aether_quant-5.4.7/CONTRIBUTING.md +167 -0
  13. aether_quant-5.4.7/Dockerfile.lean +14 -0
  14. {aether_quant-4.12.3 → aether_quant-5.4.7}/PKG-INFO +1 -1
  15. {aether_quant-4.12.3 → aether_quant-5.4.7}/README.md +545 -218
  16. aether_quant-5.4.7/REPRODUCIBILITY.md +65 -0
  17. aether_quant-5.4.7/RUNBOOK.md +122 -0
  18. aether_quant-5.4.7/SECURITY.md +64 -0
  19. {aether_quant-4.12.3 → aether_quant-5.4.7}/aether_quant.egg-info/PKG-INFO +1 -1
  20. {aether_quant-4.12.3 → aether_quant-5.4.7}/aether_quant.egg-info/SOURCES.txt +178 -1
  21. {aether_quant-4.12.3 → aether_quant-5.4.7}/aether_quant.egg-info/scm_file_list.json +486 -309
  22. aether_quant-5.4.7/aether_quant.egg-info/scm_version.json +8 -0
  23. aether_quant-5.4.7/aether_quant.egg-info/top_level.txt +13 -0
  24. aether_quant-5.4.7/analyzer/README.md +69 -0
  25. {aether_quant-4.12.3 → aether_quant-5.4.7}/analyzer/__init__.py +2 -0
  26. {aether_quant-4.12.3 → aether_quant-5.4.7}/analyzer/market_analyzer.py +167 -5
  27. aether_quant-5.4.7/aq_cli.py +3633 -0
  28. {aether_quant-4.12.3 → aether_quant-5.4.7}/audit/README.md +4 -1
  29. {aether_quant-4.12.3 → aether_quant-5.4.7}/audit/postgres_worker.py +73 -7
  30. {aether_quant-4.12.3 → aether_quant-5.4.7}/audit/redis_queue.py +3 -2
  31. {aether_quant-4.12.3 → aether_quant-5.4.7}/audit/status_export.py +6 -3
  32. aether_quant-5.4.7/config.json +2333 -0
  33. aether_quant-5.4.7/data/reference/sector_mapping.json +106 -0
  34. {aether_quant-4.12.3 → aether_quant-5.4.7}/data_pipeline/README.md +38 -12
  35. aether_quant-5.4.7/data_pipeline/bar_synthesis.py +97 -0
  36. aether_quant-5.4.7/data_pipeline/factor_file_backfill.py +276 -0
  37. {aether_quant-4.12.3 → aether_quant-5.4.7}/data_pipeline/fetch.py +10 -2
  38. {aether_quant-4.12.3 → aether_quant-5.4.7}/data_pipeline/fred_backfill.py +84 -16
  39. {aether_quant-4.12.3 → aether_quant-5.4.7}/data_pipeline/yfinance_backfill.py +41 -7
  40. aether_quant-5.4.7/development/Changelog.md +1888 -0
  41. aether_quant-5.4.7/development/Problems.md +1646 -0
  42. {aether_quant-4.12.3 → aether_quant-5.4.7}/development/README.md +16 -7
  43. {aether_quant-4.12.3 → aether_quant-5.4.7}/development/architecture.md +202 -37
  44. {aether_quant-4.12.3 → aether_quant-5.4.7}/development/asset_universe.md +11 -18
  45. aether_quant-5.4.7/development/backtest_equity_chart.png +0 -0
  46. aether_quant-4.12.3/development/Changelog.md → aether_quant-5.4.7/development/backups/Changelog.md.bak_pre_condense +753 -0
  47. aether_quant-5.4.7/development/backups/Changelog.md.bak_pre_condense_v54 +1395 -0
  48. aether_quant-4.12.3/development/Problems.md → aether_quant-5.4.7/development/backups/Problems.md.bak_pre_condense +536 -0
  49. aether_quant-5.4.7/development/backups/Problems.md.bak_pre_condense_v54 +1524 -0
  50. aether_quant-5.4.7/development/backups/README.md +22 -0
  51. {aether_quant-4.12.3 → aether_quant-5.4.7}/development/infrastructure.md +86 -1
  52. aether_quant-5.4.7/development/monte_carlo_equity_curves.png +0 -0
  53. {aether_quant-4.12.3 → aether_quant-5.4.7}/development/project_structure.md +17 -4
  54. aether_quant-5.4.7/evaluation/README.md +152 -0
  55. aether_quant-5.4.7/evaluation/__init__.py +73 -0
  56. aether_quant-5.4.7/evaluation/ablation.py +310 -0
  57. aether_quant-5.4.7/evaluation/benchmark_comparison.py +195 -0
  58. aether_quant-5.4.7/evaluation/confidence_threshold_calibration.py +157 -0
  59. aether_quant-5.4.7/evaluation/factor_neutralization_check.py +94 -0
  60. aether_quant-5.4.7/evaluation/feature_parity.py +321 -0
  61. aether_quant-5.4.7/evaluation/feature_reconciliation.py +286 -0
  62. aether_quant-5.4.7/evaluation/impact_model.py +77 -0
  63. aether_quant-5.4.7/evaluation/kill_switch_replay.py +186 -0
  64. aether_quant-5.4.7/evaluation/limit_fill_simulator.py +152 -0
  65. aether_quant-5.4.7/evaluation/model_predictions.py +192 -0
  66. aether_quant-5.4.7/evaluation/monte_carlo.py +161 -0
  67. aether_quant-5.4.7/evaluation/public_benchmarks.py +117 -0
  68. aether_quant-5.4.7/evaluation/rank_book_simulator.py +494 -0
  69. aether_quant-5.4.7/evaluation/rank_ic_core.py +204 -0
  70. aether_quant-5.4.7/evaluation/rank_signal_calibration.py +690 -0
  71. aether_quant-5.4.7/evaluation/rolling_ic_gate_calibration.py +190 -0
  72. aether_quant-5.4.7/evaluation/rolling_ic_gate_replay.py +138 -0
  73. aether_quant-5.4.7/execution/README.md +281 -0
  74. {aether_quant-4.12.3 → aether_quant-5.4.7}/execution/__init__.py +17 -0
  75. aether_quant-5.4.7/execution/cost_model.py +213 -0
  76. {aether_quant-4.12.3 → aether_quant-5.4.7}/execution/order_gate.py +102 -7
  77. {aether_quant-4.12.3 → aether_quant-5.4.7}/execution/paper_readiness_report.py +6 -2
  78. aether_quant-5.4.7/execution/reconciliation.py +160 -0
  79. {aether_quant-4.12.3 → aether_quant-5.4.7}/experience/README.md +6 -0
  80. {aether_quant-4.12.3 → aether_quant-5.4.7}/experience/postgres_worker.py +62 -6
  81. {aether_quant-4.12.3 → aether_quant-5.4.7}/experience/redis_queue.py +7 -2
  82. aether_quant-5.4.7/experts/README.md +37 -0
  83. {aether_quant-4.12.3 → aether_quant-5.4.7}/features/README.md +16 -0
  84. {aether_quant-4.12.3 → aether_quant-5.4.7}/features/__init__.py +18 -0
  85. {aether_quant-4.12.3 → aether_quant-5.4.7}/features/alt_data_features.py +44 -0
  86. aether_quant-5.4.7/features/cross_asset_sensitivity.py +79 -0
  87. aether_quant-5.4.7/features/sector_map.py +53 -0
  88. aether_quant-5.4.7/generate_evaluation_report.py +712 -0
  89. aether_quant-5.4.7/inference/README.md +105 -0
  90. aether_quant-5.4.7/json_safety.py +130 -0
  91. {aether_quant-4.12.3 → aether_quant-5.4.7}/lean.json +1 -1
  92. {aether_quant-4.12.3 → aether_quant-5.4.7}/liquidity/README.md +33 -36
  93. aether_quant-5.4.7/liquidity/__init__.py +15 -0
  94. {aether_quant-4.12.3 → aether_quant-5.4.7}/liquidity/market_liquidity.py +123 -8
  95. {aether_quant-4.12.3 → aether_quant-5.4.7}/main.py +1801 -193
  96. {aether_quant-4.12.3 → aether_quant-5.4.7}/ml/README.md +32 -5
  97. aether_quant-5.4.7/ml/_backup_pre_v537/expert_models/bearish/metrics.json +314 -0
  98. aether_quant-5.4.7/ml/_backup_pre_v537/expert_models/bearish/model.pt +0 -0
  99. aether_quant-5.4.7/ml/_backup_pre_v537/expert_models/bearish/model_weights.json +1900 -0
  100. aether_quant-5.4.7/ml/_backup_pre_v537/expert_models/bearish/multitask_model.json +1954 -0
  101. aether_quant-5.4.7/ml/_backup_pre_v537/expert_models/bearish/multitask_training_metrics.json +202 -0
  102. aether_quant-5.4.7/ml/_backup_pre_v537/expert_models/bullish/metrics.json +308 -0
  103. aether_quant-5.4.7/ml/_backup_pre_v537/expert_models/bullish/model.pt +0 -0
  104. aether_quant-5.4.7/ml/_backup_pre_v537/expert_models/bullish/model_weights.json +1902 -0
  105. aether_quant-5.4.7/ml/_backup_pre_v537/expert_models/bullish/multitask_model.json +1954 -0
  106. aether_quant-5.4.7/ml/_backup_pre_v537/expert_models/bullish/multitask_training_metrics.json +227 -0
  107. aether_quant-5.4.7/ml/_backup_pre_v537/expert_models/sideways/metrics.json +325 -0
  108. aether_quant-5.4.7/ml/_backup_pre_v537/expert_models/sideways/model.pt +0 -0
  109. aether_quant-5.4.7/ml/_backup_pre_v537/expert_models/sideways/model_weights.json +1901 -0
  110. aether_quant-5.4.7/ml/_backup_pre_v537/expert_models/sideways/multitask_model.json +1954 -0
  111. aether_quant-5.4.7/ml/_backup_pre_v537/expert_models/sideways/multitask_training_metrics.json +192 -0
  112. aether_quant-5.4.7/ml/_backup_pre_v537/expert_models/volatility/metrics.json +295 -0
  113. aether_quant-5.4.7/ml/_backup_pre_v537/expert_models/volatility/model.pt +0 -0
  114. aether_quant-5.4.7/ml/_backup_pre_v537/expert_models/volatility/model_weights.json +1901 -0
  115. aether_quant-5.4.7/ml/_backup_pre_v537/expert_models/volatility/multitask_model.json +1954 -0
  116. aether_quant-5.4.7/ml/_backup_pre_v537/expert_models/volatility/multitask_training_metrics.json +232 -0
  117. aether_quant-5.4.7/ml/_backup_pre_v537/feature_schema.json +2378 -0
  118. aether_quant-5.4.7/ml/_backup_pre_v537/gating_feature_schema.json +30 -0
  119. aether_quant-5.4.7/ml/_backup_pre_v537/gating_model.json +570 -0
  120. aether_quant-5.4.7/ml/_backup_pre_v537/gating_training_metrics.json +262 -0
  121. aether_quant-5.4.7/ml/_backup_pre_v537/model.pt +0 -0
  122. aether_quant-5.4.7/ml/_backup_pre_v537/model_weights.json +11017 -0
  123. aether_quant-5.4.7/ml/_backup_pre_v537/multitask_feature_schema.json +70 -0
  124. aether_quant-5.4.7/ml/_backup_pre_v537/multitask_model.json +7448 -0
  125. aether_quant-5.4.7/ml/_backup_pre_v537/multitask_training_metrics.json +11852 -0
  126. aether_quant-5.4.7/ml/_backup_pre_v537/scaler.pkl +0 -0
  127. aether_quant-5.4.7/ml/_backup_pre_v537/scaler_stats.json +156 -0
  128. aether_quant-5.4.7/ml/_backup_pre_v537/sequence_feature_schema.json +71 -0
  129. aether_quant-5.4.7/ml/_backup_pre_v537/sequence_model.json +16695 -0
  130. aether_quant-5.4.7/ml/_backup_pre_v537/sequence_training_metrics.json +11872 -0
  131. aether_quant-5.4.7/ml/_backup_pre_v537/training_metrics.json +633 -0
  132. {aether_quant-4.12.3 → aether_quant-5.4.7}/moe/README.md +16 -35
  133. {aether_quant-4.12.3 → aether_quant-5.4.7}/moe/gating.py +25 -5
  134. aether_quant-5.4.7/monitoring/README.md +23 -0
  135. {aether_quant-4.12.3 → aether_quant-5.4.7}/monitoring/api_server.py +27 -13
  136. {aether_quant-4.12.3 → aether_quant-5.4.7}/monitoring/assets_status.py +7 -2
  137. aether_quant-5.4.7/monitoring/evaluation_state.py +127 -0
  138. {aether_quant-4.12.3 → aether_quant-5.4.7}/monitoring/neural_network_state.py +55 -9
  139. {aether_quant-4.12.3 → aether_quant-5.4.7}/notifications/README.md +3 -1
  140. {aether_quant-4.12.3 → aether_quant-5.4.7}/notifications/telegram_alerts.py +26 -8
  141. {aether_quant-4.12.3 → aether_quant-5.4.7}/notifications/telegram_worker.py +13 -1
  142. {aether_quant-4.12.3 → aether_quant-5.4.7}/performance/README.md +22 -19
  143. aether_quant-5.4.7/performance/rank_ic_monitor.py +56 -0
  144. {aether_quant-4.12.3 → aether_quant-5.4.7}/portfolio/README.md +59 -0
  145. {aether_quant-4.12.3 → aether_quant-5.4.7}/portfolio/__init__.py +18 -0
  146. aether_quant-5.4.7/portfolio/book_construction.py +786 -0
  147. aether_quant-5.4.7/portfolio/book_neutrality.py +178 -0
  148. aether_quant-5.4.7/portfolio/hrp_allocation.py +159 -0
  149. aether_quant-5.4.7/portfolio/rank_signal.py +219 -0
  150. aether_quant-5.4.7/portfolio/rolling_ic_gate.py +183 -0
  151. aether_quant-5.4.7/pyproject.toml +123 -0
  152. aether_quant-5.4.7/regime/README.md +53 -0
  153. aether_quant-5.4.7/requirements/README.md +28 -0
  154. aether_quant-5.4.7/requirements/lean-runtime.txt +12 -0
  155. {aether_quant-4.12.3 → aether_quant-5.4.7}/requirements/requirements-dev.txt +6 -0
  156. {aether_quant-4.12.3 → aether_quant-5.4.7}/requirements/requirements.txt +6 -0
  157. {aether_quant-4.12.3 → aether_quant-5.4.7}/retraining/README.md +49 -11
  158. {aether_quant-4.12.3 → aether_quant-5.4.7}/retraining/artifacts.py +45 -0
  159. aether_quant-5.4.7/retraining/auto_rollback.py +109 -0
  160. {aether_quant-4.12.3 → aether_quant-5.4.7}/retraining/backtest_gate.py +16 -2
  161. {aether_quant-4.12.3 → aether_quant-5.4.7}/retraining/orchestrator.py +101 -1
  162. aether_quant-5.4.7/retraining/rollback_hardening.py +42 -0
  163. {aether_quant-4.12.3 → aether_quant-5.4.7}/retraining/status_export.py +64 -2
  164. aether_quant-5.4.7/retraining/validation_gate.py +339 -0
  165. {aether_quant-4.12.3 → aether_quant-5.4.7}/retraining/worker.py +118 -1
  166. aether_quant-5.4.7/risk/README.md +275 -0
  167. aether_quant-5.4.7/risk/kill_switch.py +261 -0
  168. {aether_quant-4.12.3 → aether_quant-5.4.7}/risk/manual_override.py +49 -0
  169. {aether_quant-4.12.3 → aether_quant-5.4.7}/risk/position_sizing.py +41 -1
  170. {aether_quant-4.12.3 → aether_quant-5.4.7}/risk/rl_sizing.py +6 -0
  171. aether_quant-5.4.7/risk_controls.py +386 -0
  172. aether_quant-5.4.7/scripts/README.md +66 -0
  173. aether_quant-5.4.7/scripts/feature_parity_audit.py +390 -0
  174. aether_quant-5.4.7/scripts/gate_sweep.py +234 -0
  175. aether_quant-5.4.7/scripts/gate_sweep_score_stage.py +73 -0
  176. aether_quant-5.4.7/scripts/order_events_audit.py +205 -0
  177. aether_quant-5.4.7/scripts/overlap_vs_sharpe_analysis.py +82 -0
  178. {aether_quant-4.12.3 → aether_quant-5.4.7}/scripts/profile_subsystems.py +1 -2
  179. aether_quant-5.4.7/scripts/promotion_gate_null_calibration.py +153 -0
  180. aether_quant-5.4.7/scripts/promotion_gate_null_gate_scheme.py +133 -0
  181. aether_quant-5.4.7/scripts/run_lean_cli_windows.py +49 -0
  182. {aether_quant-4.12.3 → aether_quant-5.4.7}/tests/README.md +3 -2
  183. aether_quant-5.4.7/tests/test_ablation.py +287 -0
  184. {aether_quant-4.12.3 → aether_quant-5.4.7}/tests/test_alt_data_features.py +42 -0
  185. {aether_quant-4.12.3 → aether_quant-5.4.7}/tests/test_api_server.py +66 -0
  186. {aether_quant-4.12.3 → aether_quant-5.4.7}/tests/test_aq_cli.py +1664 -42
  187. aether_quant-5.4.7/tests/test_aq_test_ruff_flag.py +67 -0
  188. {aether_quant-4.12.3 → aether_quant-5.4.7}/tests/test_audit_postgres_worker.py +78 -0
  189. aether_quant-5.4.7/tests/test_auto_rollback.py +186 -0
  190. aether_quant-5.4.7/tests/test_bar_synthesis_parity.py +58 -0
  191. aether_quant-5.4.7/tests/test_book_neutrality.py +215 -0
  192. aether_quant-5.4.7/tests/test_ci_workflows.py +138 -0
  193. aether_quant-5.4.7/tests/test_cli_help_surface.py +142 -0
  194. aether_quant-5.4.7/tests/test_confidence_threshold_calibration.py +119 -0
  195. aether_quant-5.4.7/tests/test_cost_model.py +246 -0
  196. aether_quant-5.4.7/tests/test_cross_asset_sensitivity.py +106 -0
  197. aether_quant-5.4.7/tests/test_evaluation_state.py +175 -0
  198. {aether_quant-4.12.3 → aether_quant-5.4.7}/tests/test_exported_model.py +30 -0
  199. aether_quant-5.4.7/tests/test_factor_file_backfill.py +224 -0
  200. aether_quant-5.4.7/tests/test_feature_parity.py +125 -0
  201. aether_quant-5.4.7/tests/test_feature_reconciliation.py +233 -0
  202. {aether_quant-4.12.3 → aether_quant-5.4.7}/tests/test_fred_backfill.py +75 -22
  203. aether_quant-5.4.7/tests/test_generate_evaluation_report.py +561 -0
  204. aether_quant-5.4.7/tests/test_hrp_book_sizing.py +243 -0
  205. {aether_quant-4.12.3 → aether_quant-5.4.7}/tests/test_ib_backfill.py +0 -1
  206. aether_quant-5.4.7/tests/test_impact_model.py +67 -0
  207. aether_quant-5.4.7/tests/test_json_safety.py +95 -0
  208. aether_quant-5.4.7/tests/test_kill_switch.py +406 -0
  209. aether_quant-5.4.7/tests/test_kill_switch_replay.py +215 -0
  210. aether_quant-5.4.7/tests/test_lean_runtime_imports.py +89 -0
  211. aether_quant-5.4.7/tests/test_limit_fill_simulator.py +155 -0
  212. {aether_quant-4.12.3 → aether_quant-5.4.7}/tests/test_manual_override.py +77 -1
  213. {aether_quant-4.12.3 → aether_quant-5.4.7}/tests/test_market_analyzer.py +227 -3
  214. {aether_quant-4.12.3 → aether_quant-5.4.7}/tests/test_market_liquidity.py +53 -0
  215. {aether_quant-4.12.3 → aether_quant-5.4.7}/tests/test_market_topology.py +49 -0
  216. aether_quant-5.4.7/tests/test_model_predictions.py +252 -0
  217. aether_quant-5.4.7/tests/test_monte_carlo.py +120 -0
  218. {aether_quant-4.12.3 → aether_quant-5.4.7}/tests/test_neural_network_state.py +8 -2
  219. aether_quant-5.4.7/tests/test_order_events_audit.py +135 -0
  220. {aether_quant-4.12.3 → aether_quant-5.4.7}/tests/test_order_gate.py +114 -0
  221. aether_quant-5.4.7/tests/test_portfolio_book_construction.py +1105 -0
  222. {aether_quant-4.12.3 → aether_quant-5.4.7}/tests/test_position_sizing.py +30 -0
  223. {aether_quant-4.12.3 → aether_quant-5.4.7}/tests/test_postgres_worker.py +74 -0
  224. aether_quant-5.4.7/tests/test_promotion_gate_era_rule.py +94 -0
  225. aether_quant-5.4.7/tests/test_public_benchmarks.py +194 -0
  226. aether_quant-5.4.7/tests/test_rank_book_simulator.py +375 -0
  227. aether_quant-5.4.7/tests/test_rank_ic_core.py +156 -0
  228. aether_quant-5.4.7/tests/test_rank_signal.py +242 -0
  229. aether_quant-5.4.7/tests/test_rank_signal_calibration.py +664 -0
  230. aether_quant-5.4.7/tests/test_reconciliation.py +223 -0
  231. {aether_quant-4.12.3 → aether_quant-5.4.7}/tests/test_retraining_orchestrator.py +150 -2
  232. {aether_quant-4.12.3 → aether_quant-5.4.7}/tests/test_retraining_worker.py +156 -0
  233. {aether_quant-4.12.3 → aether_quant-5.4.7}/tests/test_risk_controls.py +244 -0
  234. aether_quant-5.4.7/tests/test_rl_sizing_v541.py +83 -0
  235. aether_quant-5.4.7/tests/test_rollback_hardening.py +53 -0
  236. aether_quant-5.4.7/tests/test_rolling_ic_gate.py +165 -0
  237. aether_quant-5.4.7/tests/test_rolling_ic_gate_calibration.py +138 -0
  238. aether_quant-5.4.7/tests/test_rolling_ic_gate_replay.py +153 -0
  239. aether_quant-5.4.7/tests/test_sector_map.py +66 -0
  240. {aether_quant-4.12.3 → aether_quant-5.4.7}/tests/test_status_export.py +71 -0
  241. aether_quant-5.4.7/tests/test_train_cross_asset_sensitivity.py +136 -0
  242. aether_quant-5.4.7/tests/test_train_cross_sectional_batching.py +162 -0
  243. aether_quant-5.4.7/tests/test_train_gate_friendliness.py +141 -0
  244. {aether_quant-4.12.3 → aether_quant-5.4.7}/tests/test_train_indicators.py +42 -0
  245. {aether_quant-4.12.3 → aether_quant-5.4.7}/tests/test_train_multitask.py +82 -0
  246. aether_quant-5.4.7/tests/test_train_optimizer_and_swa.py +171 -0
  247. {aether_quant-4.12.3 → aether_quant-5.4.7}/tests/test_train_pipeline.py +86 -0
  248. aether_quant-5.4.7/tests/test_train_ranking_loss.py +418 -0
  249. {aether_quant-4.12.3 → aether_quant-5.4.7}/tests/test_train_ranking_validation.py +175 -0
  250. aether_quant-5.4.7/tests/test_train_residual_rank_targets.py +266 -0
  251. {aether_quant-4.12.3 → aether_quant-5.4.7}/tests/test_train_rl_sizing.py +75 -0
  252. {aether_quant-4.12.3 → aether_quant-5.4.7}/tests/test_train_sequence.py +15 -1
  253. {aether_quant-4.12.3 → aether_quant-5.4.7}/tests/test_train_sequence_architecture.py +60 -0
  254. {aether_quant-4.12.3 → aether_quant-5.4.7}/tests/test_train_threshold_and_early_stop.py +2 -2
  255. {aether_quant-4.12.3 → aether_quant-5.4.7}/tests/test_train_walk_forward_windows.py +47 -2
  256. {aether_quant-4.12.3 → aether_quant-5.4.7}/tests/test_trigger_worker.py +9 -1
  257. aether_quant-5.4.7/tests/test_v543_new_features.py +169 -0
  258. aether_quant-5.4.7/tests/test_v547_bug_hunt.py +497 -0
  259. aether_quant-5.4.7/tests/test_validation_gate.py +323 -0
  260. aether_quant-5.4.7/tests/test_walk_forward_multimodel.py +225 -0
  261. {aether_quant-4.12.3 → aether_quant-5.4.7}/tests/test_yfinance_backfill.py +0 -1
  262. aether_quant-5.4.7/topology/README.md +122 -0
  263. {aether_quant-4.12.3 → aether_quant-5.4.7}/topology/__init__.py +2 -0
  264. {aether_quant-4.12.3 → aether_quant-5.4.7}/topology/market_topology.py +14 -2
  265. {aether_quant-4.12.3 → aether_quant-5.4.7}/train.py +1620 -155
  266. {aether_quant-4.12.3 → aether_quant-5.4.7}/train_multitask.py +274 -30
  267. {aether_quant-4.12.3 → aether_quant-5.4.7}/train_rl_sizing.py +42 -10
  268. {aether_quant-4.12.3 → aether_quant-5.4.7}/train_sequence.py +259 -32
  269. {aether_quant-4.12.3 → aether_quant-5.4.7}/train_strategy_selector.py +0 -1
  270. {aether_quant-4.12.3 → aether_quant-5.4.7}/visualization/README.md +24 -0
  271. aether_quant-5.4.7/visualization/forex_order_sizing.jsonl +991 -0
  272. {aether_quant-4.12.3 → aether_quant-5.4.7}/webui/README.md +36 -16
  273. {aether_quant-4.12.3 → aether_quant-5.4.7}/webui/src/App.tsx +6 -0
  274. {aether_quant-4.12.3 → aether_quant-5.4.7}/webui/src/api/client.ts +3 -0
  275. {aether_quant-4.12.3 → aether_quant-5.4.7}/webui/src/api/hooks.ts +13 -0
  276. aether_quant-5.4.7/webui/src/components/evaluation/AblationPanel.test.tsx +82 -0
  277. aether_quant-5.4.7/webui/src/components/evaluation/AblationPanel.tsx +103 -0
  278. aether_quant-5.4.7/webui/src/components/evaluation/BenchmarkPanel.test.tsx +71 -0
  279. aether_quant-5.4.7/webui/src/components/evaluation/BenchmarkPanel.tsx +99 -0
  280. aether_quant-5.4.7/webui/src/components/evaluation/BookHistoryReconciliationPanel.test.tsx +79 -0
  281. aether_quant-5.4.7/webui/src/components/evaluation/BookHistoryReconciliationPanel.tsx +129 -0
  282. aether_quant-5.4.7/webui/src/components/evaluation/BookSpreadCalibrationPanel.test.tsx +39 -0
  283. aether_quant-5.4.7/webui/src/components/evaluation/BookSpreadCalibrationPanel.tsx +66 -0
  284. aether_quant-5.4.7/webui/src/components/evaluation/CapacityStressPanel.tsx +99 -0
  285. aether_quant-5.4.7/webui/src/components/evaluation/MonteCarloPanel.test.tsx +81 -0
  286. aether_quant-5.4.7/webui/src/components/evaluation/MonteCarloPanel.tsx +100 -0
  287. aether_quant-5.4.7/webui/src/components/evaluation/RankBookPerformancePanel.test.tsx +60 -0
  288. aether_quant-5.4.7/webui/src/components/evaluation/RankBookPerformancePanel.tsx +66 -0
  289. aether_quant-5.4.7/webui/src/components/evaluation/WalkForwardStabilityPanel.test.tsx +93 -0
  290. aether_quant-5.4.7/webui/src/components/evaluation/WalkForwardStabilityPanel.tsx +132 -0
  291. {aether_quant-4.12.3 → aether_quant-5.4.7}/webui/src/components/layout/AppShell.tsx +1 -0
  292. aether_quant-5.4.7/webui/src/components/monitoring/KillSwitchPanel.test.tsx +54 -0
  293. aether_quant-5.4.7/webui/src/components/monitoring/KillSwitchPanel.tsx +77 -0
  294. aether_quant-5.4.7/webui/src/components/monitoring/ReconciliationPanel.test.tsx +55 -0
  295. aether_quant-5.4.7/webui/src/components/monitoring/ReconciliationPanel.tsx +75 -0
  296. aether_quant-5.4.7/webui/src/components/monitoring/RetrainingStatusPanel.test.tsx +76 -0
  297. {aether_quant-4.12.3 → aether_quant-5.4.7}/webui/src/components/monitoring/RetrainingStatusPanel.tsx +22 -0
  298. {aether_quant-4.12.3 → aether_quant-5.4.7}/webui/src/components/neuralnet/NeuralNetworkStatsPanel.test.tsx +22 -0
  299. {aether_quant-4.12.3 → aether_quant-5.4.7}/webui/src/components/neuralnet/NeuralNetworkStatsPanel.tsx +49 -2
  300. aether_quant-5.4.7/webui/src/components/neuralnet/TrainingRecipePanel.test.tsx +63 -0
  301. aether_quant-5.4.7/webui/src/components/neuralnet/TrainingRecipePanel.tsx +68 -0
  302. aether_quant-5.4.7/webui/src/components/portfolio/BookNeutralityPanel.test.tsx +28 -0
  303. aether_quant-5.4.7/webui/src/components/portfolio/BookNeutralityPanel.tsx +57 -0
  304. {aether_quant-4.12.3 → aether_quant-5.4.7}/webui/src/components/risk/AssetSizingTable.tsx +4 -0
  305. {aether_quant-4.12.3 → aether_quant-5.4.7}/webui/src/components/risk/MacroSnapshotPanel.test.tsx +11 -0
  306. {aether_quant-4.12.3 → aether_quant-5.4.7}/webui/src/components/risk/MacroSnapshotPanel.tsx +9 -1
  307. aether_quant-5.4.7/webui/src/components/risk/NetEdgePanel.test.tsx +54 -0
  308. aether_quant-5.4.7/webui/src/components/risk/NetEdgePanel.tsx +74 -0
  309. aether_quant-5.4.7/webui/src/components/risk/SensitivityPanel.test.tsx +37 -0
  310. aether_quant-5.4.7/webui/src/components/risk/SensitivityPanel.tsx +75 -0
  311. {aether_quant-4.12.3 → aether_quant-5.4.7}/webui/src/components/signals/Badge.tsx +3 -0
  312. aether_quant-5.4.7/webui/src/components/signals/RankSignalPanel.test.tsx +43 -0
  313. aether_quant-5.4.7/webui/src/components/signals/RankSignalPanel.tsx +50 -0
  314. aether_quant-5.4.7/webui/src/pages/EvaluationPage.tsx +36 -0
  315. {aether_quant-4.12.3 → aether_quant-5.4.7}/webui/src/pages/NeuralNetworkPage.tsx +5 -1
  316. {aether_quant-4.12.3 → aether_quant-5.4.7}/webui/src/pages/OperationsPage.tsx +7 -0
  317. {aether_quant-4.12.3 → aether_quant-5.4.7}/webui/src/pages/Overview.tsx +2 -0
  318. {aether_quant-4.12.3 → aether_quant-5.4.7}/webui/src/pages/RiskPage.tsx +6 -0
  319. {aether_quant-4.12.3 → aether_quant-5.4.7}/webui/src/pages/pages.test.tsx +51 -1
  320. aether_quant-5.4.7/webui/src/types/evaluation.ts +284 -0
  321. {aether_quant-4.12.3 → aether_quant-5.4.7}/webui/src/types/state.ts +224 -0
  322. aether_quant-4.12.3/.github/workflows/ci.yml +0 -49
  323. aether_quant-4.12.3/aether_quant.egg-info/scm_version.json +0 -8
  324. aether_quant-4.12.3/aether_quant.egg-info/top_level.txt +0 -5
  325. aether_quant-4.12.3/analyzer/README.md +0 -116
  326. aether_quant-4.12.3/aq_cli.py +0 -1610
  327. aether_quant-4.12.3/config.json +0 -2001
  328. aether_quant-4.12.3/data/reference/sector_mapping.json +0 -32
  329. aether_quant-4.12.3/development/backtest_equity_chart.png +0 -0
  330. aether_quant-4.12.3/execution/README.md +0 -339
  331. aether_quant-4.12.3/experts/README.md +0 -34
  332. aether_quant-4.12.3/inference/README.md +0 -279
  333. aether_quant-4.12.3/liquidity/__init__.py +0 -8
  334. aether_quant-4.12.3/monitoring/README.md +0 -21
  335. aether_quant-4.12.3/performance/rank_ic_monitor.py +0 -122
  336. aether_quant-4.12.3/portfolio/book_construction.py +0 -257
  337. aether_quant-4.12.3/pyproject.toml +0 -49
  338. aether_quant-4.12.3/regime/README.md +0 -68
  339. aether_quant-4.12.3/requirements/README.md +0 -63
  340. aether_quant-4.12.3/requirements.txt +0 -15
  341. aether_quant-4.12.3/retraining/validation_gate.py +0 -164
  342. aether_quant-4.12.3/risk/README.md +0 -598
  343. aether_quant-4.12.3/risk_controls.py +0 -178
  344. aether_quant-4.12.3/scripts/README.md +0 -43
  345. aether_quant-4.12.3/tests/test_portfolio_book_construction.py +0 -429
  346. aether_quant-4.12.3/tests/test_validation_gate.py +0 -150
  347. aether_quant-4.12.3/topology/README.md +0 -250
  348. {aether_quant-4.12.3 → aether_quant-5.4.7}/.devcontainer/devcontainer.json +0 -0
  349. {aether_quant-4.12.3 → aether_quant-5.4.7}/.devcontainer/dind-v1-test/devcontainer.json +0 -0
  350. {aether_quant-4.12.3 → aether_quant-5.4.7}/.dockerignore +0 -0
  351. {aether_quant-4.12.3 → aether_quant-5.4.7}/.env.compose.example +0 -0
  352. {aether_quant-4.12.3 → aether_quant-5.4.7}/.env.live.example +0 -0
  353. {aether_quant-4.12.3 → aether_quant-5.4.7}/.gitattributes +0 -0
  354. {aether_quant-4.12.3 → aether_quant-5.4.7}/.githooks/pre-commit +0 -0
  355. {aether_quant-4.12.3 → aether_quant-5.4.7}/Dockerfile +0 -0
  356. {aether_quant-4.12.3 → aether_quant-5.4.7}/LICENSE +0 -0
  357. {aether_quant-4.12.3 → aether_quant-5.4.7}/aether_quant.egg-info/dependency_links.txt +0 -0
  358. {aether_quant-4.12.3 → aether_quant-5.4.7}/aether_quant.egg-info/entry_points.txt +0 -0
  359. {aether_quant-4.12.3 → aether_quant-5.4.7}/audit/__init__.py +0 -0
  360. {aether_quant-4.12.3 → aether_quant-5.4.7}/audit/hash_chain.py +0 -0
  361. {aether_quant-4.12.3 → aether_quant-5.4.7}/audit/postgres_audit.py +0 -0
  362. {aether_quant-4.12.3 → aether_quant-5.4.7}/backtests/.gitkeep +0 -0
  363. {aether_quant-4.12.3 → aether_quant-5.4.7}/cpp_inference_ext/README.md +0 -0
  364. {aether_quant-4.12.3 → aether_quant-5.4.7}/cpp_inference_ext/pyproject.toml +0 -0
  365. {aether_quant-4.12.3 → aether_quant-5.4.7}/cpp_inference_ext/setup.py +0 -0
  366. {aether_quant-4.12.3 → aether_quant-5.4.7}/cpp_inference_ext/src/linear_batched.cpp +0 -0
  367. {aether_quant-4.12.3 → aether_quant-5.4.7}/data/alternative/estimize/consensus/aapl/.keep +0 -0
  368. {aether_quant-4.12.3 → aether_quant-5.4.7}/data/alternative/estimize/estimate/.keep +0 -0
  369. {aether_quant-4.12.3 → aether_quant-5.4.7}/data/alternative/estimize/release/.keep +0 -0
  370. {aether_quant-4.12.3 → aether_quant-5.4.7}/data/alternative/sec/aapl/.keep +0 -0
  371. {aether_quant-4.12.3 → aether_quant-5.4.7}/data/alternative/trading-economics/.keep +0 -0
  372. {aether_quant-4.12.3 → aether_quant-5.4.7}/data/alternative/trading-economics/calendar/.keep +0 -0
  373. {aether_quant-4.12.3 → aether_quant-5.4.7}/data/alternative/trading-economics/earnings/.keep +0 -0
  374. {aether_quant-4.12.3 → aether_quant-5.4.7}/data/alternative/trading-economics/indicator/.keep +0 -0
  375. {aether_quant-4.12.3 → aether_quant-5.4.7}/data/reference/forex_pair_specs.json +0 -0
  376. {aether_quant-4.12.3 → aether_quant-5.4.7}/data/reference/futures_contract_specs.json +0 -0
  377. {aether_quant-4.12.3 → aether_quant-5.4.7}/data_pipeline/__init__.py +0 -0
  378. {aether_quant-4.12.3 → aether_quant-5.4.7}/data_pipeline/dividend_backfill.py +0 -0
  379. {aether_quant-4.12.3 → aether_quant-5.4.7}/data_pipeline/ib_backfill.py +0 -0
  380. {aether_quant-4.12.3 → aether_quant-5.4.7}/data_pipeline/v2_manifest.py +0 -0
  381. {aether_quant-4.12.3 → aether_quant-5.4.7}/development/logo.png +0 -0
  382. {aether_quant-4.12.3 → aether_quant-5.4.7}/docker-compose.yml +0 -0
  383. {aether_quant-4.12.3 → aether_quant-5.4.7}/execution/config_cache.py +0 -0
  384. {aether_quant-4.12.3 → aether_quant-5.4.7}/execution/lean_config_render.py +0 -0
  385. {aether_quant-4.12.3 → aether_quant-5.4.7}/execution/live_credentials.py +0 -0
  386. {aether_quant-4.12.3 → aether_quant-5.4.7}/execution/live_credentials_io.py +0 -0
  387. {aether_quant-4.12.3 → aether_quant-5.4.7}/execution/paper_readiness.py +0 -0
  388. {aether_quant-4.12.3 → aether_quant-5.4.7}/execution/paper_readiness_io.py +0 -0
  389. {aether_quant-4.12.3 → aether_quant-5.4.7}/execution/paper_readiness_scheduler.py +0 -0
  390. {aether_quant-4.12.3 → aether_quant-5.4.7}/execution/runtime_config_io.py +0 -0
  391. {aether_quant-4.12.3 → aether_quant-5.4.7}/execution/secret_scan.py +0 -0
  392. {aether_quant-4.12.3 → aether_quant-5.4.7}/experience/__init__.py +0 -0
  393. {aether_quant-4.12.3 → aether_quant-5.4.7}/experience/observation_metrics.py +0 -0
  394. {aether_quant-4.12.3 → aether_quant-5.4.7}/experience/simulated_portfolio.py +0 -0
  395. {aether_quant-4.12.3 → aether_quant-5.4.7}/experts/__init__.py +0 -0
  396. {aether_quant-4.12.3 → aether_quant-5.4.7}/experts/expert_datasets.py +0 -0
  397. {aether_quant-4.12.3 → aether_quant-5.4.7}/features/bond_features.py +0 -0
  398. {aether_quant-4.12.3 → aether_quant-5.4.7}/features/derivatives_macro_features.py +0 -0
  399. {aether_quant-4.12.3 → aether_quant-5.4.7}/features/macro_features.py +0 -0
  400. {aether_quant-4.12.3 → aether_quant-5.4.7}/features/options_greeks.py +0 -0
  401. {aether_quant-4.12.3 → aether_quant-5.4.7}/features/technical_indicators.py +0 -0
  402. {aether_quant-4.12.3 → aether_quant-5.4.7}/generate_backtest_report.py +0 -0
  403. {aether_quant-4.12.3 → aether_quant-5.4.7}/inference/__init__.py +0 -0
  404. {aether_quant-4.12.3 → aether_quant-5.4.7}/inference/exported_model.py +0 -0
  405. {aether_quant-4.12.3 → aether_quant-5.4.7}/inference/parallel_inference.py +0 -0
  406. {aether_quant-4.12.3 → aether_quant-5.4.7}/inference/strategy_selector_inference.py +0 -0
  407. {aether_quant-4.12.3 → aether_quant-5.4.7}/moe/__init__.py +0 -0
  408. {aether_quant-4.12.3 → aether_quant-5.4.7}/monitoring/__init__.py +0 -0
  409. {aether_quant-4.12.3 → aether_quant-5.4.7}/monitoring/strategy_catalog.py +0 -0
  410. {aether_quant-4.12.3 → aether_quant-5.4.7}/notifications/__init__.py +0 -0
  411. {aether_quant-4.12.3 → aether_quant-5.4.7}/notifications/postgres_telegram.py +0 -0
  412. {aether_quant-4.12.3 → aether_quant-5.4.7}/notifications/telegram_client.py +0 -0
  413. {aether_quant-4.12.3 → aether_quant-5.4.7}/performance/__init__.py +0 -0
  414. {aether_quant-4.12.3 → aether_quant-5.4.7}/performance/postgres_triggers.py +0 -0
  415. {aether_quant-4.12.3 → aether_quant-5.4.7}/performance/trigger_worker.py +0 -0
  416. {aether_quant-4.12.3 → aether_quant-5.4.7}/performance/triggers.py +0 -0
  417. {aether_quant-4.12.3 → aether_quant-5.4.7}/portfolio/options_arbitrage_detector.py +0 -0
  418. {aether_quant-4.12.3 → aether_quant-5.4.7}/portfolio/options_assignment_risk.py +0 -0
  419. {aether_quant-4.12.3 → aether_quant-5.4.7}/portfolio/options_margin_sizing.py +0 -0
  420. {aether_quant-4.12.3 → aether_quant-5.4.7}/portfolio/options_strategy.py +1 -1
  421. {aether_quant-4.12.3 → aether_quant-5.4.7}/regime/__init__.py +0 -0
  422. {aether_quant-4.12.3 → aether_quant-5.4.7}/regime/market_regime.py +0 -0
  423. {aether_quant-4.12.3 → aether_quant-5.4.7}/retraining/__init__.py +0 -0
  424. {aether_quant-4.12.3 → aether_quant-5.4.7}/retraining/lean_backtest.py +0 -0
  425. {aether_quant-4.12.3 → aether_quant-5.4.7}/retraining/planning.py +0 -0
  426. {aether_quant-4.12.3 → aether_quant-5.4.7}/retraining/postgres_registry.py +0 -0
  427. {aether_quant-4.12.3 → aether_quant-5.4.7}/retraining/vault_client.py +0 -0
  428. {aether_quant-4.12.3 → aether_quant-5.4.7}/retraining/vault_commands.py +0 -0
  429. {aether_quant-4.12.3 → aether_quant-5.4.7}/risk/__init__.py +0 -0
  430. {aether_quant-4.12.3 → aether_quant-5.4.7}/risk/asset_class_router.py +0 -0
  431. {aether_quant-4.12.3 → aether_quant-5.4.7}/risk/forex_risk.py +0 -0
  432. {aether_quant-4.12.3 → aether_quant-5.4.7}/risk/futures_risk.py +0 -0
  433. {aether_quant-4.12.3 → aether_quant-5.4.7}/scripts/profile_inference.py +0 -0
  434. {aether_quant-4.12.3 → aether_quant-5.4.7}/scripts/render_lean_credentials.py +0 -0
  435. {aether_quant-4.12.3 → aether_quant-5.4.7}/setup.cfg +0 -0
  436. {aether_quant-4.12.3 → aether_quant-5.4.7}/tests/test_asset_class_router.py +0 -0
  437. {aether_quant-4.12.3 → aether_quant-5.4.7}/tests/test_assets_status.py +0 -0
  438. {aether_quant-4.12.3 → aether_quant-5.4.7}/tests/test_audit_queue.py +0 -0
  439. {aether_quant-4.12.3 → aether_quant-5.4.7}/tests/test_audit_status_export.py +0 -0
  440. {aether_quant-4.12.3 → aether_quant-5.4.7}/tests/test_backtest_gate.py +0 -0
  441. {aether_quant-4.12.3 → aether_quant-5.4.7}/tests/test_bond_features.py +0 -0
  442. {aether_quant-4.12.3 → aether_quant-5.4.7}/tests/test_config_cache.py +0 -0
  443. {aether_quant-4.12.3 → aether_quant-5.4.7}/tests/test_derivatives_macro_features.py +0 -0
  444. {aether_quant-4.12.3 → aether_quant-5.4.7}/tests/test_dividend_backfill.py +0 -0
  445. {aether_quant-4.12.3 → aether_quant-5.4.7}/tests/test_dockerignore_secrets.py +0 -0
  446. {aether_quant-4.12.3 → aether_quant-5.4.7}/tests/test_experience_queue.py +0 -0
  447. {aether_quant-4.12.3 → aether_quant-5.4.7}/tests/test_expert_datasets.py +0 -0
  448. {aether_quant-4.12.3 → aether_quant-5.4.7}/tests/test_expert_models.py +0 -0
  449. {aether_quant-4.12.3 → aether_quant-5.4.7}/tests/test_fetch.py +0 -0
  450. {aether_quant-4.12.3 → aether_quant-5.4.7}/tests/test_forex_risk.py +0 -0
  451. {aether_quant-4.12.3 → aether_quant-5.4.7}/tests/test_futures_risk.py +0 -0
  452. {aether_quant-4.12.3 → aether_quant-5.4.7}/tests/test_gating_network.py +0 -0
  453. {aether_quant-4.12.3 → aether_quant-5.4.7}/tests/test_generate_backtest_report.py +0 -0
  454. {aether_quant-4.12.3 → aether_quant-5.4.7}/tests/test_hash_chain.py +0 -0
  455. {aether_quant-4.12.3 → aether_quant-5.4.7}/tests/test_lean_backtest.py +0 -0
  456. {aether_quant-4.12.3 → aether_quant-5.4.7}/tests/test_lean_backtest_ml_coverage.py +0 -0
  457. {aether_quant-4.12.3 → aether_quant-5.4.7}/tests/test_lean_config_render.py +0 -0
  458. {aether_quant-4.12.3 → aether_quant-5.4.7}/tests/test_learned_topology.py +0 -0
  459. {aether_quant-4.12.3 → aether_quant-5.4.7}/tests/test_live_credentials.py +0 -0
  460. {aether_quant-4.12.3 → aether_quant-5.4.7}/tests/test_live_credentials_io.py +0 -0
  461. {aether_quant-4.12.3 → aether_quant-5.4.7}/tests/test_macro_features.py +0 -0
  462. {aether_quant-4.12.3 → aether_quant-5.4.7}/tests/test_market_regime.py +0 -0
  463. {aether_quant-4.12.3 → aether_quant-5.4.7}/tests/test_observation_metrics.py +0 -0
  464. {aether_quant-4.12.3 → aether_quant-5.4.7}/tests/test_options_arbitrage_detector.py +0 -0
  465. {aether_quant-4.12.3 → aether_quant-5.4.7}/tests/test_options_assignment_risk.py +0 -0
  466. {aether_quant-4.12.3 → aether_quant-5.4.7}/tests/test_options_greeks.py +0 -0
  467. {aether_quant-4.12.3 → aether_quant-5.4.7}/tests/test_options_margin_sizing.py +0 -0
  468. {aether_quant-4.12.3 → aether_quant-5.4.7}/tests/test_options_strategy.py +0 -0
  469. {aether_quant-4.12.3 → aether_quant-5.4.7}/tests/test_options_strategy_multileg.py +0 -0
  470. {aether_quant-4.12.3 → aether_quant-5.4.7}/tests/test_paper_readiness.py +0 -0
  471. {aether_quant-4.12.3 → aether_quant-5.4.7}/tests/test_paper_readiness_io.py +0 -0
  472. {aether_quant-4.12.3 → aether_quant-5.4.7}/tests/test_paper_readiness_report.py +0 -0
  473. {aether_quant-4.12.3 → aether_quant-5.4.7}/tests/test_paper_readiness_scheduler.py +0 -0
  474. {aether_quant-4.12.3 → aether_quant-5.4.7}/tests/test_parallel_inference.py +0 -0
  475. {aether_quant-4.12.3 → aether_quant-5.4.7}/tests/test_postgres_audit.py +0 -0
  476. {aether_quant-4.12.3 → aether_quant-5.4.7}/tests/test_postgres_telegram.py +0 -0
  477. {aether_quant-4.12.3 → aether_quant-5.4.7}/tests/test_postgres_triggers.py +0 -0
  478. {aether_quant-4.12.3 → aether_quant-5.4.7}/tests/test_profile_inference.py +0 -0
  479. {aether_quant-4.12.3 → aether_quant-5.4.7}/tests/test_profile_subsystems.py +0 -0
  480. {aether_quant-4.12.3 → aether_quant-5.4.7}/tests/test_rank_ic_monitor.py +0 -0
  481. {aether_quant-4.12.3 → aether_quant-5.4.7}/tests/test_retraining_artifacts.py +0 -0
  482. {aether_quant-4.12.3 → aether_quant-5.4.7}/tests/test_retraining_planning.py +0 -0
  483. {aether_quant-4.12.3 → aether_quant-5.4.7}/tests/test_retraining_postgres_registry.py +0 -0
  484. {aether_quant-4.12.3 → aether_quant-5.4.7}/tests/test_rl_sizing.py +0 -0
  485. {aether_quant-4.12.3 → aether_quant-5.4.7}/tests/test_runtime_config_io.py +0 -0
  486. {aether_quant-4.12.3 → aether_quant-5.4.7}/tests/test_secret_scan.py +0 -0
  487. {aether_quant-4.12.3 → aether_quant-5.4.7}/tests/test_simulated_portfolio.py +0 -0
  488. {aether_quant-4.12.3 → aether_quant-5.4.7}/tests/test_strategy_catalog.py +0 -0
  489. {aether_quant-4.12.3 → aether_quant-5.4.7}/tests/test_strategy_selector_inference.py +0 -0
  490. {aether_quant-4.12.3 → aether_quant-5.4.7}/tests/test_technical_indicators.py +0 -0
  491. {aether_quant-4.12.3 → aether_quant-5.4.7}/tests/test_telegram_alerts.py +0 -0
  492. {aether_quant-4.12.3 → aether_quant-5.4.7}/tests/test_telegram_client.py +0 -0
  493. {aether_quant-4.12.3 → aether_quant-5.4.7}/tests/test_telegram_worker.py +0 -0
  494. {aether_quant-4.12.3 → aether_quant-5.4.7}/tests/test_train_alt_data_features.py +0 -0
  495. {aether_quant-4.12.3 → aether_quant-5.4.7}/tests/test_train_asset_class_context_features.py +0 -0
  496. {aether_quant-4.12.3 → aether_quant-5.4.7}/tests/test_train_bond_features.py +0 -0
  497. {aether_quant-4.12.3 → aether_quant-5.4.7}/tests/test_train_cross_sectional_features.py +0 -0
  498. {aether_quant-4.12.3 → aether_quant-5.4.7}/tests/test_train_derivatives_macro_features.py +0 -0
  499. {aether_quant-4.12.3 → aether_quant-5.4.7}/tests/test_train_gating.py +0 -0
  500. {aether_quant-4.12.3 → aether_quant-5.4.7}/tests/test_train_macro_features.py +0 -0
  501. {aether_quant-4.12.3 → aether_quant-5.4.7}/tests/test_train_multitask_architecture.py +0 -0
  502. {aether_quant-4.12.3 → aether_quant-5.4.7}/tests/test_train_select_model_context_columns.py +0 -0
  503. {aether_quant-4.12.3 → aether_quant-5.4.7}/tests/test_train_strategy_selector.py +0 -0
  504. {aether_quant-4.12.3 → aether_quant-5.4.7}/tests/test_train_topology.py +0 -0
  505. {aether_quant-4.12.3 → aether_quant-5.4.7}/tests/test_triggers.py +0 -0
  506. {aether_quant-4.12.3 → aether_quant-5.4.7}/tests/test_v2_pipeline_manifest.py +0 -0
  507. {aether_quant-4.12.3 → aether_quant-5.4.7}/tests/test_vault_client.py +0 -0
  508. {aether_quant-4.12.3 → aether_quant-5.4.7}/tests/test_vault_commands.py +0 -0
  509. {aether_quant-4.12.3 → aether_quant-5.4.7}/topology/learned_topology.py +0 -0
  510. {aether_quant-4.12.3 → aether_quant-5.4.7}/train_gating.py +0 -0
  511. {aether_quant-4.12.3 → aether_quant-5.4.7}/train_topology.py +0 -0
  512. {aether_quant-4.12.3 → aether_quant-5.4.7}/webui/.gitignore +0 -0
  513. {aether_quant-4.12.3 → aether_quant-5.4.7}/webui/.oxlintrc.json +0 -0
  514. {aether_quant-4.12.3 → aether_quant-5.4.7}/webui/index.html +0 -0
  515. {aether_quant-4.12.3 → aether_quant-5.4.7}/webui/overview_v2_12.png +0 -0
  516. {aether_quant-4.12.3 → aether_quant-5.4.7}/webui/package-lock.json +0 -0
  517. {aether_quant-4.12.3 → aether_quant-5.4.7}/webui/package.json +0 -0
  518. {aether_quant-4.12.3 → aether_quant-5.4.7}/webui/public/favicon.svg +0 -0
  519. {aether_quant-4.12.3 → aether_quant-5.4.7}/webui/public/icons.svg +0 -0
  520. {aether_quant-4.12.3 → aether_quant-5.4.7}/webui/risk_v2_12.png +0 -0
  521. {aether_quant-4.12.3 → aether_quant-5.4.7}/webui/src/components/heatmap/AssetHeatmap.tsx +0 -0
  522. {aether_quant-4.12.3 → aether_quant-5.4.7}/webui/src/components/layout/Panel.tsx +0 -0
  523. {aether_quant-4.12.3 → aether_quant-5.4.7}/webui/src/components/monitoring/AssetsStatusPanel.tsx +0 -0
  524. {aether_quant-4.12.3 → aether_quant-5.4.7}/webui/src/components/monitoring/AuditLogPanel.tsx +0 -0
  525. {aether_quant-4.12.3 → aether_quant-5.4.7}/webui/src/components/monitoring/CountTable.tsx +0 -0
  526. {aether_quant-4.12.3 → aether_quant-5.4.7}/webui/src/components/monitoring/MonitoringFeeds.tsx +0 -0
  527. {aether_quant-4.12.3 → aether_quant-5.4.7}/webui/src/components/monitoring/ObservationPanel.tsx +0 -0
  528. {aether_quant-4.12.3 → aether_quant-5.4.7}/webui/src/components/monitoring/PaperReadinessPanel.tsx +0 -0
  529. {aether_quant-4.12.3 → aether_quant-5.4.7}/webui/src/components/monitoring/PerformanceTriggersPanel.tsx +0 -0
  530. {aether_quant-4.12.3 → aether_quant-5.4.7}/webui/src/components/monitoring/RawStateViewer.tsx +0 -0
  531. {aether_quant-4.12.3 → aether_quant-5.4.7}/webui/src/components/neuralnet/NeuralNetworkScene3D.tsx +0 -0
  532. {aether_quant-4.12.3 → aether_quant-5.4.7}/webui/src/components/optionsstrategy/CorporateActionsPanel.tsx +0 -0
  533. {aether_quant-4.12.3 → aether_quant-5.4.7}/webui/src/components/optionsstrategy/DividendScheduleSummaryPanel.tsx +0 -0
  534. {aether_quant-4.12.3 → aether_quant-5.4.7}/webui/src/components/optionsstrategy/ForexPairDetailPanel.tsx +0 -0
  535. {aether_quant-4.12.3 → aether_quant-5.4.7}/webui/src/components/optionsstrategy/HeldMultiLegPositionsPanel.tsx +0 -0
  536. {aether_quant-4.12.3 → aether_quant-5.4.7}/webui/src/components/optionsstrategy/StrategyCatalogBrowser.tsx +0 -0
  537. {aether_quant-4.12.3 → aether_quant-5.4.7}/webui/src/components/optionsstrategy/StrategySelectorScoresPanel.tsx +0 -0
  538. {aether_quant-4.12.3 → aether_quant-5.4.7}/webui/src/components/risk/AssetSizingTable.test.tsx +0 -0
  539. {aether_quant-4.12.3 → aether_quant-5.4.7}/webui/src/components/risk/DerivativesMacroPanel.tsx +0 -0
  540. {aether_quant-4.12.3 → aether_quant-5.4.7}/webui/src/components/risk/LiquidityTable.tsx +0 -0
  541. {aether_quant-4.12.3 → aether_quant-5.4.7}/webui/src/components/risk/RiskBar.tsx +0 -0
  542. {aether_quant-4.12.3 → aether_quant-5.4.7}/webui/src/components/risk/RiskCore.tsx +0 -0
  543. {aether_quant-4.12.3 → aether_quant-5.4.7}/webui/src/components/risk/StrategyRiskCards.tsx +0 -0
  544. {aether_quant-4.12.3 → aether_quant-5.4.7}/webui/src/components/scene3d/Scene3D.tsx +0 -0
  545. {aether_quant-4.12.3 → aether_quant-5.4.7}/webui/src/components/scorecards/Scorecards.tsx +0 -0
  546. {aether_quant-4.12.3 → aether_quant-5.4.7}/webui/src/components/signals/PositionsList.tsx +0 -0
  547. {aether_quant-4.12.3 → aether_quant-5.4.7}/webui/src/components/signals/SignalBoard.tsx +0 -0
  548. {aether_quant-4.12.3 → aether_quant-5.4.7}/webui/src/components/topology/ClusterList.tsx +0 -0
  549. {aether_quant-4.12.3 → aether_quant-5.4.7}/webui/src/components/topology/TopologyLearningPanel.tsx +0 -0
  550. {aether_quant-4.12.3 → aether_quant-5.4.7}/webui/src/components/topology/TopologyScene3D.test.tsx +0 -0
  551. {aether_quant-4.12.3 → aether_quant-5.4.7}/webui/src/components/topology/TopologyScene3D.tsx +0 -0
  552. {aether_quant-4.12.3 → aether_quant-5.4.7}/webui/src/components/tracing/AssetPerformancePanel.tsx +0 -0
  553. {aether_quant-4.12.3 → aether_quant-5.4.7}/webui/src/components/tracing/BacktestEquityPanel.tsx +0 -0
  554. {aether_quant-4.12.3 → aether_quant-5.4.7}/webui/src/components/tracing/DivergingBarChart.test.tsx +0 -0
  555. {aether_quant-4.12.3 → aether_quant-5.4.7}/webui/src/components/tracing/DivergingBarChart.tsx +0 -0
  556. {aether_quant-4.12.3 → aether_quant-5.4.7}/webui/src/components/tracing/LineChart.test.tsx +0 -0
  557. {aether_quant-4.12.3 → aether_quant-5.4.7}/webui/src/components/tracing/LineChart.tsx +0 -0
  558. {aether_quant-4.12.3 → aether_quant-5.4.7}/webui/src/components/tracing/MetricsSnapshotPanel.tsx +0 -0
  559. {aether_quant-4.12.3 → aether_quant-5.4.7}/webui/src/components/tracing/ObservationEquityPanel.tsx +0 -0
  560. {aether_quant-4.12.3 → aether_quant-5.4.7}/webui/src/index.css +0 -0
  561. {aether_quant-4.12.3 → aether_quant-5.4.7}/webui/src/lib/downsample.ts +0 -0
  562. {aether_quant-4.12.3 → aether_quant-5.4.7}/webui/src/lib/format.test.ts +0 -0
  563. {aether_quant-4.12.3 → aether_quant-5.4.7}/webui/src/lib/format.ts +0 -0
  564. {aether_quant-4.12.3 → aether_quant-5.4.7}/webui/src/main.tsx +0 -0
  565. {aether_quant-4.12.3 → aether_quant-5.4.7}/webui/src/pages/OptionsStrategyPage.tsx +0 -0
  566. {aether_quant-4.12.3 → aether_quant-5.4.7}/webui/src/pages/TopologyPage.tsx +0 -0
  567. {aether_quant-4.12.3 → aether_quant-5.4.7}/webui/src/pages/TracingPage.tsx +0 -0
  568. {aether_quant-4.12.3 → aether_quant-5.4.7}/webui/src/test/setup.ts +0 -0
  569. {aether_quant-4.12.3 → aether_quant-5.4.7}/webui/src/types/audit.ts +0 -0
  570. {aether_quant-4.12.3 → aether_quant-5.4.7}/webui/src/types/tracing.ts +0 -0
  571. {aether_quant-4.12.3 → aether_quant-5.4.7}/webui/tsconfig.app.json +0 -0
  572. {aether_quant-4.12.3 → aether_quant-5.4.7}/webui/tsconfig.json +0 -0
  573. {aether_quant-4.12.3 → aether_quant-5.4.7}/webui/tsconfig.node.json +0 -0
  574. {aether_quant-4.12.3 → aether_quant-5.4.7}/webui/vite.config.ts +0 -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
+ # .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,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
@@ -9,6 +9,28 @@ on:
9
9
  tags: ["v*.*.*"]
10
10
 
11
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
+
12
34
  publish-pypi:
13
35
  runs-on: ubuntu-latest
14
36
  environment: pypi # must match the Environment name configured in PyPI's Trusted Publisher setup
@@ -78,3 +100,31 @@ jobs:
78
100
  # image, so the npm ci/pip install layers survive between runs.
79
101
  cache-from: type=gha
80
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
@@ -73,6 +73,14 @@ ml/versions/
73
73
  # rank-pivot roadmap work, development/Problems.md#43) - a local backup,
74
74
  # never meant to be committed.
75
75
  ml/_backup_pre_rank_pivot/
76
+ # Manual pre-smoke-test snapshot (rollback point before the V5.2.8
77
+ # gate_aware_ranking_weights Codespace smoke test, development/Problems.md#94)
78
+ # - a local backup, never meant to be committed.
79
+ ml/_backup_pre_v528_gate_aware_smoke_test/
80
+ # Manual pre-full-retrain snapshot (rollback point before the V5.2.9
81
+ # full production retrain with gate_aware_ranking_weights enabled) - a
82
+ # local backup, never meant to be committed.
83
+ ml/_backup_pre_v529_full_retrain/
76
84
  ml/model.pt
77
85
  ml/scaler.pkl
78
86
  ml/*.pkl
@@ -119,6 +127,24 @@ visualization/state.json
119
127
  visualization/scene.json
120
128
  visualization/topology_state.json
121
129
  visualization/grafana/
130
+ # V5.2.2 book-history diagnostic log - per-date live book selections
131
+ # (roles/raw scores/weights) from a real backtest. Off by default
132
+ # (phase_v2.diagnostics.book_history.enabled), but gitignored regardless
133
+ # so an accidental enable+commit can't leak it - same rationale as the
134
+ # ml/evaluation/ reports below. Wildcarded (not just the exact filename) so
135
+ # the per-run isolated extracts used for reconciliation (e.g.
136
+ # book_history_v524_only.jsonl, book_history_v525_only.jsonl - see
137
+ # development/Problems.md #91) are covered too; book_history_v524_only.jsonl
138
+ # was committed in V5.2.4's commit before this gap was caught, untracked
139
+ # alongside this fix (V5.2.5).
140
+ visualization/book_history*.jsonl
141
+
142
+ # Generated evaluation reports (aq evaluate --...) - reveal historical
143
+ # model selections/scores (book composition by date, rank scores,
144
+ # calibrated thresholds), effectively derived model IP, not source - same
145
+ # rationale as the ml/*_model.json weight-artifact rules above.
146
+ # Regenerable by re-running the command that wrote them.
147
+ ml/evaluation/
122
148
 
123
149
  # Logs and temporary files
124
150
  .coverage
@@ -142,6 +168,9 @@ webui/dist/
142
168
  # scripts/profile_inference.py's pstats dump - regenerable output, not source
143
169
  scripts/profile_inference_output*.txt
144
170
  scripts/profile_subsystems_output*.txt
171
+ # scripts/order_events_audit.py's output dump (V5.3.1) - regenerable
172
+ # diagnostic output, not source.
173
+ scripts/order_events_audit_output*.txt
145
174
 
146
175
  # cpp_inference_ext/'s compiled build artifacts - regenerable via
147
176
  # `pip install -e cpp_inference_ext/`, never source. The .pyd itself is
@@ -0,0 +1,144 @@
1
+ # Aether Quant — Agent Instructions
2
+
3
+ ## What this project is
4
+
5
+ Aether Quant is a dynamic, self-adapting algorithmic trading system built on
6
+ QuantConnect Lean and PyTorch. An ensemble of neural models predicts direction,
7
+ return magnitude, volatility, and cross-sectional rank for every asset every
8
+ day, driving a market-neutral long/short book validated end-to-end inside Lean,
9
+ with a kill switch, position reconciliation, and controlled retraining in front
10
+ of live trading.
11
+
12
+ ## Essential commands
13
+
14
+ ```powershell
15
+ pip install -e . # register `aq` CLI from source (pyproject.toml)
16
+ aq test # full pytest suite (~2929 tests), refreshes badge
17
+ aq test --risk # risk subsystem only (subsystem filtered)
18
+ aq evaluate # offline rank evaluation
19
+ aq backtest # real Lean backtest (requires Docker, ~1hr+)
20
+ ruff check . # linter (must pass before commit)
21
+ ```
22
+
23
+ ## File layout
24
+
25
+ | Path | What lives here |
26
+ |---|---|
27
+ | `main.py` | Lean algorithm entry point — **zero unit test coverage by design**, only runs inside Lean |
28
+ | `risk/` | Position sizing, portfolio slicing, kill switch, correlation |
29
+ | `portfolio/` | Book construction, book neutrality, HRP, risk parity, options strategies |
30
+ | `execution/` | Order gate, cost model, reconciliation |
31
+ | `features/` | Pure feature functions (technical, macro, alt data, options greeks) |
32
+ | `inference/` | Model loading, exported model reader, batch inference |
33
+ | `moe/` | Mixture-of-experts gating and routing |
34
+ | `train.py` | Core training loop (dataset, ranking losses, walk-forward, export) |
35
+ | `train_*.py` | Specialized trainers (multitask, sequence, gating, topology, strategy selector) |
36
+ | `evaluation/` | Offline evaluation: rank book simulator, Monte Carlo, calibration tools |
37
+ | `retraining/` | Candidate promotion: validation gate, backtest gate, artifact versioning |
38
+ | `experience/` | Experience pipeline: Redis queue, Postgres worker, session summaries |
39
+ | `audit/` | Tamper-evident audit log (hash-chained) |
40
+ | `monitoring/` | FastAPI server, neural network state, evaluation state, Grafana dashboards |
41
+ | `notifications/` | Telegram alerts (pure/format/worker split) |
42
+ | `data_pipeline/` | Yahoo backfill, FRED backfill, bar synthesis, fetching |
43
+ | `regime/` | Market regime detection |
44
+ | `topology/` | Market topology overlay |
45
+ | `json_safety.py` | Shared JSON-safety helpers (finite-safe, atomic writes) |
46
+ | `aq_cli.py` | CLI entry point: all `aq` subcommands, subsystem test routing |
47
+ | `tests/` | pytest suite — one file per module, round files for cross-module regressions |
48
+ | `development/` | Architecture docs, Changelog, Problems.md, backups |
49
+ | `webui/` | React dashboard (TypeScript) |
50
+
51
+ ## Code conventions
52
+
53
+ - **Pure, testable modules over `main.py` logic.** Anything needing tests must
54
+ be a pure function importable by both `main.py` and `tests/`.
55
+ - **One test file per source module.** Cross-module regressions go in round
56
+ files: `test_v543_new_features.py`, `test_rl_sizing_v541.py`, etc.
57
+ - **Register every new test file** in `aq_cli.py`'s `_SUBSYSTEM_TEST_FILES`
58
+ dict immediately when you create it — otherwise it is silently skipped by
59
+ subsystem-filtered runs (`aq test --risk`, `--portfolio`, etc.).
60
+ - **Never commit changes that break the full test suite.** Run `aq test` after
61
+ every code change; ruff must also be clean.
62
+ - **Round files at the same commit as their fixes.** Test + fix together, never
63
+ separately.
64
+ - **`aq test` only, never bare `pytest` from root** — see `development/Problems.md`
65
+ #8 and `tests/README.md`.
66
+
67
+ ## Code context
68
+
69
+ - **README + sub-readmes:** every folder has a short sub-readme for introduction
70
+ and overview. Always read the relevant sub-readme before editing a module.
71
+ - **`development/` folder:** read every `.md` file — they hold important context
72
+ for project structure, plan, and known problems.
73
+ - **Obsidian vault** (`Aether-quant-Obsidian-Vault`): generated graph of all
74
+ dependencies and functions. Use for general overview, but always verify
75
+ against source — it can be outdated.
76
+
77
+ ## Verification tasks
78
+
79
+ After every code change, complete ALL of the following:
80
+
81
+ 1. **Add tests** for everything you added/changed.
82
+ 2. **Run them** (`aq test` — no Lean backtest in the test suite) and debug if
83
+ needed. Also do manual debugging where unit tests don't cover.
84
+ 3. **Update documentation:**
85
+ - README.md + sub-readmes (if module docs changed)
86
+ - Test suite badge (`aq test` auto-refreshes)
87
+ - `development/` folder: Problems.md, Changelog.md, architecture.md,
88
+ infrastructure.md
89
+ - `aq --help` surfaces if new/changed flags
90
+ 4. **AQ Vault:** run `generate_code_graph.py` + `regenerate_vault.py
91
+ --append-handoff` (see Vault section below).
92
+ 5. **Report to user:** say whether Docker image should be updated and/or git
93
+ commit saved. Say if `aq backtest` is needed — user runs backtests
94
+ themselves, never run them in the agent session.
95
+
96
+ ## Model training
97
+
98
+ - **Always train models on the Codespace**, not locally. Use the CLI.
99
+ - **Sync codespace with local project** including all gitignored and normal
100
+ files before training.
101
+ - **Training codespace:** `aq-Training-Ground-Fixed` — keep it OFF when not in
102
+ active use to reduce costs.
103
+ - **After training finishes:** bring the entire model, data, and any extra files
104
+ back to the local machine for testing.
105
+
106
+ ## Problems.md status markers
107
+
108
+ Every entry in `development/Problems.md` uses the established color scheme:
109
+
110
+ | Marker | Meaning |
111
+ |--------|---------|
112
+ | 🟢 `fixed` | Code changed + verified, nothing pending |
113
+ | 🟡 `partial` | Fix shipped but verification incomplete (needs backtest, live deploy, or user confirmation) |
114
+ | 🔴 `closed` | No code fix: declined/won't-fix/moot/superseded |
115
+
116
+ Always update the status marker when closing a problem entry.
117
+
118
+ ## CI (`.github/workflows/ci.yml`)
119
+
120
+ Single job: checkout → setup-python 3.10 → install → ruff → `aq test` → badge refresh.
121
+ No Docker/Lean backtests in CI. Docker rebuild is required before any paper/live
122
+ deploy whenever material code changes land.
123
+
124
+ ## Vault (Aether-quant-Obsidian-Vault)
125
+
126
+ The Obsidian vault tracks code graphs and agent handoffs:
127
+
128
+ ```powershell
129
+ cd Aether-quant-Obsidian-Vault
130
+ python scripts/generate_code_graph.py --repo-root .. --vault .
131
+ python scripts/regenerate_vault.py --repo-root .. --vault . --append-handoff \
132
+ --agent ox-alpha --action completed --summary "..." --files file1.py file2.py
133
+ ```
134
+
135
+ ## Don'ts
136
+
137
+ - Never commit secrets, API keys, or credentials
138
+ - Never run `aq backtest` as part of an automated PR gate
139
+ - Never add new top-level `.py` modules without updating `pyproject.toml`
140
+ `py-modules` and re-installing with `pip install -e .`
141
+ - Never let NaN / inf / None silently pass through feature pipelines — use
142
+ `json_safety` helpers and explicit guards
143
+ - Never assume a Redis / Postgres / IB connection is available — always
144
+ degrade gracefully (the test suite runs without any of them)
@@ -0,0 +1,56 @@
1
+ # Code of Conduct
2
+
3
+ ## Our standard
4
+
5
+ This project is a research codebase worked on by people with very different
6
+ backgrounds. Participate in good faith: be respectful, be direct without
7
+ being hostile, and assume competence in others. Harassment, personal
8
+ attacks, and demeaning conduct are not acceptable anywhere in this
9
+ project's spaces.
10
+
11
+ ## Expected behavior
12
+
13
+ - Critique code, data, and claims — not people.
14
+ - Keep discussions technical; this repo's tone is direct and evidence-first.
15
+ - Accept that backtest results, signal quality, and design choices get
16
+ challenged, sometimes bluntly. Disagreement about the work is normal and
17
+ welcome.
18
+
19
+ ## Unacceptable behavior
20
+
21
+ - Harassment, discrimination, or personal attacks of any kind.
22
+ - Trolling, insulting or derogatory comments, and deliberate intimidation.
23
+ - Publishing others' private information (doxxing) without consent.
24
+ - Sexualized language or imagery, unwelcome attention of any kind.
25
+ - Sustained disruption of discussions after being asked to stop.
26
+
27
+ ## Scope
28
+
29
+ This policy applies within the repository (issues, PRs, code review,
30
+ commit messages) and in all project community spaces: the GitHub
31
+ organization, discussions, chat channels, and any event or space claiming
32
+ to represent the project. It also applies when representing the project
33
+ externally.
34
+
35
+ ## Enforcement
36
+
37
+ Maintainers enforce this policy and may edit or remove comments, commits,
38
+ code, issues, and PRs that violate it, up to and including temporarily or
39
+ permanently banning a contributor.
40
+
41
+ Report violations privately to the maintainers via
42
+ [GitHub report/flag mechanisms](https://docs.github.com/en/communities/moderating-comments-and-conversations/reporting-abuse-or-spam)
43
+ or a direct message to a maintainer. Do not escalate harassment in public
44
+ threads.
45
+
46
+ Reports are handled confidentially to the extent possible; information is
47
+ shared only with maintainers who need it to investigate and act. Retaliation
48
+ against anyone reporting in good faith is itself a violation.
49
+
50
+ Maintainers respond on a best-effort basis and will state an outcome to the
51
+ reporter where appropriate. Repeated or severe violations lead to permanent
52
+ removal from all project spaces.
53
+
54
+ ## Attribution
55
+
56
+ Adapted for this project; not bound to any single template.