aether-quant 0.9.0__tar.gz → 1.0.0__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 (401) hide show
  1. aether_quant-1.0.0/.devcontainer/devcontainer.json +14 -0
  2. aether_quant-1.0.0/.devcontainer/dind-v1-test/devcontainer.json +14 -0
  3. aether_quant-1.0.0/.dockerignore +39 -0
  4. aether_quant-1.0.0/.env.live.example +33 -0
  5. aether_quant-1.0.0/.githooks/pre-commit +29 -0
  6. {aether_quant-0.9.0 → aether_quant-1.0.0}/.github/workflows/ci.yml +5 -2
  7. aether_quant-1.0.0/.gitignore +153 -0
  8. aether_quant-1.0.0/Dockerfile +29 -0
  9. {aether_quant-0.9.0 → aether_quant-1.0.0}/PKG-INFO +1 -1
  10. aether_quant-1.0.0/README.md +844 -0
  11. {aether_quant-0.9.0 → aether_quant-1.0.0}/aether_quant.egg-info/PKG-INFO +1 -1
  12. {aether_quant-0.9.0 → aether_quant-1.0.0}/aether_quant.egg-info/SOURCES.txt +40 -53
  13. {aether_quant-0.9.0 → aether_quant-1.0.0}/aether_quant.egg-info/scm_file_list.json +268 -281
  14. aether_quant-1.0.0/aether_quant.egg-info/scm_version.json +8 -0
  15. {aether_quant-0.9.0 → aether_quant-1.0.0}/analyzer/market_analyzer.py +36 -0
  16. {aether_quant-0.9.0 → aether_quant-1.0.0}/aq_cli.py +336 -12
  17. aether_quant-1.0.0/audit/README.md +44 -0
  18. aether_quant-1.0.0/audit/__init__.py +38 -0
  19. aether_quant-1.0.0/audit/hash_chain.py +52 -0
  20. aether_quant-1.0.0/audit/postgres_audit.py +61 -0
  21. aether_quant-1.0.0/audit/postgres_worker.py +336 -0
  22. aether_quant-1.0.0/audit/redis_queue.py +123 -0
  23. aether_quant-1.0.0/audit/status_export.py +59 -0
  24. {aether_quant-0.9.0 → aether_quant-1.0.0}/config.json +756 -28
  25. aether_quant-1.0.0/cpp_inference_ext/README.md +60 -0
  26. aether_quant-1.0.0/cpp_inference_ext/pyproject.toml +3 -0
  27. aether_quant-1.0.0/cpp_inference_ext/setup.py +31 -0
  28. aether_quant-1.0.0/cpp_inference_ext/src/linear_batched.cpp +62 -0
  29. aether_quant-1.0.0/data/reference/futures_contract_specs.json +45 -0
  30. aether_quant-1.0.0/data/reference/sector_mapping.json +32 -0
  31. {aether_quant-0.9.0 → aether_quant-1.0.0}/data_pipeline/README.md +2 -1
  32. {aether_quant-0.9.0 → aether_quant-1.0.0}/data_pipeline/yfinance_backfill.py +12 -0
  33. {aether_quant-0.9.0 → aether_quant-1.0.0}/development/Changelog.md +1100 -0
  34. aether_quant-1.0.0/development/Problems.md +3289 -0
  35. aether_quant-1.0.0/development/asset_universe.md +143 -0
  36. aether_quant-1.0.0/development/backtest_equity_chart.png +0 -0
  37. {aether_quant-0.9.0 → aether_quant-1.0.0}/development/infrastructure.md +151 -11
  38. aether_quant-1.0.0/development/project_structure.md +56 -0
  39. {aether_quant-0.9.0 → aether_quant-1.0.0}/development/v2_architecture.md +90 -8
  40. {aether_quant-0.9.0 → aether_quant-1.0.0}/docker-compose.yml +76 -32
  41. aether_quant-1.0.0/execution/README.md +339 -0
  42. aether_quant-1.0.0/execution/__init__.py +63 -0
  43. aether_quant-1.0.0/execution/lean_config_render.py +131 -0
  44. {aether_quant-0.9.0 → aether_quant-1.0.0}/execution/live_credentials.py +17 -0
  45. {aether_quant-0.9.0 → aether_quant-1.0.0}/execution/live_credentials_io.py +16 -6
  46. aether_quant-1.0.0/execution/order_gate.py +266 -0
  47. {aether_quant-0.9.0 → aether_quant-1.0.0}/execution/paper_readiness.py +20 -2
  48. aether_quant-1.0.0/execution/secret_scan.py +73 -0
  49. {aether_quant-0.9.0 → aether_quant-1.0.0}/experience/postgres_worker.py +3 -1
  50. {aether_quant-0.9.0 → aether_quant-1.0.0}/experience/simulated_portfolio.py +27 -2
  51. {aether_quant-0.9.0 → aether_quant-1.0.0}/features/bond_features.py +10 -1
  52. {aether_quant-0.9.0 → aether_quant-1.0.0}/inference/README.md +51 -0
  53. {aether_quant-0.9.0 → aether_quant-1.0.0}/inference/__init__.py +13 -0
  54. {aether_quant-0.9.0 → aether_quant-1.0.0}/inference/exported_model.py +233 -14
  55. aether_quant-1.0.0/inference/parallel_inference.py +138 -0
  56. {aether_quant-0.9.0 → aether_quant-1.0.0}/lean.json +1 -1
  57. {aether_quant-0.9.0 → aether_quant-1.0.0}/liquidity/README.md +9 -0
  58. {aether_quant-0.9.0 → aether_quant-1.0.0}/main.py +1318 -139
  59. {aether_quant-0.9.0 → aether_quant-1.0.0}/moe/gating.py +16 -0
  60. {aether_quant-0.9.0 → aether_quant-1.0.0}/monitoring/api_server.py +10 -0
  61. {aether_quant-0.9.0 → aether_quant-1.0.0}/monitoring/assets_status.py +14 -2
  62. {aether_quant-0.9.0 → aether_quant-1.0.0}/notifications/README.md +5 -5
  63. {aether_quant-0.9.0 → aether_quant-1.0.0}/portfolio/README.md +39 -20
  64. {aether_quant-0.9.0 → aether_quant-1.0.0}/portfolio/__init__.py +8 -1
  65. aether_quant-1.0.0/portfolio/book_construction.py +257 -0
  66. aether_quant-1.0.0/portfolio/options_strategy.py +349 -0
  67. aether_quant-1.0.0/requirements/README.md +63 -0
  68. {aether_quant-0.9.0 → aether_quant-1.0.0}/requirements/requirements-dev.txt +10 -0
  69. {aether_quant-0.9.0 → aether_quant-1.0.0}/requirements/requirements.txt +1 -0
  70. aether_quant-1.0.0/requirements.txt +15 -0
  71. {aether_quant-0.9.0 → aether_quant-1.0.0}/retraining/__init__.py +2 -0
  72. {aether_quant-0.9.0 → aether_quant-1.0.0}/retraining/orchestrator.py +71 -0
  73. {aether_quant-0.9.0 → aether_quant-1.0.0}/retraining/postgres_registry.py +18 -0
  74. {aether_quant-0.9.0 → aether_quant-1.0.0}/retraining/validation_gate.py +30 -0
  75. {aether_quant-0.9.0 → aether_quant-1.0.0}/retraining/worker.py +9 -0
  76. {aether_quant-0.9.0 → aether_quant-1.0.0}/risk/README.md +65 -2
  77. {aether_quant-0.9.0 → aether_quant-1.0.0}/risk/asset_class_router.py +114 -5
  78. aether_quant-1.0.0/scripts/README.md +42 -0
  79. aether_quant-1.0.0/scripts/profile_inference.py +327 -0
  80. aether_quant-1.0.0/scripts/profile_subsystems.py +500 -0
  81. aether_quant-1.0.0/scripts/render_lean_credentials.py +47 -0
  82. aether_quant-1.0.0/tests/test_api_server.py +39 -0
  83. {aether_quant-0.9.0 → aether_quant-1.0.0}/tests/test_aq_cli.py +481 -6
  84. aether_quant-1.0.0/tests/test_asset_class_router.py +235 -0
  85. {aether_quant-0.9.0 → aether_quant-1.0.0}/tests/test_assets_status.py +21 -1
  86. aether_quant-1.0.0/tests/test_audit_postgres_worker.py +196 -0
  87. aether_quant-1.0.0/tests/test_audit_queue.py +85 -0
  88. aether_quant-1.0.0/tests/test_audit_status_export.py +66 -0
  89. aether_quant-1.0.0/tests/test_dockerignore_secrets.py +104 -0
  90. {aether_quant-0.9.0 → aether_quant-1.0.0}/tests/test_expert_models.py +33 -0
  91. {aether_quant-0.9.0 → aether_quant-1.0.0}/tests/test_exported_model.py +251 -0
  92. {aether_quant-0.9.0 → aether_quant-1.0.0}/tests/test_gating_network.py +67 -1
  93. aether_quant-1.0.0/tests/test_hash_chain.py +85 -0
  94. {aether_quant-0.9.0 → aether_quant-1.0.0}/tests/test_lean_backtest_ml_coverage.py +108 -25
  95. aether_quant-1.0.0/tests/test_lean_config_render.py +109 -0
  96. {aether_quant-0.9.0 → aether_quant-1.0.0}/tests/test_live_credentials.py +26 -1
  97. {aether_quant-0.9.0 → aether_quant-1.0.0}/tests/test_live_credentials_io.py +15 -1
  98. {aether_quant-0.9.0 → aether_quant-1.0.0}/tests/test_market_analyzer.py +81 -0
  99. {aether_quant-0.9.0 → aether_quant-1.0.0}/tests/test_market_topology.py +145 -0
  100. aether_quant-1.0.0/tests/test_options_strategy.py +418 -0
  101. aether_quant-1.0.0/tests/test_order_gate.py +375 -0
  102. {aether_quant-0.9.0 → aether_quant-1.0.0}/tests/test_paper_readiness.py +33 -0
  103. aether_quant-1.0.0/tests/test_parallel_inference.py +256 -0
  104. aether_quant-1.0.0/tests/test_portfolio_book_construction.py +429 -0
  105. aether_quant-1.0.0/tests/test_postgres_audit.py +83 -0
  106. aether_quant-1.0.0/tests/test_profile_inference.py +134 -0
  107. aether_quant-1.0.0/tests/test_profile_subsystems.py +109 -0
  108. {aether_quant-0.9.0 → aether_quant-1.0.0}/tests/test_retraining_orchestrator.py +82 -0
  109. {aether_quant-0.9.0 → aether_quant-1.0.0}/tests/test_retraining_postgres_registry.py +27 -0
  110. {aether_quant-0.9.0 → aether_quant-1.0.0}/tests/test_retraining_worker.py +17 -0
  111. aether_quant-1.0.0/tests/test_secret_scan.py +63 -0
  112. {aether_quant-0.9.0 → aether_quant-1.0.0}/tests/test_simulated_portfolio.py +64 -0
  113. {aether_quant-0.9.0 → aether_quant-1.0.0}/tests/test_train_multitask.py +207 -0
  114. {aether_quant-0.9.0 → aether_quant-1.0.0}/tests/test_train_ranking_validation.py +211 -0
  115. aether_quant-1.0.0/tests/test_train_select_model_context_columns.py +33 -0
  116. aether_quant-1.0.0/tests/test_train_threshold_and_early_stop.py +94 -0
  117. {aether_quant-0.9.0 → aether_quant-1.0.0}/tests/test_validation_gate.py +39 -0
  118. {aether_quant-0.9.0 → aether_quant-1.0.0}/tests/test_yfinance_backfill.py +79 -0
  119. {aether_quant-0.9.0 → aether_quant-1.0.0}/topology/README.md +34 -0
  120. {aether_quant-0.9.0 → aether_quant-1.0.0}/topology/market_topology.py +74 -27
  121. {aether_quant-0.9.0 → aether_quant-1.0.0}/train.py +364 -21
  122. {aether_quant-0.9.0 → aether_quant-1.0.0}/train_gating.py +11 -4
  123. {aether_quant-0.9.0 → aether_quant-1.0.0}/train_multitask.py +115 -12
  124. {aether_quant-0.9.0 → aether_quant-1.0.0}/train_sequence.py +107 -12
  125. {aether_quant-0.9.0 → aether_quant-1.0.0}/webui/README.md +2 -2
  126. {aether_quant-0.9.0 → aether_quant-1.0.0}/webui/src/api/client.ts +5 -0
  127. {aether_quant-0.9.0 → aether_quant-1.0.0}/webui/src/api/hooks.ts +9 -0
  128. aether_quant-1.0.0/webui/src/components/monitoring/AuditLogPanel.tsx +49 -0
  129. {aether_quant-0.9.0 → aether_quant-1.0.0}/webui/src/pages/Overview.tsx +4 -1
  130. aether_quant-1.0.0/webui/src/types/audit.ts +20 -0
  131. aether_quant-0.9.0/.dockerignore +0 -16
  132. aether_quant-0.9.0/.env.live.example +0 -15
  133. aether_quant-0.9.0/.gitignore +0 -102
  134. aether_quant-0.9.0/Dockerfile +0 -18
  135. aether_quant-0.9.0/Dockerfile.retraining_worker +0 -23
  136. aether_quant-0.9.0/Dockerfile.workers +0 -8
  137. aether_quant-0.9.0/README.md +0 -1036
  138. aether_quant-0.9.0/aether_quant.egg-info/scm_version.json +0 -8
  139. aether_quant-0.9.0/development/Problems.md +0 -1189
  140. aether_quant-0.9.0/development/backtest_equity_chart.png +0 -0
  141. aether_quant-0.9.0/execution/README.md +0 -109
  142. aether_quant-0.9.0/execution/__init__.py +0 -28
  143. aether_quant-0.9.0/execution/order_gate.py +0 -75
  144. aether_quant-0.9.0/ml/gating_feature_schema.json +0 -30
  145. aether_quant-0.9.0/ml/gating_model.json +0 -570
  146. aether_quant-0.9.0/ml/gating_training_metrics.json +0 -130
  147. aether_quant-0.9.0/ml/multitask_feature_schema.json +0 -89
  148. aether_quant-0.9.0/ml/multitask_model.json +0 -8548
  149. aether_quant-0.9.0/ml/multitask_training_metrics.json +0 -6316
  150. aether_quant-0.9.0/ml/sequence_feature_schema.json +0 -90
  151. aether_quant-0.9.0/ml/sequence_model.json +0 -19470
  152. aether_quant-0.9.0/ml/sequence_training_metrics.json +0 -6278
  153. aether_quant-0.9.0/ml/versions/gating-only-05c572c8-9566-4152-805c-fa57142a3f8c/gating_feature_schema.json +0 -30
  154. aether_quant-0.9.0/ml/versions/gating-only-05c572c8-9566-4152-805c-fa57142a3f8c/gating_model.json +0 -570
  155. aether_quant-0.9.0/ml/versions/gating-only-05c572c8-9566-4152-805c-fa57142a3f8c/gating_training_metrics.json +0 -130
  156. aether_quant-0.9.0/ml/versions/gating-only-0cb50d98-39c9-4cde-bcdd-c174bf126426/gating_feature_schema.json +0 -30
  157. aether_quant-0.9.0/ml/versions/gating-only-0cb50d98-39c9-4cde-bcdd-c174bf126426/gating_model.json +0 -570
  158. aether_quant-0.9.0/ml/versions/gating-only-0cb50d98-39c9-4cde-bcdd-c174bf126426/gating_training_metrics.json +0 -130
  159. aether_quant-0.9.0/ml/versions/gating-only-26218402-34d9-4a0a-add8-ee5d50dd0459/gating_feature_schema.json +0 -30
  160. aether_quant-0.9.0/ml/versions/gating-only-26218402-34d9-4a0a-add8-ee5d50dd0459/gating_model.json +0 -570
  161. aether_quant-0.9.0/ml/versions/gating-only-26218402-34d9-4a0a-add8-ee5d50dd0459/gating_training_metrics.json +0 -190
  162. aether_quant-0.9.0/ml/versions/multitask-only-8c59799d-c7f1-40be-9c76-8f5eefdac6d9/multitask_feature_schema.json +0 -89
  163. aether_quant-0.9.0/ml/versions/multitask-only-8c59799d-c7f1-40be-9c76-8f5eefdac6d9/multitask_model.json +0 -8548
  164. aether_quant-0.9.0/ml/versions/multitask-only-8c59799d-c7f1-40be-9c76-8f5eefdac6d9/multitask_training_metrics.json +0 -6316
  165. aether_quant-0.9.0/ml/versions/multitask-only-f5708084-512b-4484-a47b-0720f9c1460c/multitask_feature_schema.json +0 -76
  166. aether_quant-0.9.0/ml/versions/multitask-only-f5708084-512b-4484-a47b-0720f9c1460c/multitask_model.json +0 -7703
  167. aether_quant-0.9.0/ml/versions/multitask-only-f5708084-512b-4484-a47b-0720f9c1460c/multitask_training_metrics.json +0 -6320
  168. aether_quant-0.9.0/ml/versions/sequence-only-d649549b-9527-4e55-b61e-cd1e26cf8ca6/sequence_feature_schema.json +0 -90
  169. aether_quant-0.9.0/ml/versions/sequence-only-d649549b-9527-4e55-b61e-cd1e26cf8ca6/sequence_model.json +0 -19470
  170. aether_quant-0.9.0/ml/versions/sequence-only-d649549b-9527-4e55-b61e-cd1e26cf8ca6/sequence_training_metrics.json +0 -6278
  171. aether_quant-0.9.0/ml/versions/stage123-1783709428/gating_feature_schema.json +0 -30
  172. aether_quant-0.9.0/ml/versions/stage123-1783709428/gating_model.json +0 -570
  173. aether_quant-0.9.0/ml/versions/stage123-1783709428/gating_training_metrics.json +0 -190
  174. aether_quant-0.9.0/ml/versions/stage123-1783709428/multitask_feature_schema.json +0 -52
  175. aether_quant-0.9.0/ml/versions/stage123-1783709428/multitask_model.json +0 -5888
  176. aether_quant-0.9.0/ml/versions/stage123-1783709428/multitask_training_metrics.json +0 -248
  177. aether_quant-0.9.0/ml/versions/stage4-1783711025/gating_feature_schema.json +0 -30
  178. aether_quant-0.9.0/ml/versions/stage4-1783711025/gating_model.json +0 -570
  179. aether_quant-0.9.0/ml/versions/stage4-1783711025/gating_training_metrics.json +0 -190
  180. aether_quant-0.9.0/ml/versions/stage4-1783711025/multitask_feature_schema.json +0 -52
  181. aether_quant-0.9.0/ml/versions/stage4-1783711025/multitask_model.json +0 -5888
  182. aether_quant-0.9.0/ml/versions/stage4-1783711025/multitask_training_metrics.json +0 -248
  183. aether_quant-0.9.0/ml/versions/stage5-1783715333/sequence_feature_schema.json +0 -53
  184. aether_quant-0.9.0/ml/versions/stage5-1783715333/sequence_model.json +0 -13258
  185. aether_quant-0.9.0/ml/versions/stage5-1783715333/sequence_training_metrics.json +0 -209
  186. aether_quant-0.9.0/ml/versions/v1/multitask_feature_schema.json +0 -52
  187. aether_quant-0.9.0/ml/versions/v1/multitask_model.json +0 -5888
  188. aether_quant-0.9.0/ml/versions/v1/multitask_training_metrics.json +0 -284
  189. aether_quant-0.9.0/ml/versions/v1/sequence_feature_schema.json +0 -53
  190. aether_quant-0.9.0/ml/versions/v1/sequence_model.json +0 -13258
  191. aether_quant-0.9.0/ml/versions/v1/sequence_training_metrics.json +0 -248
  192. aether_quant-0.9.0/portfolio/book_construction.py +0 -137
  193. aether_quant-0.9.0/portfolio/options_strategy.py +0 -157
  194. aether_quant-0.9.0/requirements/README.md +0 -24
  195. aether_quant-0.9.0/requirements/requirements-retraining-worker.txt +0 -15
  196. aether_quant-0.9.0/requirements/requirements-runtime.txt +0 -3
  197. aether_quant-0.9.0/requirements/requirements-workers.txt +0 -14
  198. aether_quant-0.9.0/scripts/README.md +0 -32
  199. aether_quant-0.9.0/scripts/profile_inference.py +0 -165
  200. aether_quant-0.9.0/tests/test_asset_class_router.py +0 -117
  201. aether_quant-0.9.0/tests/test_options_strategy.py +0 -201
  202. aether_quant-0.9.0/tests/test_order_gate.py +0 -124
  203. aether_quant-0.9.0/tests/test_portfolio_book_construction.py +0 -175
  204. {aether_quant-0.9.0 → aether_quant-1.0.0}/.env.compose.example +0 -0
  205. {aether_quant-0.9.0 → aether_quant-1.0.0}/.gitattributes +0 -0
  206. {aether_quant-0.9.0 → aether_quant-1.0.0}/.github/workflows/release.yml +0 -0
  207. {aether_quant-0.9.0 → aether_quant-1.0.0}/LICENSE +0 -0
  208. {aether_quant-0.9.0 → aether_quant-1.0.0}/aether_quant.egg-info/dependency_links.txt +0 -0
  209. {aether_quant-0.9.0 → aether_quant-1.0.0}/aether_quant.egg-info/entry_points.txt +0 -0
  210. {aether_quant-0.9.0 → aether_quant-1.0.0}/aether_quant.egg-info/top_level.txt +0 -0
  211. {aether_quant-0.9.0 → aether_quant-1.0.0}/analyzer/README.md +0 -0
  212. {aether_quant-0.9.0 → aether_quant-1.0.0}/analyzer/__init__.py +0 -0
  213. {aether_quant-0.9.0 → aether_quant-1.0.0}/backtests/.gitkeep +0 -0
  214. {aether_quant-0.9.0 → aether_quant-1.0.0}/data/alternative/estimize/consensus/aapl/.keep +0 -0
  215. {aether_quant-0.9.0 → aether_quant-1.0.0}/data/alternative/estimize/estimate/.keep +0 -0
  216. {aether_quant-0.9.0 → aether_quant-1.0.0}/data/alternative/estimize/release/.keep +0 -0
  217. {aether_quant-0.9.0 → aether_quant-1.0.0}/data/alternative/sec/aapl/.keep +0 -0
  218. {aether_quant-0.9.0 → aether_quant-1.0.0}/data/alternative/trading-economics/.keep +0 -0
  219. {aether_quant-0.9.0 → aether_quant-1.0.0}/data/alternative/trading-economics/calendar/.keep +0 -0
  220. {aether_quant-0.9.0 → aether_quant-1.0.0}/data/alternative/trading-economics/earnings/.keep +0 -0
  221. {aether_quant-0.9.0 → aether_quant-1.0.0}/data/alternative/trading-economics/indicator/.keep +0 -0
  222. {aether_quant-0.9.0 → aether_quant-1.0.0}/data_pipeline/__init__.py +0 -0
  223. {aether_quant-0.9.0 → aether_quant-1.0.0}/data_pipeline/fetch.py +0 -0
  224. {aether_quant-0.9.0 → aether_quant-1.0.0}/data_pipeline/fred_backfill.py +0 -0
  225. {aether_quant-0.9.0 → aether_quant-1.0.0}/data_pipeline/ib_backfill.py +0 -0
  226. {aether_quant-0.9.0 → aether_quant-1.0.0}/data_pipeline/v2_manifest.py +0 -0
  227. {aether_quant-0.9.0 → aether_quant-1.0.0}/development/README.md +0 -0
  228. {aether_quant-0.9.0 → aether_quant-1.0.0}/development/logo.png +0 -0
  229. {aether_quant-0.9.0 → aether_quant-1.0.0}/execution/config_cache.py +0 -0
  230. {aether_quant-0.9.0 → aether_quant-1.0.0}/execution/paper_readiness_io.py +0 -0
  231. {aether_quant-0.9.0 → aether_quant-1.0.0}/execution/paper_readiness_report.py +0 -0
  232. {aether_quant-0.9.0 → aether_quant-1.0.0}/execution/paper_readiness_scheduler.py +0 -0
  233. {aether_quant-0.9.0 → aether_quant-1.0.0}/execution/runtime_config_io.py +0 -0
  234. {aether_quant-0.9.0 → aether_quant-1.0.0}/experience/README.md +0 -0
  235. {aether_quant-0.9.0 → aether_quant-1.0.0}/experience/__init__.py +0 -0
  236. {aether_quant-0.9.0 → aether_quant-1.0.0}/experience/observation_metrics.py +0 -0
  237. {aether_quant-0.9.0 → aether_quant-1.0.0}/experience/redis_queue.py +0 -0
  238. {aether_quant-0.9.0 → aether_quant-1.0.0}/experts/README.md +0 -0
  239. {aether_quant-0.9.0 → aether_quant-1.0.0}/experts/__init__.py +0 -0
  240. {aether_quant-0.9.0 → aether_quant-1.0.0}/experts/expert_datasets.py +0 -0
  241. {aether_quant-0.9.0 → aether_quant-1.0.0}/features/README.md +0 -0
  242. {aether_quant-0.9.0 → aether_quant-1.0.0}/features/__init__.py +0 -0
  243. {aether_quant-0.9.0 → aether_quant-1.0.0}/features/derivatives_macro_features.py +0 -0
  244. {aether_quant-0.9.0 → aether_quant-1.0.0}/features/macro_features.py +0 -0
  245. {aether_quant-0.9.0 → aether_quant-1.0.0}/features/options_greeks.py +0 -0
  246. {aether_quant-0.9.0 → aether_quant-1.0.0}/features/technical_indicators.py +0 -0
  247. {aether_quant-0.9.0 → aether_quant-1.0.0}/generate_backtest_report.py +0 -0
  248. {aether_quant-0.9.0 → aether_quant-1.0.0}/liquidity/__init__.py +0 -0
  249. {aether_quant-0.9.0 → aether_quant-1.0.0}/liquidity/market_liquidity.py +0 -0
  250. {aether_quant-0.9.0 → aether_quant-1.0.0}/ml/README.md +0 -0
  251. {aether_quant-0.9.0 → aether_quant-1.0.0}/moe/README.md +0 -0
  252. {aether_quant-0.9.0 → aether_quant-1.0.0}/moe/__init__.py +0 -0
  253. {aether_quant-0.9.0 → aether_quant-1.0.0}/monitoring/README.md +0 -0
  254. {aether_quant-0.9.0 → aether_quant-1.0.0}/monitoring/__init__.py +0 -0
  255. {aether_quant-0.9.0 → aether_quant-1.0.0}/monitoring/neural_network_state.py +0 -0
  256. {aether_quant-0.9.0 → aether_quant-1.0.0}/notifications/__init__.py +0 -0
  257. {aether_quant-0.9.0 → aether_quant-1.0.0}/notifications/postgres_telegram.py +0 -0
  258. {aether_quant-0.9.0 → aether_quant-1.0.0}/notifications/telegram_alerts.py +0 -0
  259. {aether_quant-0.9.0 → aether_quant-1.0.0}/notifications/telegram_client.py +0 -0
  260. {aether_quant-0.9.0 → aether_quant-1.0.0}/notifications/telegram_worker.py +0 -0
  261. {aether_quant-0.9.0 → aether_quant-1.0.0}/performance/README.md +0 -0
  262. {aether_quant-0.9.0 → aether_quant-1.0.0}/performance/__init__.py +0 -0
  263. {aether_quant-0.9.0 → aether_quant-1.0.0}/performance/postgres_triggers.py +0 -0
  264. {aether_quant-0.9.0 → aether_quant-1.0.0}/performance/rank_ic_monitor.py +0 -0
  265. {aether_quant-0.9.0 → aether_quant-1.0.0}/performance/trigger_worker.py +0 -0
  266. {aether_quant-0.9.0 → aether_quant-1.0.0}/performance/triggers.py +0 -0
  267. {aether_quant-0.9.0 → aether_quant-1.0.0}/pyproject.toml +0 -0
  268. {aether_quant-0.9.0 → aether_quant-1.0.0}/regime/README.md +0 -0
  269. {aether_quant-0.9.0 → aether_quant-1.0.0}/regime/__init__.py +0 -0
  270. {aether_quant-0.9.0 → aether_quant-1.0.0}/regime/market_regime.py +0 -0
  271. {aether_quant-0.9.0 → aether_quant-1.0.0}/retraining/README.md +0 -0
  272. {aether_quant-0.9.0 → aether_quant-1.0.0}/retraining/artifacts.py +0 -0
  273. {aether_quant-0.9.0 → aether_quant-1.0.0}/retraining/backtest_gate.py +0 -0
  274. {aether_quant-0.9.0 → aether_quant-1.0.0}/retraining/lean_backtest.py +0 -0
  275. {aether_quant-0.9.0 → aether_quant-1.0.0}/retraining/planning.py +0 -0
  276. {aether_quant-0.9.0 → aether_quant-1.0.0}/retraining/status_export.py +0 -0
  277. {aether_quant-0.9.0 → aether_quant-1.0.0}/retraining/vault_client.py +0 -0
  278. {aether_quant-0.9.0 → aether_quant-1.0.0}/retraining/vault_commands.py +0 -0
  279. {aether_quant-0.9.0 → aether_quant-1.0.0}/risk/__init__.py +0 -0
  280. {aether_quant-0.9.0 → aether_quant-1.0.0}/risk/futures_risk.py +0 -0
  281. {aether_quant-0.9.0 → aether_quant-1.0.0}/risk/manual_override.py +0 -0
  282. {aether_quant-0.9.0 → aether_quant-1.0.0}/risk/position_sizing.py +0 -0
  283. {aether_quant-0.9.0 → aether_quant-1.0.0}/risk_controls.py +0 -0
  284. {aether_quant-0.9.0 → aether_quant-1.0.0}/setup.cfg +0 -0
  285. {aether_quant-0.9.0 → aether_quant-1.0.0}/tests/README.md +0 -0
  286. {aether_quant-0.9.0 → aether_quant-1.0.0}/tests/test_backtest_gate.py +0 -0
  287. {aether_quant-0.9.0 → aether_quant-1.0.0}/tests/test_bond_features.py +0 -0
  288. {aether_quant-0.9.0 → aether_quant-1.0.0}/tests/test_config_cache.py +0 -0
  289. {aether_quant-0.9.0 → aether_quant-1.0.0}/tests/test_derivatives_macro_features.py +0 -0
  290. {aether_quant-0.9.0 → aether_quant-1.0.0}/tests/test_experience_queue.py +0 -0
  291. {aether_quant-0.9.0 → aether_quant-1.0.0}/tests/test_expert_datasets.py +0 -0
  292. {aether_quant-0.9.0 → aether_quant-1.0.0}/tests/test_fetch.py +0 -0
  293. {aether_quant-0.9.0 → aether_quant-1.0.0}/tests/test_fred_backfill.py +0 -0
  294. {aether_quant-0.9.0 → aether_quant-1.0.0}/tests/test_futures_risk.py +0 -0
  295. {aether_quant-0.9.0 → aether_quant-1.0.0}/tests/test_generate_backtest_report.py +0 -0
  296. {aether_quant-0.9.0 → aether_quant-1.0.0}/tests/test_ib_backfill.py +0 -0
  297. {aether_quant-0.9.0 → aether_quant-1.0.0}/tests/test_lean_backtest.py +0 -0
  298. {aether_quant-0.9.0 → aether_quant-1.0.0}/tests/test_learned_topology.py +0 -0
  299. {aether_quant-0.9.0 → aether_quant-1.0.0}/tests/test_macro_features.py +0 -0
  300. {aether_quant-0.9.0 → aether_quant-1.0.0}/tests/test_manual_override.py +0 -0
  301. {aether_quant-0.9.0 → aether_quant-1.0.0}/tests/test_market_liquidity.py +0 -0
  302. {aether_quant-0.9.0 → aether_quant-1.0.0}/tests/test_market_regime.py +0 -0
  303. {aether_quant-0.9.0 → aether_quant-1.0.0}/tests/test_neural_network_state.py +0 -0
  304. {aether_quant-0.9.0 → aether_quant-1.0.0}/tests/test_observation_metrics.py +0 -0
  305. {aether_quant-0.9.0 → aether_quant-1.0.0}/tests/test_options_greeks.py +0 -0
  306. {aether_quant-0.9.0 → aether_quant-1.0.0}/tests/test_paper_readiness_io.py +0 -0
  307. {aether_quant-0.9.0 → aether_quant-1.0.0}/tests/test_paper_readiness_report.py +0 -0
  308. {aether_quant-0.9.0 → aether_quant-1.0.0}/tests/test_paper_readiness_scheduler.py +0 -0
  309. {aether_quant-0.9.0 → aether_quant-1.0.0}/tests/test_position_sizing.py +0 -0
  310. {aether_quant-0.9.0 → aether_quant-1.0.0}/tests/test_postgres_telegram.py +0 -0
  311. {aether_quant-0.9.0 → aether_quant-1.0.0}/tests/test_postgres_triggers.py +0 -0
  312. {aether_quant-0.9.0 → aether_quant-1.0.0}/tests/test_postgres_worker.py +0 -0
  313. {aether_quant-0.9.0 → aether_quant-1.0.0}/tests/test_rank_ic_monitor.py +0 -0
  314. {aether_quant-0.9.0 → aether_quant-1.0.0}/tests/test_retraining_artifacts.py +0 -0
  315. {aether_quant-0.9.0 → aether_quant-1.0.0}/tests/test_retraining_planning.py +0 -0
  316. {aether_quant-0.9.0 → aether_quant-1.0.0}/tests/test_risk_controls.py +0 -0
  317. {aether_quant-0.9.0 → aether_quant-1.0.0}/tests/test_runtime_config_io.py +0 -0
  318. {aether_quant-0.9.0 → aether_quant-1.0.0}/tests/test_status_export.py +0 -0
  319. {aether_quant-0.9.0 → aether_quant-1.0.0}/tests/test_technical_indicators.py +0 -0
  320. {aether_quant-0.9.0 → aether_quant-1.0.0}/tests/test_telegram_alerts.py +0 -0
  321. {aether_quant-0.9.0 → aether_quant-1.0.0}/tests/test_telegram_client.py +0 -0
  322. {aether_quant-0.9.0 → aether_quant-1.0.0}/tests/test_telegram_worker.py +0 -0
  323. {aether_quant-0.9.0 → aether_quant-1.0.0}/tests/test_train_asset_class_context_features.py +0 -0
  324. {aether_quant-0.9.0 → aether_quant-1.0.0}/tests/test_train_bond_features.py +0 -0
  325. {aether_quant-0.9.0 → aether_quant-1.0.0}/tests/test_train_cross_sectional_features.py +0 -0
  326. {aether_quant-0.9.0 → aether_quant-1.0.0}/tests/test_train_derivatives_macro_features.py +0 -0
  327. {aether_quant-0.9.0 → aether_quant-1.0.0}/tests/test_train_gating.py +0 -0
  328. {aether_quant-0.9.0 → aether_quant-1.0.0}/tests/test_train_indicators.py +0 -0
  329. {aether_quant-0.9.0 → aether_quant-1.0.0}/tests/test_train_macro_features.py +0 -0
  330. {aether_quant-0.9.0 → aether_quant-1.0.0}/tests/test_train_multitask_architecture.py +0 -0
  331. {aether_quant-0.9.0 → aether_quant-1.0.0}/tests/test_train_pipeline.py +0 -0
  332. {aether_quant-0.9.0 → aether_quant-1.0.0}/tests/test_train_sequence.py +0 -0
  333. {aether_quant-0.9.0 → aether_quant-1.0.0}/tests/test_train_sequence_architecture.py +0 -0
  334. {aether_quant-0.9.0 → aether_quant-1.0.0}/tests/test_train_topology.py +0 -0
  335. {aether_quant-0.9.0 → aether_quant-1.0.0}/tests/test_train_walk_forward_windows.py +0 -0
  336. {aether_quant-0.9.0 → aether_quant-1.0.0}/tests/test_trigger_worker.py +0 -0
  337. {aether_quant-0.9.0 → aether_quant-1.0.0}/tests/test_triggers.py +0 -0
  338. {aether_quant-0.9.0 → aether_quant-1.0.0}/tests/test_v2_pipeline_manifest.py +0 -0
  339. {aether_quant-0.9.0 → aether_quant-1.0.0}/tests/test_vault_client.py +0 -0
  340. {aether_quant-0.9.0 → aether_quant-1.0.0}/tests/test_vault_commands.py +0 -0
  341. {aether_quant-0.9.0 → aether_quant-1.0.0}/topology/__init__.py +0 -0
  342. {aether_quant-0.9.0 → aether_quant-1.0.0}/topology/learned_topology.py +0 -0
  343. {aether_quant-0.9.0 → aether_quant-1.0.0}/train_topology.py +0 -0
  344. {aether_quant-0.9.0 → aether_quant-1.0.0}/visualization/README.md +0 -0
  345. {aether_quant-0.9.0 → aether_quant-1.0.0}/webui/.gitignore +0 -0
  346. {aether_quant-0.9.0 → aether_quant-1.0.0}/webui/.oxlintrc.json +0 -0
  347. {aether_quant-0.9.0 → aether_quant-1.0.0}/webui/index.html +0 -0
  348. {aether_quant-0.9.0 → aether_quant-1.0.0}/webui/overview_v2_12.png +0 -0
  349. {aether_quant-0.9.0 → aether_quant-1.0.0}/webui/package-lock.json +0 -0
  350. {aether_quant-0.9.0 → aether_quant-1.0.0}/webui/package.json +0 -0
  351. {aether_quant-0.9.0 → aether_quant-1.0.0}/webui/public/favicon.svg +0 -0
  352. {aether_quant-0.9.0 → aether_quant-1.0.0}/webui/public/icons.svg +0 -0
  353. {aether_quant-0.9.0 → aether_quant-1.0.0}/webui/risk_v2_12.png +0 -0
  354. {aether_quant-0.9.0 → aether_quant-1.0.0}/webui/src/App.tsx +0 -0
  355. {aether_quant-0.9.0 → aether_quant-1.0.0}/webui/src/components/heatmap/AssetHeatmap.tsx +0 -0
  356. {aether_quant-0.9.0 → aether_quant-1.0.0}/webui/src/components/layout/AppShell.tsx +0 -0
  357. {aether_quant-0.9.0 → aether_quant-1.0.0}/webui/src/components/layout/Panel.tsx +0 -0
  358. {aether_quant-0.9.0 → aether_quant-1.0.0}/webui/src/components/monitoring/AssetsStatusPanel.tsx +0 -0
  359. {aether_quant-0.9.0 → aether_quant-1.0.0}/webui/src/components/monitoring/CountTable.tsx +0 -0
  360. {aether_quant-0.9.0 → aether_quant-1.0.0}/webui/src/components/monitoring/MonitoringFeeds.tsx +0 -0
  361. {aether_quant-0.9.0 → aether_quant-1.0.0}/webui/src/components/monitoring/ObservationPanel.tsx +0 -0
  362. {aether_quant-0.9.0 → aether_quant-1.0.0}/webui/src/components/monitoring/PaperReadinessPanel.tsx +0 -0
  363. {aether_quant-0.9.0 → aether_quant-1.0.0}/webui/src/components/monitoring/PerformanceTriggersPanel.tsx +0 -0
  364. {aether_quant-0.9.0 → aether_quant-1.0.0}/webui/src/components/monitoring/RawStateViewer.tsx +0 -0
  365. {aether_quant-0.9.0 → aether_quant-1.0.0}/webui/src/components/monitoring/RetrainingStatusPanel.tsx +0 -0
  366. {aether_quant-0.9.0 → aether_quant-1.0.0}/webui/src/components/neuralnet/NeuralNetworkScene3D.tsx +0 -0
  367. {aether_quant-0.9.0 → aether_quant-1.0.0}/webui/src/components/neuralnet/NeuralNetworkStatsPanel.tsx +0 -0
  368. {aether_quant-0.9.0 → aether_quant-1.0.0}/webui/src/components/risk/AssetSizingTable.tsx +0 -0
  369. {aether_quant-0.9.0 → aether_quant-1.0.0}/webui/src/components/risk/DerivativesMacroPanel.tsx +0 -0
  370. {aether_quant-0.9.0 → aether_quant-1.0.0}/webui/src/components/risk/LiquidityTable.tsx +0 -0
  371. {aether_quant-0.9.0 → aether_quant-1.0.0}/webui/src/components/risk/RiskBar.tsx +0 -0
  372. {aether_quant-0.9.0 → aether_quant-1.0.0}/webui/src/components/risk/RiskCore.tsx +0 -0
  373. {aether_quant-0.9.0 → aether_quant-1.0.0}/webui/src/components/risk/StrategyRiskCards.tsx +0 -0
  374. {aether_quant-0.9.0 → aether_quant-1.0.0}/webui/src/components/scene3d/Scene3D.tsx +0 -0
  375. {aether_quant-0.9.0 → aether_quant-1.0.0}/webui/src/components/scorecards/Scorecards.tsx +0 -0
  376. {aether_quant-0.9.0 → aether_quant-1.0.0}/webui/src/components/signals/Badge.tsx +0 -0
  377. {aether_quant-0.9.0 → aether_quant-1.0.0}/webui/src/components/signals/PositionsList.tsx +0 -0
  378. {aether_quant-0.9.0 → aether_quant-1.0.0}/webui/src/components/signals/SignalBoard.tsx +0 -0
  379. {aether_quant-0.9.0 → aether_quant-1.0.0}/webui/src/components/topology/ClusterList.tsx +0 -0
  380. {aether_quant-0.9.0 → aether_quant-1.0.0}/webui/src/components/topology/TopologyLearningPanel.tsx +0 -0
  381. {aether_quant-0.9.0 → aether_quant-1.0.0}/webui/src/components/topology/TopologyScene3D.tsx +0 -0
  382. {aether_quant-0.9.0 → aether_quant-1.0.0}/webui/src/components/tracing/AssetPerformancePanel.tsx +0 -0
  383. {aether_quant-0.9.0 → aether_quant-1.0.0}/webui/src/components/tracing/BacktestEquityPanel.tsx +0 -0
  384. {aether_quant-0.9.0 → aether_quant-1.0.0}/webui/src/components/tracing/DivergingBarChart.tsx +0 -0
  385. {aether_quant-0.9.0 → aether_quant-1.0.0}/webui/src/components/tracing/LineChart.tsx +0 -0
  386. {aether_quant-0.9.0 → aether_quant-1.0.0}/webui/src/components/tracing/MetricsSnapshotPanel.tsx +0 -0
  387. {aether_quant-0.9.0 → aether_quant-1.0.0}/webui/src/components/tracing/ObservationEquityPanel.tsx +0 -0
  388. {aether_quant-0.9.0 → aether_quant-1.0.0}/webui/src/index.css +0 -0
  389. {aether_quant-0.9.0 → aether_quant-1.0.0}/webui/src/lib/downsample.ts +0 -0
  390. {aether_quant-0.9.0 → aether_quant-1.0.0}/webui/src/lib/format.ts +0 -0
  391. {aether_quant-0.9.0 → aether_quant-1.0.0}/webui/src/main.tsx +0 -0
  392. {aether_quant-0.9.0 → aether_quant-1.0.0}/webui/src/pages/NeuralNetworkPage.tsx +0 -0
  393. {aether_quant-0.9.0 → aether_quant-1.0.0}/webui/src/pages/RiskPage.tsx +0 -0
  394. {aether_quant-0.9.0 → aether_quant-1.0.0}/webui/src/pages/TopologyPage.tsx +0 -0
  395. {aether_quant-0.9.0 → aether_quant-1.0.0}/webui/src/pages/TracingPage.tsx +0 -0
  396. {aether_quant-0.9.0 → aether_quant-1.0.0}/webui/src/types/state.ts +0 -0
  397. {aether_quant-0.9.0 → aether_quant-1.0.0}/webui/src/types/tracing.ts +0 -0
  398. {aether_quant-0.9.0 → aether_quant-1.0.0}/webui/tsconfig.app.json +0 -0
  399. {aether_quant-0.9.0 → aether_quant-1.0.0}/webui/tsconfig.json +0 -0
  400. {aether_quant-0.9.0 → aether_quant-1.0.0}/webui/tsconfig.node.json +0 -0
  401. {aether_quant-0.9.0 → aether_quant-1.0.0}/webui/vite.config.ts +0 -0
@@ -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,39 @@
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
@@ -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,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
@@ -20,8 +20,11 @@ jobs:
20
20
 
21
21
  - name: Run tests
22
22
  run: pytest
23
- # tests/test_lean_backtest_ml_coverage.py self-skips: it requires the
24
- # QuantConnect Lean CLI, which GitHub-hosted runners don't have.
23
+ # tests/test_lean_backtest_ml_coverage.py self-skips: this runner
24
+ # does have the `lean` binary (installed via requirements-dev.txt),
25
+ # but not a usable local Lean Data folder (data/** is gitignored -
26
+ # see .gitignore) that a real `lean backtest .` needs just to boot,
27
+ # regardless of universe/config. See development/Problems.md#10.
25
28
 
26
29
  webui:
27
30
  runs-on: ubuntu-latest
@@ -0,0 +1,153 @@
1
+ # Python cache and virtual environments
2
+ __pycache__/
3
+ *.py[cod]
4
+ *$py.class
5
+ .pytest_cache/
6
+ .mypy_cache/
7
+ .ruff_cache/
8
+ .venv/
9
+ venv/
10
+ env/
11
+ *.egg-info/
12
+ /dist/
13
+ /build/
14
+
15
+ # Local secrets and broker/API credentials
16
+ .env
17
+ .env.*
18
+ !.env.compose.example
19
+ !.env.live.example
20
+ ib_config.py
21
+ *_config.local.py
22
+ config.local.json
23
+ lean.local.json
24
+ # Rendered, secret-bearing Lean config produced by
25
+ # scripts/render_lean_credentials.py / `aq render-lean-config` from .env.live.
26
+ # The tracked lean.json stays all-empty; this is the copy with real keys filled.
27
+ lean.live.json
28
+
29
+ *.key
30
+ *.pem
31
+
32
+ # OS/editor noise
33
+ .DS_Store
34
+ Thumbs.db
35
+ .idea/
36
+ .vscode/
37
+ .claude/
38
+ docker-compose.override.yml
39
+ postgres-data/
40
+ redis-data/
41
+ grafana-data/
42
+ pgdata/
43
+
44
+ # Lean market data: too large for a public GitHub repo
45
+ data/**
46
+ !data/**/
47
+ !data/**/.keep
48
+ !data/**/.gitkeep
49
+
50
+ # Exception: small, hand-authored reference/config JSON files that this
51
+ # codebase documents as "checked in" and reads at runtime/test time (not
52
+ # bulk market data) - see tests/test_futures_risk.py, tests/test_ib_backfill.py,
53
+ # tests/test_train_cross_sectional_features.py, and development/Problems.md#10.
54
+ # The blanket data/** rule above silently excluded these from every fresh
55
+ # clone (including CI), which is why the tests reading them failed there.
56
+ !data/reference/*.json
57
+
58
+ # Lean object store / local runtime output
59
+ storage/
60
+ objectstore/
61
+
62
+ # Backtest results and generated reports
63
+ backtests/**
64
+ !backtests/
65
+ !backtests/.gitkeep
66
+
67
+ # Generated ML datasets and binary artifacts
68
+ ml/datasets/
69
+ ml/expert_datasets/
70
+ ml/expert_models/
71
+ ml/versions/
72
+ # Manual pre-rank-pivot snapshot (rollback point for the Stage 1-5
73
+ # rank-pivot roadmap work, development/Problems.md#43) - a local backup,
74
+ # never meant to be committed.
75
+ ml/_backup_pre_rank_pivot/
76
+ ml/model.pt
77
+ ml/scaler.pkl
78
+ ml/*.pkl
79
+ ml/*.pt
80
+ ml/*.pth
81
+ ml/*.onnx
82
+
83
+ # Generated ML/runtime JSON artifacts
84
+ ml/dataset_inventory.json
85
+ ml/dataset_manifest.json
86
+ ml/expert_dataset_manifest.json
87
+ ml/feature_schema.json
88
+ ml/model_weights.json
89
+ ml/scaler_stats.json
90
+ ml/training_metrics.json
91
+ ml/expert_training_metrics.json
92
+ # Multitask/sequence/gating model artifacts - these were previously tracked
93
+ # (an inconsistency with every other generated model artifact above, which
94
+ # was already gitignored), so a real trained model's weights could end up
95
+ # committed to the public repo. Untracked via `git rm --cached` alongside
96
+ # this rule so it's actually impossible, not just something to remember.
97
+ ml/multitask_model.json
98
+ ml/multitask_feature_schema.json
99
+ ml/multitask_training_metrics.json
100
+ ml/sequence_model.json
101
+ ml/sequence_feature_schema.json
102
+ ml/sequence_training_metrics.json
103
+ ml/gating_model.json
104
+ ml/gating_feature_schema.json
105
+ ml/gating_training_metrics.json
106
+
107
+ # Generated visualization/runtime feeds
108
+ visualization/state.json
109
+ visualization/scene.json
110
+ visualization/topology_state.json
111
+ visualization/grafana/
112
+
113
+ # Logs and temporary files
114
+ .coverage
115
+ coverage.xml
116
+ htmlcov/
117
+ *.log
118
+ *.tmp
119
+ *.bak
120
+ # Obsidian vault for project graphs and AI handoffs
121
+ Aether-quant-Obsidian-Vault/
122
+
123
+ # Webui (React/Vite) build artifacts and dependencies
124
+ webui/node_modules/
125
+ webui/dist/
126
+
127
+ # Matplotlib font cache, redirected here by main.py so it persists across
128
+ # Lean CLI's ephemeral per-backtest Docker containers instead of rebuilding
129
+ # every run (see Problems.md)
130
+ .matplotlib_cache/
131
+
132
+ # scripts/profile_inference.py's pstats dump - regenerable output, not source
133
+ scripts/profile_inference_output*.txt
134
+ scripts/profile_subsystems_output*.txt
135
+
136
+ # cpp_inference_ext/'s compiled build artifacts - regenerable via
137
+ # `pip install -e cpp_inference_ext/`, never source. The .pyd itself is
138
+ # also gitignored (never a hard dependency - the whole point is that
139
+ # most checkouts run without it, falling back to NumPy).
140
+ cpp_inference_ext/build/
141
+ cpp_inference_ext/*.egg-info/
142
+ cpp_inference_ext/*.pyd
143
+ cpp_inference_ext/*.so
144
+ cpp_inference_ext/install_log*.txt
145
+
146
+ # Aether-Vault (`av` CLI) local repo bootstrap - machine-local tool state
147
+ # (retraining/vault_client.py's commit target), not project source.
148
+ .av/
149
+
150
+ # scripts/profile_subsystems.py's main.py::_build_model_input() profiling
151
+ # side-channel log (development/Problems.md #36) - regenerable diagnostic
152
+ # output, not source.
153
+ model_input_timing.log
@@ -0,0 +1,29 @@
1
+ # Stage 1: build webui
2
+ FROM node:20-alpine AS webui-builder
3
+ WORKDIR /app/webui
4
+ COPY webui/package*.json ./
5
+ RUN npm ci
6
+ COPY webui/ .
7
+ RUN npm run build
8
+
9
+ # Stage 2: consolidated engine image - serves the FastAPI app AND every
10
+ # worker (experience/performance-trigger/telegram/paper-readiness/
11
+ # retraining). One image, one COPY of the whole source tree (respecting
12
+ # .dockerignore's exclusions - .venv/, node_modules/, data/, ml/,
13
+ # backtests/, etc., which arrive at runtime via compose volume mounts
14
+ # instead) rather than a hand-maintained per-worker COPY allow-list.
15
+ # This is the direct fix for development/Problems.md #1/#2/#20/#30 - four
16
+ # separate incidents where a per-worker Dockerfile's COPY list drifted out
17
+ # of sync with that worker's actual import graph and crash-looped on
18
+ # ModuleNotFoundError. With one image copying everything, that whole bug
19
+ # class is structurally impossible now. Each service's actual entrypoint
20
+ # is selected via docker-compose.yml's per-service `command:` override
21
+ # (CMD below is just the default/app entrypoint).
22
+ FROM python:3.11-slim
23
+ WORKDIR /app
24
+ COPY requirements/requirements.txt ./requirements/
25
+ RUN pip install --no-cache-dir -r requirements/requirements.txt
26
+ COPY . .
27
+ COPY --from=webui-builder /app/webui/dist ./webui/dist
28
+ EXPOSE 8000
29
+ CMD ["uvicorn", "monitoring.api_server:app", "--host", "0.0.0.0", "--port", "8000"]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: aether-quant
3
- Version: 0.9.0
3
+ Version: 1.0.0
4
4
  Summary: Aether Quant convenience CLI
5
5
  Requires-Python: >=3.10
6
6
  License-File: LICENSE