quantred 2.4.0__tar.gz → 2.4.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (335) hide show
  1. {quantred-2.4.0 → quantred-2.4.1}/.github/workflows/docs.yml +2 -2
  2. {quantred-2.4.0 → quantred-2.4.1}/.github/workflows/release.yml +3 -3
  3. {quantred-2.4.0 → quantred-2.4.1}/PKG-INFO +20 -20
  4. {quantred-2.4.0 → quantred-2.4.1}/README.md +16 -16
  5. {quantred-2.4.0 → quantred-2.4.1}/docker-compose.yml +10 -2
  6. {quantred-2.4.0 → quantred-2.4.1}/docs/content/changelog.md +18 -0
  7. {quantred-2.4.0 → quantred-2.4.1}/docs/content/usage/docker.md +9 -0
  8. {quantred-2.4.0 → quantred-2.4.1}/docs/content/usage/first-run.md +2 -2
  9. {quantred-2.4.0 → quantred-2.4.1}/docs/content/usage/migrating-to-quantred.md +4 -2
  10. {quantred-2.4.0 → quantred-2.4.1}/docs/docusaurus.config.js +1 -1
  11. {quantred-2.4.0 → quantred-2.4.1}/docs/package-lock.json +2 -2
  12. {quantred-2.4.0 → quantred-2.4.1}/docs/package.json +1 -1
  13. quantred-2.4.1/docs/wrangler.jsonc +19 -0
  14. {quantred-2.4.0 → quantred-2.4.1}/example/README.md +4 -4
  15. {quantred-2.4.0 → quantred-2.4.1}/pyproject.toml +5 -5
  16. {quantred-2.4.0 → quantred-2.4.1}/quantred/__init__.py +1 -1
  17. {quantred-2.4.0 → quantred-2.4.1}/quantred/services/registry.py +18 -5
  18. {quantred-2.4.0 → quantred-2.4.1}/quantred/settings.py +1 -1
  19. {quantred-2.4.0 → quantred-2.4.1}/scripts/compose_smoke.sh +2 -0
  20. {quantred-2.4.0 → quantred-2.4.1}/tests/test_cli_name.py +1 -1
  21. {quantred-2.4.0 → quantred-2.4.1}/tests/test_extension_registry.py +50 -3
  22. {quantred-2.4.0 → quantred-2.4.1}/tests/test_release_order.py +1 -1
  23. {quantred-2.4.0 → quantred-2.4.1}/tests/test_transition_package.py +1 -1
  24. quantred-2.4.0/docs/wrangler.jsonc +0 -14
  25. {quantred-2.4.0 → quantred-2.4.1}/.dockerignore +0 -0
  26. {quantred-2.4.0 → quantred-2.4.1}/.env.example +0 -0
  27. {quantred-2.4.0 → quantred-2.4.1}/.github/pull_request_template.md +0 -0
  28. {quantred-2.4.0 → quantred-2.4.1}/.github/scripts/require_published_dependency.py +0 -0
  29. {quantred-2.4.0 → quantred-2.4.1}/.github/workflows/ci.yml +0 -0
  30. {quantred-2.4.0 → quantred-2.4.1}/.gitignore +0 -0
  31. {quantred-2.4.0 → quantred-2.4.1}/.gitleaksignore +0 -0
  32. {quantred-2.4.0 → quantred-2.4.1}/.nvmrc +0 -0
  33. {quantred-2.4.0 → quantred-2.4.1}/AGENTS.md +0 -0
  34. {quantred-2.4.0 → quantred-2.4.1}/CLAUDE.md +0 -0
  35. {quantred-2.4.0 → quantred-2.4.1}/CONTRIBUTING.md +0 -0
  36. {quantred-2.4.0 → quantred-2.4.1}/Dockerfile +0 -0
  37. {quantred-2.4.0 → quantred-2.4.1}/LICENSE +0 -0
  38. {quantred-2.4.0 → quantred-2.4.1}/Makefile +0 -0
  39. {quantred-2.4.0 → quantred-2.4.1}/conftest.py +0 -0
  40. {quantred-2.4.0 → quantred-2.4.1}/docs/.nvmrc +0 -0
  41. {quantred-2.4.0 → quantred-2.4.1}/docs/content/engineering/alphas.md +0 -0
  42. {quantred-2.4.0 → quantred-2.4.1}/docs/content/engineering/architecture.md +0 -0
  43. {quantred-2.4.0 → quantred-2.4.1}/docs/content/engineering/attribution.md +0 -0
  44. {quantred-2.4.0 → quantred-2.4.1}/docs/content/engineering/broker-abstraction.md +0 -0
  45. {quantred-2.4.0 → quantred-2.4.1}/docs/content/engineering/coding-standards.md +0 -0
  46. {quantred-2.4.0 → quantred-2.4.1}/docs/content/engineering/data-flow.md +0 -0
  47. {quantred-2.4.0 → quantred-2.4.1}/docs/content/engineering/data-panel.md +0 -0
  48. {quantred-2.4.0 → quantred-2.4.1}/docs/content/engineering/embedding.md +0 -0
  49. {quantred-2.4.0 → quantred-2.4.1}/docs/content/engineering/engine.md +0 -0
  50. {quantred-2.4.0 → quantred-2.4.1}/docs/content/engineering/evaluation-metrics.md +0 -0
  51. {quantred-2.4.0 → quantred-2.4.1}/docs/content/engineering/extending.md +0 -0
  52. {quantred-2.4.0 → quantred-2.4.1}/docs/content/engineering/indicators.md +0 -0
  53. {quantred-2.4.0 → quantred-2.4.1}/docs/content/engineering/information-analysis.md +0 -0
  54. {quantred-2.4.0 → quantred-2.4.1}/docs/content/engineering/information-horizon.md +0 -0
  55. {quantred-2.4.0 → quantred-2.4.1}/docs/content/engineering/mcp-server.md +0 -0
  56. {quantred-2.4.0 → quantred-2.4.1}/docs/content/engineering/multi-period-trading.md +0 -0
  57. {quantred-2.4.0 → quantred-2.4.1}/docs/content/engineering/multi-signal.md +0 -0
  58. {quantred-2.4.0 → quantred-2.4.1}/docs/content/engineering/optimization.md +0 -0
  59. {quantred-2.4.0 → quantred-2.4.1}/docs/content/engineering/philosophy.md +0 -0
  60. {quantred-2.4.0 → quantred-2.4.1}/docs/content/engineering/portfolio-construction.md +0 -0
  61. {quantred-2.4.0 → quantred-2.4.1}/docs/content/engineering/portfolio.md +0 -0
  62. {quantred-2.4.0 → quantred-2.4.1}/docs/content/engineering/research-agent.md +0 -0
  63. {quantred-2.4.0 → quantred-2.4.1}/docs/content/engineering/risk-model.md +0 -0
  64. {quantred-2.4.0 → quantred-2.4.1}/docs/content/engineering/scanners.md +0 -0
  65. {quantred-2.4.0 → quantred-2.4.1}/docs/content/engineering/separation-of-concerns.md +0 -0
  66. {quantred-2.4.0 → quantred-2.4.1}/docs/content/engineering/strategies.md +0 -0
  67. {quantred-2.4.0 → quantred-2.4.1}/docs/content/engineering/testing.md +0 -0
  68. {quantred-2.4.0 → quantred-2.4.1}/docs/content/engineering/transaction-costs.md +0 -0
  69. {quantred-2.4.0 → quantred-2.4.1}/docs/content/engineering/verdict.md +0 -0
  70. {quantred-2.4.0 → quantred-2.4.1}/docs/content/engineering/walk-forward.md +0 -0
  71. {quantred-2.4.0 → quantred-2.4.1}/docs/content/intro.md +0 -0
  72. {quantred-2.4.0 → quantred-2.4.1}/docs/content/usage/agents.md +0 -0
  73. {quantred-2.4.0 → quantred-2.4.1}/docs/content/usage/alphas.md +0 -0
  74. {quantred-2.4.0 → quantred-2.4.1}/docs/content/usage/backtesting.md +0 -0
  75. {quantred-2.4.0 → quantred-2.4.1}/docs/content/usage/brokers.md +0 -0
  76. {quantred-2.4.0 → quantred-2.4.1}/docs/content/usage/configuration.md +0 -0
  77. {quantred-2.4.0 → quantred-2.4.1}/docs/content/usage/extras.md +0 -0
  78. {quantred-2.4.0 → quantred-2.4.1}/docs/content/usage/getting-started.md +0 -0
  79. {quantred-2.4.0 → quantred-2.4.1}/docs/content/usage/horizon.md +0 -0
  80. {quantred-2.4.0 → quantred-2.4.1}/docs/content/usage/html-reports.md +0 -0
  81. {quantred-2.4.0 → quantred-2.4.1}/docs/content/usage/information.md +0 -0
  82. {quantred-2.4.0 → quantred-2.4.1}/docs/content/usage/installation.md +0 -0
  83. {quantred-2.4.0 → quantred-2.4.1}/docs/content/usage/live-trading.md +0 -0
  84. {quantred-2.4.0 → quantred-2.4.1}/docs/content/usage/optimization.md +0 -0
  85. {quantred-2.4.0 → quantred-2.4.1}/docs/content/usage/portfolio.md +0 -0
  86. {quantred-2.4.0 → quantred-2.4.1}/docs/content/usage/private-strategies.md +0 -0
  87. {quantred-2.4.0 → quantred-2.4.1}/docs/content/usage/risk.md +0 -0
  88. {quantred-2.4.0 → quantred-2.4.1}/docs/content/usage/run-configs.md +0 -0
  89. {quantred-2.4.0 → quantred-2.4.1}/docs/content/usage/scanning.md +0 -0
  90. {quantred-2.4.0 → quantred-2.4.1}/docs/content/usage/screening.md +0 -0
  91. {quantred-2.4.0 → quantred-2.4.1}/docs/content/usage/stopping.md +0 -0
  92. {quantred-2.4.0 → quantred-2.4.1}/docs/content/usage/trials.md +0 -0
  93. {quantred-2.4.0 → quantred-2.4.1}/docs/content/usage/validation-diagnostics.md +0 -0
  94. {quantred-2.4.0 → quantred-2.4.1}/docs/content/usage/verdict.md +0 -0
  95. {quantred-2.4.0 → quantred-2.4.1}/docs/content/usage/walk-forward.md +0 -0
  96. {quantred-2.4.0 → quantred-2.4.1}/docs/sidebars.js +0 -0
  97. {quantred-2.4.0 → quantred-2.4.1}/docs/src/css/custom.css +0 -0
  98. {quantred-2.4.0 → quantred-2.4.1}/docs/static/.gitkeep +0 -0
  99. {quantred-2.4.0 → quantred-2.4.1}/docs/static/img/demo.png +0 -0
  100. {quantred-2.4.0 → quantred-2.4.1}/example/.gitignore +0 -0
  101. {quantred-2.4.0 → quantred-2.4.1}/example/configs/breakout.json +0 -0
  102. {quantred-2.4.0 → quantred-2.4.1}/example/configs/reversion_longshort.json +0 -0
  103. {quantred-2.4.0 → quantred-2.4.1}/example/my_signals/__init__.py +0 -0
  104. {quantred-2.4.0 → quantred-2.4.1}/example/my_signals/scanners/__init__.py +0 -0
  105. {quantred-2.4.0 → quantred-2.4.1}/example/my_signals/scanners/liquidity.py +0 -0
  106. {quantred-2.4.0 → quantred-2.4.1}/example/my_signals/strategies/__init__.py +0 -0
  107. {quantred-2.4.0 → quantred-2.4.1}/example/my_signals/strategies/breakout.py +0 -0
  108. {quantred-2.4.0 → quantred-2.4.1}/example/my_signals/strategies/pairs_reversion.py +0 -0
  109. {quantred-2.4.0 → quantred-2.4.1}/example/pyproject.toml +0 -0
  110. {quantred-2.4.0 → quantred-2.4.1}/main.py +0 -0
  111. {quantred-2.4.0 → quantred-2.4.1}/quantred/alphas/__init__.py +0 -0
  112. {quantred-2.4.0 → quantred-2.4.1}/quantred/alphas/base.py +0 -0
  113. {quantred-2.4.0 → quantred-2.4.1}/quantred/alphas/combine.py +0 -0
  114. {quantred-2.4.0 → quantred-2.4.1}/quantred/alphas/horizon.py +0 -0
  115. {quantred-2.4.0 → quantred-2.4.1}/quantred/alphas/refine.py +0 -0
  116. {quantred-2.4.0 → quantred-2.4.1}/quantred/alphas/scorers.py +0 -0
  117. {quantred-2.4.0 → quantred-2.4.1}/quantred/analytics/attribution.py +0 -0
  118. {quantred-2.4.0 → quantred-2.4.1}/quantred/analytics/bootstrap.py +0 -0
  119. {quantred-2.4.0 → quantred-2.4.1}/quantred/analytics/charts.py +0 -0
  120. {quantred-2.4.0 → quantred-2.4.1}/quantred/analytics/excursion.py +0 -0
  121. {quantred-2.4.0 → quantred-2.4.1}/quantred/analytics/execution_quality.py +0 -0
  122. {quantred-2.4.0 → quantred-2.4.1}/quantred/analytics/exposure.py +0 -0
  123. {quantred-2.4.0 → quantred-2.4.1}/quantred/analytics/htmlreport.py +0 -0
  124. {quantred-2.4.0 → quantred-2.4.1}/quantred/analytics/information.py +0 -0
  125. {quantred-2.4.0 → quantred-2.4.1}/quantred/analytics/metrics.py +0 -0
  126. {quantred-2.4.0 → quantred-2.4.1}/quantred/analytics/performance.py +0 -0
  127. {quantred-2.4.0 → quantred-2.4.1}/quantred/analytics/reporting.py +0 -0
  128. {quantred-2.4.0 → quantred-2.4.1}/quantred/analytics/screening.py +0 -0
  129. {quantred-2.4.0 → quantred-2.4.1}/quantred/analytics/series_comparison.py +0 -0
  130. {quantred-2.4.0 → quantred-2.4.1}/quantred/analytics/trade_analytics.py +0 -0
  131. {quantred-2.4.0 → quantred-2.4.1}/quantred/brokers/alpaca/broker.py +0 -0
  132. {quantred-2.4.0 → quantred-2.4.1}/quantred/brokers/alpaca/factory.py +0 -0
  133. {quantred-2.4.0 → quantred-2.4.1}/quantred/brokers/alpaca/market_data.py +0 -0
  134. {quantred-2.4.0 → quantred-2.4.1}/quantred/brokers/base.py +0 -0
  135. {quantred-2.4.0 → quantred-2.4.1}/quantred/brokers/dryrun.py +0 -0
  136. {quantred-2.4.0 → quantred-2.4.1}/quantred/brokers/errors.py +0 -0
  137. {quantred-2.4.0 → quantred-2.4.1}/quantred/cli.py +0 -0
  138. {quantred-2.4.0 → quantred-2.4.1}/quantred/costs/__init__.py +0 -0
  139. {quantred-2.4.0 → quantred-2.4.1}/quantred/costs/base.py +0 -0
  140. {quantred-2.4.0 → quantred-2.4.1}/quantred/costs/parametric.py +0 -0
  141. {quantred-2.4.0 → quantred-2.4.1}/quantred/data/__init__.py +0 -0
  142. {quantred-2.4.0 → quantred-2.4.1}/quantred/data/compute.py +0 -0
  143. {quantred-2.4.0 → quantred-2.4.1}/quantred/data/edges.py +0 -0
  144. {quantred-2.4.0 → quantred-2.4.1}/quantred/data/features.py +0 -0
  145. {quantred-2.4.0 → quantred-2.4.1}/quantred/data/panel.py +0 -0
  146. {quantred-2.4.0 → quantred-2.4.1}/quantred/data/scan.py +0 -0
  147. {quantred-2.4.0 → quantred-2.4.1}/quantred/data/store.py +0 -0
  148. {quantred-2.4.0 → quantred-2.4.1}/quantred/demo/__init__.py +0 -0
  149. {quantred-2.4.0 → quantred-2.4.1}/quantred/demo/scanners.py +0 -0
  150. {quantred-2.4.0 → quantred-2.4.1}/quantred/demo/strategies.py +0 -0
  151. {quantred-2.4.0 → quantred-2.4.1}/quantred/engine/backtest.py +0 -0
  152. {quantred-2.4.0 → quantred-2.4.1}/quantred/engine/barcheck.py +0 -0
  153. {quantred-2.4.0 → quantred-2.4.1}/quantred/engine/live.py +0 -0
  154. {quantred-2.4.0 → quantred-2.4.1}/quantred/execution/decision.py +0 -0
  155. {quantred-2.4.0 → quantred-2.4.1}/quantred/execution/flatten.py +0 -0
  156. {quantred-2.4.0 → quantred-2.4.1}/quantred/execution/halt.py +0 -0
  157. {quantred-2.4.0 → quantred-2.4.1}/quantred/execution/ledger.py +0 -0
  158. {quantred-2.4.0 → quantred-2.4.1}/quantred/execution/live_trader.py +0 -0
  159. {quantred-2.4.0 → quantred-2.4.1}/quantred/execution/order_id.py +0 -0
  160. {quantred-2.4.0 → quantred-2.4.1}/quantred/execution/sizing.py +0 -0
  161. {quantred-2.4.0 → quantred-2.4.1}/quantred/indicators/indicators.py +0 -0
  162. {quantred-2.4.0 → quantred-2.4.1}/quantred/marketdata/base.py +0 -0
  163. {quantred-2.4.0 → quantred-2.4.1}/quantred/marketdata/client.py +0 -0
  164. {quantred-2.4.0 → quantred-2.4.1}/quantred/marketdata/session.py +0 -0
  165. {quantred-2.4.0 → quantred-2.4.1}/quantred/marketdata/synthetic.py +0 -0
  166. {quantred-2.4.0 → quantred-2.4.1}/quantred/marketdata/timeframe.py +0 -0
  167. {quantred-2.4.0 → quantred-2.4.1}/quantred/mcp/__init__.py +0 -0
  168. {quantred-2.4.0 → quantred-2.4.1}/quantred/mcp/selftest.py +0 -0
  169. {quantred-2.4.0 → quantred-2.4.1}/quantred/mcp/server.py +0 -0
  170. {quantred-2.4.0 → quantred-2.4.1}/quantred/optimization/causality.py +0 -0
  171. {quantred-2.4.0 → quantred-2.4.1}/quantred/optimization/config_store.py +0 -0
  172. {quantred-2.4.0 → quantred-2.4.1}/quantred/optimization/optimizer.py +0 -0
  173. {quantred-2.4.0 → quantred-2.4.1}/quantred/optimization/parallel.py +0 -0
  174. {quantred-2.4.0 → quantred-2.4.1}/quantred/optimization/param_space.py +0 -0
  175. {quantred-2.4.0 → quantred-2.4.1}/quantred/optimization/walk_forward.py +0 -0
  176. {quantred-2.4.0 → quantred-2.4.1}/quantred/portfolio/allocator.py +0 -0
  177. {quantred-2.4.0 → quantred-2.4.1}/quantred/portfolio/benchmark.py +0 -0
  178. {quantred-2.4.0 → quantred-2.4.1}/quantred/portfolio/optimizer.py +0 -0
  179. {quantred-2.4.0 → quantred-2.4.1}/quantred/portfolio/policy.py +0 -0
  180. {quantred-2.4.0 → quantred-2.4.1}/quantred/portfolio/posterior.py +0 -0
  181. {quantred-2.4.0 → quantred-2.4.1}/quantred/research/__init__.py +0 -0
  182. {quantred-2.4.0 → quantred-2.4.1}/quantred/research/agent.py +0 -0
  183. {quantred-2.4.0 → quantred-2.4.1}/quantred/research/demo_proposals.py +0 -0
  184. {quantred-2.4.0 → quantred-2.4.1}/quantred/research/llm.py +0 -0
  185. {quantred-2.4.0 → quantred-2.4.1}/quantred/research/proposer.py +0 -0
  186. {quantred-2.4.0 → quantred-2.4.1}/quantred/research/provider_errors.py +0 -0
  187. {quantred-2.4.0 → quantred-2.4.1}/quantred/research/sandbox.py +0 -0
  188. {quantred-2.4.0 → quantred-2.4.1}/quantred/risk/__init__.py +0 -0
  189. {quantred-2.4.0 → quantred-2.4.1}/quantred/risk/base.py +0 -0
  190. {quantred-2.4.0 → quantred-2.4.1}/quantred/risk/conditional.py +0 -0
  191. {quantred-2.4.0 → quantred-2.4.1}/quantred/risk/exposures.py +0 -0
  192. {quantred-2.4.0 → quantred-2.4.1}/quantred/risk/factor.py +0 -0
  193. {quantred-2.4.0 → quantred-2.4.1}/quantred/risk/sample.py +0 -0
  194. {quantred-2.4.0 → quantred-2.4.1}/quantred/risk/streaming.py +0 -0
  195. {quantred-2.4.0 → quantred-2.4.1}/quantred/scanners/base.py +0 -0
  196. {quantred-2.4.0 → quantred-2.4.1}/quantred/scanners/symbol_scanner.py +0 -0
  197. {quantred-2.4.0 → quantred-2.4.1}/quantred/services/__init__.py +0 -0
  198. {quantred-2.4.0 → quantred-2.4.1}/quantred/services/analysis.py +0 -0
  199. {quantred-2.4.0 → quantred-2.4.1}/quantred/services/audit.py +0 -0
  200. {quantred-2.4.0 → quantred-2.4.1}/quantred/services/campaign.py +0 -0
  201. {quantred-2.4.0 → quantred-2.4.1}/quantred/services/configs.py +0 -0
  202. {quantred-2.4.0 → quantred-2.4.1}/quantred/services/data.py +0 -0
  203. {quantred-2.4.0 → quantred-2.4.1}/quantred/services/dryrun.py +0 -0
  204. {quantred-2.4.0 → quantred-2.4.1}/quantred/services/glossary.py +0 -0
  205. {quantred-2.4.0 → quantred-2.4.1}/quantred/services/maintenance.py +0 -0
  206. {quantred-2.4.0 → quantred-2.4.1}/quantred/services/setup.py +0 -0
  207. {quantred-2.4.0 → quantred-2.4.1}/quantred/services/sizing.py +0 -0
  208. {quantred-2.4.0 → quantred-2.4.1}/quantred/services/smallreal.py +0 -0
  209. {quantred-2.4.0 → quantred-2.4.1}/quantred/store/__init__.py +0 -0
  210. {quantred-2.4.0 → quantred-2.4.1}/quantred/store/bars.py +0 -0
  211. {quantred-2.4.0 → quantred-2.4.1}/quantred/store/trials.py +0 -0
  212. {quantred-2.4.0 → quantred-2.4.1}/quantred/strategies/base.py +0 -0
  213. {quantred-2.4.0 → quantred-2.4.1}/quantred/strategies/signals.py +0 -0
  214. {quantred-2.4.0 → quantred-2.4.1}/quantred/utils/errors.py +0 -0
  215. {quantred-2.4.0 → quantred-2.4.1}/quantred/utils/extras.py +0 -0
  216. {quantred-2.4.0 → quantred-2.4.1}/quantred/utils/logging_config.py +0 -0
  217. {quantred-2.4.0 → quantred-2.4.1}/quantred/utils/numeric.py +0 -0
  218. {quantred-2.4.0 → quantred-2.4.1}/quantred/utils/streaming.py +0 -0
  219. {quantred-2.4.0 → quantred-2.4.1}/quantred/utils/timeutils.py +0 -0
  220. {quantred-2.4.0 → quantred-2.4.1}/scripts/check_links.py +0 -0
  221. {quantred-2.4.0 → quantred-2.4.1}/tests/conftest.py +0 -0
  222. {quantred-2.4.0 → quantred-2.4.1}/tests/fakes.py +0 -0
  223. {quantred-2.4.0 → quantred-2.4.1}/tests/state_leak_guard.py +0 -0
  224. {quantred-2.4.0 → quantred-2.4.1}/tests/test_alphas.py +0 -0
  225. {quantred-2.4.0 → quantred-2.4.1}/tests/test_attribution.py +0 -0
  226. {quantred-2.4.0 → quantred-2.4.1}/tests/test_backtest.py +0 -0
  227. {quantred-2.4.0 → quantred-2.4.1}/tests/test_backtest_surface_parity.py +0 -0
  228. {quantred-2.4.0 → quantred-2.4.1}/tests/test_bar_cache.py +0 -0
  229. {quantred-2.4.0 → quantred-2.4.1}/tests/test_bar_path_concurrency.py +0 -0
  230. {quantred-2.4.0 → quantred-2.4.1}/tests/test_benchmark_portfolio.py +0 -0
  231. {quantred-2.4.0 → quantred-2.4.1}/tests/test_black_litterman.py +0 -0
  232. {quantred-2.4.0 → quantred-2.4.1}/tests/test_bootstrap_skill.py +0 -0
  233. {quantred-2.4.0 → quantred-2.4.1}/tests/test_broker_errors.py +0 -0
  234. {quantred-2.4.0 → quantred-2.4.1}/tests/test_campaign_material.py +0 -0
  235. {quantred-2.4.0 → quantred-2.4.1}/tests/test_causality_probes.py +0 -0
  236. {quantred-2.4.0 → quantred-2.4.1}/tests/test_cli_dates.py +0 -0
  237. {quantred-2.4.0 → quantred-2.4.1}/tests/test_cli_help.py +0 -0
  238. {quantred-2.4.0 → quantred-2.4.1}/tests/test_cli_hints.py +0 -0
  239. {quantred-2.4.0 → quantred-2.4.1}/tests/test_cli_input_refusals.py +0 -0
  240. {quantred-2.4.0 → quantred-2.4.1}/tests/test_closing_inventory.py +0 -0
  241. {quantred-2.4.0 → quantred-2.4.1}/tests/test_combine.py +0 -0
  242. {quantred-2.4.0 → quantred-2.4.1}/tests/test_compute.py +0 -0
  243. {quantred-2.4.0 → quantred-2.4.1}/tests/test_conditional_risk.py +0 -0
  244. {quantred-2.4.0 → quantred-2.4.1}/tests/test_conditional_risk_service.py +0 -0
  245. {quantred-2.4.0 → quantred-2.4.1}/tests/test_cost_aware.py +0 -0
  246. {quantred-2.4.0 → quantred-2.4.1}/tests/test_costs.py +0 -0
  247. {quantred-2.4.0 → quantred-2.4.1}/tests/test_data.py +0 -0
  248. {quantred-2.4.0 → quantred-2.4.1}/tests/test_diagnostic_surfaces.py +0 -0
  249. {quantred-2.4.0 → quantred-2.4.1}/tests/test_docs_commands.py +0 -0
  250. {quantred-2.4.0 → quantred-2.4.1}/tests/test_dry_run.py +0 -0
  251. {quantred-2.4.0 → quantred-2.4.1}/tests/test_dst_boundaries.py +0 -0
  252. {quantred-2.4.0 → quantred-2.4.1}/tests/test_example_pack.py +0 -0
  253. {quantred-2.4.0 → quantred-2.4.1}/tests/test_execution_quality.py +0 -0
  254. {quantred-2.4.0 → quantred-2.4.1}/tests/test_extras_map.py +0 -0
  255. {quantred-2.4.0 → quantred-2.4.1}/tests/test_forecast_refinement_v2.py +0 -0
  256. {quantred-2.4.0 → quantred-2.4.1}/tests/test_halt.py +0 -0
  257. {quantred-2.4.0 → quantred-2.4.1}/tests/test_holdout_history.py +0 -0
  258. {quantred-2.4.0 → quantred-2.4.1}/tests/test_honest_labels.py +0 -0
  259. {quantred-2.4.0 → quantred-2.4.1}/tests/test_horizon.py +0 -0
  260. {quantred-2.4.0 → quantred-2.4.1}/tests/test_html_report.py +0 -0
  261. {quantred-2.4.0 → quantred-2.4.1}/tests/test_html_report_ux.py +0 -0
  262. {quantred-2.4.0 → quantred-2.4.1}/tests/test_information.py +0 -0
  263. {quantred-2.4.0 → quantred-2.4.1}/tests/test_ledger_fill_accounting.py +0 -0
  264. {quantred-2.4.0 → quantred-2.4.1}/tests/test_links.py +0 -0
  265. {quantred-2.4.0 → quantred-2.4.1}/tests/test_live_hardening.py +0 -0
  266. {quantred-2.4.0 → quantred-2.4.1}/tests/test_live_portfolio_cli.py +0 -0
  267. {quantred-2.4.0 → quantred-2.4.1}/tests/test_live_trader.py +0 -0
  268. {quantred-2.4.0 → quantred-2.4.1}/tests/test_long_short.py +0 -0
  269. {quantred-2.4.0 → quantred-2.4.1}/tests/test_market_data_feed.py +0 -0
  270. {quantred-2.4.0 → quantred-2.4.1}/tests/test_mcp_bad_input.py +0 -0
  271. {quantred-2.4.0 → quantred-2.4.1}/tests/test_mcp_description_truth.py +0 -0
  272. {quantred-2.4.0 → quantred-2.4.1}/tests/test_mcp_json_safe.py +0 -0
  273. {quantred-2.4.0 → quantred-2.4.1}/tests/test_mcp_keyless.py +0 -0
  274. {quantred-2.4.0 → quantred-2.4.1}/tests/test_mcp_save_config.py +0 -0
  275. {quantred-2.4.0 → quantred-2.4.1}/tests/test_mcp_shutdown.py +0 -0
  276. {quantred-2.4.0 → quantred-2.4.1}/tests/test_mcp_stdio.py +0 -0
  277. {quantred-2.4.0 → quantred-2.4.1}/tests/test_mcp_surface.py +0 -0
  278. {quantred-2.4.0 → quantred-2.4.1}/tests/test_memoized_backtest.py +0 -0
  279. {quantred-2.4.0 → quantred-2.4.1}/tests/test_min_notional_parity.py +0 -0
  280. {quantred-2.4.0 → quantred-2.4.1}/tests/test_model_probe.py +0 -0
  281. {quantred-2.4.0 → quantred-2.4.1}/tests/test_multi_period_policy.py +0 -0
  282. {quantred-2.4.0 → quantred-2.4.1}/tests/test_net_cap_derivation.py +0 -0
  283. {quantred-2.4.0 → quantred-2.4.1}/tests/test_net_exposure.py +0 -0
  284. {quantred-2.4.0 → quantred-2.4.1}/tests/test_offline.py +0 -0
  285. {quantred-2.4.0 → quantred-2.4.1}/tests/test_optimizer.py +0 -0
  286. {quantred-2.4.0 → quantred-2.4.1}/tests/test_optimizer_book.py +0 -0
  287. {quantred-2.4.0 → quantred-2.4.1}/tests/test_packaging.py +0 -0
  288. {quantred-2.4.0 → quantred-2.4.1}/tests/test_parallel_trials.py +0 -0
  289. {quantred-2.4.0 → quantred-2.4.1}/tests/test_param_constraints.py +0 -0
  290. {quantred-2.4.0 → quantred-2.4.1}/tests/test_portfolio.py +0 -0
  291. {quantred-2.4.0 → quantred-2.4.1}/tests/test_portfolio_excursion.py +0 -0
  292. {quantred-2.4.0 → quantred-2.4.1}/tests/test_portfolio_optimizer.py +0 -0
  293. {quantred-2.4.0 → quantred-2.4.1}/tests/test_promoted_cost.py +0 -0
  294. {quantred-2.4.0 → quantred-2.4.1}/tests/test_research.py +0 -0
  295. {quantred-2.4.0 → quantred-2.4.1}/tests/test_research_cli.py +0 -0
  296. {quantred-2.4.0 → quantred-2.4.1}/tests/test_research_history.py +0 -0
  297. {quantred-2.4.0 → quantred-2.4.1}/tests/test_research_rounds.py +0 -0
  298. {quantred-2.4.0 → quantred-2.4.1}/tests/test_risk.py +0 -0
  299. {quantred-2.4.0 → quantred-2.4.1}/tests/test_risk_streaming.py +0 -0
  300. {quantred-2.4.0 → quantred-2.4.1}/tests/test_run_config.py +0 -0
  301. {quantred-2.4.0 → quantred-2.4.1}/tests/test_run_context.py +0 -0
  302. {quantred-2.4.0 → quantred-2.4.1}/tests/test_saved_config_book.py +0 -0
  303. {quantred-2.4.0 → quantred-2.4.1}/tests/test_scanner.py +0 -0
  304. {quantred-2.4.0 → quantred-2.4.1}/tests/test_screen_command.py +0 -0
  305. {quantred-2.4.0 → quantred-2.4.1}/tests/test_screening.py +0 -0
  306. {quantred-2.4.0 → quantred-2.4.1}/tests/test_series_comparison.py +0 -0
  307. {quantred-2.4.0 → quantred-2.4.1}/tests/test_services.py +0 -0
  308. {quantred-2.4.0 → quantred-2.4.1}/tests/test_settings.py +0 -0
  309. {quantred-2.4.0 → quantred-2.4.1}/tests/test_setup.py +0 -0
  310. {quantred-2.4.0 → quantred-2.4.1}/tests/test_shutdown_signals.py +0 -0
  311. {quantred-2.4.0 → quantred-2.4.1}/tests/test_signal_causality.py +0 -0
  312. {quantred-2.4.0 → quantred-2.4.1}/tests/test_small_real_command.py +0 -0
  313. {quantred-2.4.0 → quantred-2.4.1}/tests/test_small_real_contract.py +0 -0
  314. {quantred-2.4.0 → quantred-2.4.1}/tests/test_state_leak_guard.py +0 -0
  315. {quantred-2.4.0 → quantred-2.4.1}/tests/test_state_root.py +0 -0
  316. {quantred-2.4.0 → quantred-2.4.1}/tests/test_store.py +0 -0
  317. {quantred-2.4.0 → quantred-2.4.1}/tests/test_strategy.py +0 -0
  318. {quantred-2.4.0 → quantred-2.4.1}/tests/test_strategy_registry.py +0 -0
  319. {quantred-2.4.0 → quantred-2.4.1}/tests/test_stream.py +0 -0
  320. {quantred-2.4.0 → quantred-2.4.1}/tests/test_stream_close.py +0 -0
  321. {quantred-2.4.0 → quantred-2.4.1}/tests/test_surface_parity.py +0 -0
  322. {quantred-2.4.0 → quantred-2.4.1}/tests/test_synthetic.py +0 -0
  323. {quantred-2.4.0 → quantred-2.4.1}/tests/test_trade_analytics.py +0 -0
  324. {quantred-2.4.0 → quantred-2.4.1}/tests/test_trade_command_output.py +0 -0
  325. {quantred-2.4.0 → quantred-2.4.1}/tests/test_trade_update_handling.py +0 -0
  326. {quantred-2.4.0 → quantred-2.4.1}/tests/test_trial_browser.py +0 -0
  327. {quantred-2.4.0 → quantred-2.4.1}/tests/test_trial_history_labels.py +0 -0
  328. {quantred-2.4.0 → quantred-2.4.1}/tests/test_trial_id_prefix.py +0 -0
  329. {quantred-2.4.0 → quantred-2.4.1}/tests/test_trial_store.py +0 -0
  330. {quantred-2.4.0 → quantred-2.4.1}/tests/test_trial_store_maintenance.py +0 -0
  331. {quantred-2.4.0 → quantred-2.4.1}/tests/test_units.py +0 -0
  332. {quantred-2.4.0 → quantred-2.4.1}/tests/test_verdict.py +0 -0
  333. {quantred-2.4.0 → quantred-2.4.1}/tests/test_walk_forward.py +0 -0
  334. {quantred-2.4.0 → quantred-2.4.1}/tests/test_walk_forward_evidence_parity.py +0 -0
  335. {quantred-2.4.0 → quantred-2.4.1}/uv.lock +0 -0
@@ -91,8 +91,8 @@ jobs:
91
91
  if [ -z "$CLOUDFLARE_API_TOKEN" ]; then
92
92
  echo "::error title=Missing deploy credentials::CLOUDFLARE_API_TOKEN is not set."
93
93
  echo ""
94
- echo "The docs site cannot deploy without it, so tradeflow.mk-dir.com will"
95
- echo "keep serving whatever was last published by hand."
94
+ echo "The docs site cannot deploy without it, so quantred.mk-dir.com will"
95
+ echo "keep serving the version that is already deployed (if any); nothing new is published."
96
96
  echo ""
97
97
  echo "Add it at: Settings -> Secrets and variables -> Actions"
98
98
  echo " CLOUDFLARE_API_TOKEN a token with the Workers Scripts:Edit permission"
@@ -18,7 +18,7 @@ name: Release
18
18
  #
19
19
  # A tag `v*` publishes the engine from the repository root. A tag `tradeflow-engine-v*`
20
20
  # publishes the final transition release of the old distribution name from
21
- # packaging/tradeflow-engine instead. That project's trusted publisher must name the
21
+ # legacy/tradeflow-engine instead. That project's trusted publisher must name the
22
22
  # repository as it is now called (`quantred`, renamed from the old one) and the same
23
23
  # workflow `release.yml` and environment `pypi`.
24
24
 
@@ -53,7 +53,7 @@ jobs:
53
53
  run: uv build
54
54
  - name: Build the transition package (tag tradeflow-engine-v*)
55
55
  if: startsWith(github.ref, 'refs/tags/tradeflow-engine-v')
56
- run: uv build packaging/tradeflow-engine -o dist
56
+ run: uv build legacy/tradeflow-engine -o dist
57
57
  # Catches a malformed README or bad metadata before it is permanent.
58
58
  - run: uvx twine check dist/*
59
59
  # The tag and the packaged version must agree, or the release notes describe
@@ -77,7 +77,7 @@ jobs:
77
77
  # installed, so the order of the two tags is checked, not remembered.
78
78
  - name: The engine release this requires is on PyPI
79
79
  if: startsWith(github.ref, 'refs/tags/tradeflow-engine-v')
80
- run: uv run --no-project --with packaging python .github/scripts/require_published_dependency.py packaging/tradeflow-engine/pyproject.toml
80
+ run: uv run --no-project --with packaging python .github/scripts/require_published_dependency.py legacy/tradeflow-engine/pyproject.toml
81
81
  - uses: actions/upload-artifact@v7
82
82
  with:
83
83
  name: dist
@@ -1,12 +1,12 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: quantred
3
- Version: 2.4.0
3
+ Version: 2.4.1
4
4
  Summary: A layered, broker-agnostic algorithmic-trading research engine that is honest about how hard making money is.
5
- Project-URL: Homepage, https://tradeflow.mk-dir.com/
6
- Project-URL: Documentation, https://tradeflow.mk-dir.com/
5
+ Project-URL: Homepage, https://quantred.mk-dir.com/
6
+ Project-URL: Documentation, https://quantred.mk-dir.com/
7
7
  Project-URL: Source, https://github.com/makedirectory/quantred
8
8
  Project-URL: Issues, https://github.com/makedirectory/quantred/issues
9
- Project-URL: Changelog, https://tradeflow.mk-dir.com/changelog
9
+ Project-URL: Changelog, https://quantred.mk-dir.com/changelog
10
10
  Author-email: Andrew Schwartz <andrew@mk-dir.com>
11
11
  License-Expression: MIT
12
12
  License-File: LICENSE
@@ -60,7 +60,7 @@ Description-Content-Type: text/markdown
60
60
  # QuantRed
61
61
 
62
62
  [![CI](https://github.com/makedirectory/quantred/actions/workflows/ci.yml/badge.svg)](https://github.com/makedirectory/quantred/actions/workflows/ci.yml)
63
- [![Docs](https://img.shields.io/badge/docs-tradeflow.mk--dir.com-blue)](https://tradeflow.mk-dir.com/)
63
+ [![Docs](https://img.shields.io/badge/docs-quantred.mk--dir.com-blue)](https://quantred.mk-dir.com/)
64
64
 
65
65
  A small, **layered**, **broker-agnostic** algorithmic-trading **research
66
66
  engine** — and an honest one, which mostly means it's very good at telling you
@@ -75,8 +75,8 @@ optimization**, **walk-forward validation**, and **constraint-solver portfolio
75
75
  allocation**.
76
76
 
77
77
  Full docs — usage guide, engineering wiki, and
78
- [changelog](https://tradeflow.mk-dir.com/changelog) — live at
79
- **[tradeflow.mk-dir.com](https://tradeflow.mk-dir.com/)**.
78
+ [changelog](https://quantred.mk-dir.com/changelog) — live at
79
+ **[quantred.mk-dir.com](https://quantred.mk-dir.com/)**.
80
80
 
81
81
  > Making money in markets is genuinely hard. This project won't change that — but
82
82
  > it will at least stop you from fooling yourself quite so quickly, which is most
@@ -115,7 +115,7 @@ never touch**:
115
115
  **Promotion is a manual human step** — automation never flips `PAPER_TRADE` or
116
116
  places an order. The [MCP server](#agent-integration-mcp) enforces this
117
117
  *structurally*: it builds only a data client, so it physically cannot trade. See
118
- the [architecture docs](https://tradeflow.mk-dir.com/engineering/architecture)
118
+ the [architecture docs](https://quantred.mk-dir.com/engineering/architecture)
119
119
  for the full picture.
120
120
 
121
121
  ## Requirements
@@ -153,11 +153,11 @@ quantred mcp --self-test # confirm discovery works without a chat
153
153
 
154
154
  Optional capabilities are extras (charts, the MCP server, the model SDKs). Adding one
155
155
  later with `uv tool` replaces the environment, so list every extra you want — the
156
- [extras guide](https://tradeflow.mk-dir.com/usage/extras) has the table and the exact
156
+ [extras guide](https://quantred.mk-dir.com/usage/extras) has the table and the exact
157
157
  commands. `quantred init --check --for <task>` prints the one you need for that task, and a
158
158
  command that needs a missing extra prints it with your current extras filled in.
159
159
 
160
- **→ [Getting started](https://tradeflow.mk-dir.com/usage/getting-started)** walks the
160
+ **→ [Getting started](https://quantred.mk-dir.com/usage/getting-started)** walks the
161
161
  whole path: install → keys → your first real result → Claude connected. Six steps,
162
162
  the first two with no keys and no network.
163
163
 
@@ -167,7 +167,7 @@ The distribution and the command are both **`quantred`**; the importable package
167
167
  `quantred`, so upgrading it moves you across without breaking old scripts, MCP configs or
168
168
  packs importing `tradeflow` (the alias raises a `DeprecationWarning`, shown under `-W default` or in test runs). A private pack needs its imports
169
169
  changed from `tradeflow` to `quantred` before you drop it. The steps are in
170
- [migrating to QuantRed](https://tradeflow.mk-dir.com/usage/migrating-to-quantred).
170
+ [migrating to QuantRed](https://quantred.mk-dir.com/usage/migrating-to-quantred).
171
171
 
172
172
  State (the research journal, trial store, bar cache, promoted configs) lives in
173
173
  `~/.tradeflow` — for an installed copy and for a checkout alike. `quantred --version`
@@ -210,7 +210,7 @@ docker compose run --rm verdict --scanner none \
210
210
  ```
211
211
 
212
212
  `live` is profile-gated and is never started by `up` — turning the machine on must
213
- not turn trading on. See [Running in Docker](https://tradeflow.mk-dir.com/usage/docker).
213
+ not turn trading on. See [Running in Docker](https://quantred.mk-dir.com/usage/docker).
214
214
 
215
215
  Run `make help` to see every target. Anything is overridable inline:
216
216
 
@@ -273,7 +273,7 @@ alongside it appears in the same table, scored the same way.
273
273
  Notice the arc: `demo_trend` looks tradeable in-sample (+14.7%, Sharpe 0.48), but
274
274
  once it's optimized in-sample and scored **out-of-sample** the edge evaporates
275
275
  (median OOS Sharpe −0.26) and all but one promotion gate fails. That's
276
- [walk-forward validation](https://tradeflow.mk-dir.com/engineering/walk-forward)
276
+ [walk-forward validation](https://quantred.mk-dir.com/engineering/walk-forward)
277
277
  doing its job.
278
278
 
279
279
  ### Watching the agent get told "no"
@@ -376,13 +376,13 @@ them out of this repository entirely.
376
376
 
377
377
  Each strategy defines a single continuous **score** (its conviction); the trade
378
378
  clock's `BUY/SELL/HOLD` and the
379
- [continuous alpha](https://tradeflow.mk-dir.com/engineering/alphas) are both
379
+ [continuous alpha](https://quantred.mk-dir.com/engineering/alphas) are both
380
380
  derived from it — one source of truth.
381
381
 
382
382
  `example` is a complete working pack to copy — `quantred init
383
383
  --example-pack ./my-signals` writes it out. See
384
- [Your own strategies](https://tradeflow.mk-dir.com/usage/private-strategies)
385
- and [Extending](https://tradeflow.mk-dir.com/engineering/extending).
384
+ [Your own strategies](https://quantred.mk-dir.com/usage/private-strategies)
385
+ and [Extending](https://quantred.mk-dir.com/engineering/extending).
386
386
 
387
387
  ### Using it from your own code
388
388
 
@@ -399,13 +399,13 @@ print(result["verdict"]["summary"])
399
399
  ```
400
400
 
401
401
  Everything outside `services/` is internal and moves without notice. See
402
- [Using QuantRed as a library](https://tradeflow.mk-dir.com/engineering/embedding).
402
+ [Using QuantRed as a library](https://quantred.mk-dir.com/engineering/embedding).
403
403
 
404
404
  ### Optional features
405
405
 
406
406
  Capabilities are optional extras so the base install stays lean:
407
407
 
408
- Installed: see the [extras guide](https://tradeflow.mk-dir.com/usage/extras). In a
408
+ Installed: see the [extras guide](https://quantred.mk-dir.com/usage/extras). In a
409
409
  checkout:
410
410
 
411
411
  ```bash
@@ -510,7 +510,7 @@ quantred research --provider ollama --model llama3.1 \
510
510
  --goal "improve OOS Sharpe without raising max drawdown" --holdout-days 60
511
511
  ```
512
512
 
513
- See the [docs](https://tradeflow.mk-dir.com/) (Usage → *AI agents*) for the full
513
+ See the [docs](https://quantred.mk-dir.com/) (Usage → *AI agents*) for the full
514
514
  tool surface, guardrails, and provider setup.
515
515
 
516
516
  *Contributors, from a checkout:* the same commands run as `python main.py mcp` and
@@ -619,7 +619,7 @@ make flatten REASON="why" # halt, cancel everything, close everythin
619
619
 
620
620
  Halt state is a file under the state root, not a database — the order path holds no
621
621
  connection to anything that can be down, so the switch still works when the engine
622
- does not. See [Stopping trading](https://tradeflow.mk-dir.com/usage/stopping).
622
+ does not. See [Stopping trading](https://quantred.mk-dir.com/usage/stopping).
623
623
 
624
624
  ## ☕ Coffee?
625
625
 
@@ -1,7 +1,7 @@
1
1
  # QuantRed
2
2
 
3
3
  [![CI](https://github.com/makedirectory/quantred/actions/workflows/ci.yml/badge.svg)](https://github.com/makedirectory/quantred/actions/workflows/ci.yml)
4
- [![Docs](https://img.shields.io/badge/docs-tradeflow.mk--dir.com-blue)](https://tradeflow.mk-dir.com/)
4
+ [![Docs](https://img.shields.io/badge/docs-quantred.mk--dir.com-blue)](https://quantred.mk-dir.com/)
5
5
 
6
6
  A small, **layered**, **broker-agnostic** algorithmic-trading **research
7
7
  engine** — and an honest one, which mostly means it's very good at telling you
@@ -16,8 +16,8 @@ optimization**, **walk-forward validation**, and **constraint-solver portfolio
16
16
  allocation**.
17
17
 
18
18
  Full docs — usage guide, engineering wiki, and
19
- [changelog](https://tradeflow.mk-dir.com/changelog) — live at
20
- **[tradeflow.mk-dir.com](https://tradeflow.mk-dir.com/)**.
19
+ [changelog](https://quantred.mk-dir.com/changelog) — live at
20
+ **[quantred.mk-dir.com](https://quantred.mk-dir.com/)**.
21
21
 
22
22
  > Making money in markets is genuinely hard. This project won't change that — but
23
23
  > it will at least stop you from fooling yourself quite so quickly, which is most
@@ -56,7 +56,7 @@ never touch**:
56
56
  **Promotion is a manual human step** — automation never flips `PAPER_TRADE` or
57
57
  places an order. The [MCP server](#agent-integration-mcp) enforces this
58
58
  *structurally*: it builds only a data client, so it physically cannot trade. See
59
- the [architecture docs](https://tradeflow.mk-dir.com/engineering/architecture)
59
+ the [architecture docs](https://quantred.mk-dir.com/engineering/architecture)
60
60
  for the full picture.
61
61
 
62
62
  ## Requirements
@@ -94,11 +94,11 @@ quantred mcp --self-test # confirm discovery works without a chat
94
94
 
95
95
  Optional capabilities are extras (charts, the MCP server, the model SDKs). Adding one
96
96
  later with `uv tool` replaces the environment, so list every extra you want — the
97
- [extras guide](https://tradeflow.mk-dir.com/usage/extras) has the table and the exact
97
+ [extras guide](https://quantred.mk-dir.com/usage/extras) has the table and the exact
98
98
  commands. `quantred init --check --for <task>` prints the one you need for that task, and a
99
99
  command that needs a missing extra prints it with your current extras filled in.
100
100
 
101
- **→ [Getting started](https://tradeflow.mk-dir.com/usage/getting-started)** walks the
101
+ **→ [Getting started](https://quantred.mk-dir.com/usage/getting-started)** walks the
102
102
  whole path: install → keys → your first real result → Claude connected. Six steps,
103
103
  the first two with no keys and no network.
104
104
 
@@ -108,7 +108,7 @@ The distribution and the command are both **`quantred`**; the importable package
108
108
  `quantred`, so upgrading it moves you across without breaking old scripts, MCP configs or
109
109
  packs importing `tradeflow` (the alias raises a `DeprecationWarning`, shown under `-W default` or in test runs). A private pack needs its imports
110
110
  changed from `tradeflow` to `quantred` before you drop it. The steps are in
111
- [migrating to QuantRed](https://tradeflow.mk-dir.com/usage/migrating-to-quantred).
111
+ [migrating to QuantRed](https://quantred.mk-dir.com/usage/migrating-to-quantred).
112
112
 
113
113
  State (the research journal, trial store, bar cache, promoted configs) lives in
114
114
  `~/.tradeflow` — for an installed copy and for a checkout alike. `quantred --version`
@@ -151,7 +151,7 @@ docker compose run --rm verdict --scanner none \
151
151
  ```
152
152
 
153
153
  `live` is profile-gated and is never started by `up` — turning the machine on must
154
- not turn trading on. See [Running in Docker](https://tradeflow.mk-dir.com/usage/docker).
154
+ not turn trading on. See [Running in Docker](https://quantred.mk-dir.com/usage/docker).
155
155
 
156
156
  Run `make help` to see every target. Anything is overridable inline:
157
157
 
@@ -214,7 +214,7 @@ alongside it appears in the same table, scored the same way.
214
214
  Notice the arc: `demo_trend` looks tradeable in-sample (+14.7%, Sharpe 0.48), but
215
215
  once it's optimized in-sample and scored **out-of-sample** the edge evaporates
216
216
  (median OOS Sharpe −0.26) and all but one promotion gate fails. That's
217
- [walk-forward validation](https://tradeflow.mk-dir.com/engineering/walk-forward)
217
+ [walk-forward validation](https://quantred.mk-dir.com/engineering/walk-forward)
218
218
  doing its job.
219
219
 
220
220
  ### Watching the agent get told "no"
@@ -317,13 +317,13 @@ them out of this repository entirely.
317
317
 
318
318
  Each strategy defines a single continuous **score** (its conviction); the trade
319
319
  clock's `BUY/SELL/HOLD` and the
320
- [continuous alpha](https://tradeflow.mk-dir.com/engineering/alphas) are both
320
+ [continuous alpha](https://quantred.mk-dir.com/engineering/alphas) are both
321
321
  derived from it — one source of truth.
322
322
 
323
323
  `example` is a complete working pack to copy — `quantred init
324
324
  --example-pack ./my-signals` writes it out. See
325
- [Your own strategies](https://tradeflow.mk-dir.com/usage/private-strategies)
326
- and [Extending](https://tradeflow.mk-dir.com/engineering/extending).
325
+ [Your own strategies](https://quantred.mk-dir.com/usage/private-strategies)
326
+ and [Extending](https://quantred.mk-dir.com/engineering/extending).
327
327
 
328
328
  ### Using it from your own code
329
329
 
@@ -340,13 +340,13 @@ print(result["verdict"]["summary"])
340
340
  ```
341
341
 
342
342
  Everything outside `services/` is internal and moves without notice. See
343
- [Using QuantRed as a library](https://tradeflow.mk-dir.com/engineering/embedding).
343
+ [Using QuantRed as a library](https://quantred.mk-dir.com/engineering/embedding).
344
344
 
345
345
  ### Optional features
346
346
 
347
347
  Capabilities are optional extras so the base install stays lean:
348
348
 
349
- Installed: see the [extras guide](https://tradeflow.mk-dir.com/usage/extras). In a
349
+ Installed: see the [extras guide](https://quantred.mk-dir.com/usage/extras). In a
350
350
  checkout:
351
351
 
352
352
  ```bash
@@ -451,7 +451,7 @@ quantred research --provider ollama --model llama3.1 \
451
451
  --goal "improve OOS Sharpe without raising max drawdown" --holdout-days 60
452
452
  ```
453
453
 
454
- See the [docs](https://tradeflow.mk-dir.com/) (Usage → *AI agents*) for the full
454
+ See the [docs](https://quantred.mk-dir.com/) (Usage → *AI agents*) for the full
455
455
  tool surface, guardrails, and provider setup.
456
456
 
457
457
  *Contributors, from a checkout:* the same commands run as `python main.py mcp` and
@@ -560,7 +560,7 @@ make flatten REASON="why" # halt, cancel everything, close everythin
560
560
 
561
561
  Halt state is a file under the state root, not a database — the order path holds no
562
562
  connection to anything that can be down, so the switch still works when the engine
563
- does not. See [Stopping trading](https://tradeflow.mk-dir.com/usage/stopping).
563
+ does not. See [Stopping trading](https://quantred.mk-dir.com/usage/stopping).
564
564
 
565
565
  ## ☕ Coffee?
566
566
 
@@ -17,6 +17,14 @@
17
17
  #
18
18
  # Live trading is NEVER started by `up`. See the `live` service at the bottom.
19
19
 
20
+ # The project name is pinned, not derived from the checkout directory's name. Compose
21
+ # prefixes every volume with it, and it was `tradeflow` for everyone whose clone was
22
+ # called that: the journal lives in `tradeflow_tradeflow-logs`. A clone now made from the
23
+ # renamed repository lands in a `quantred/` directory, and an unpinned name would have
24
+ # pointed it at new, empty volumes. Pinned, every checkout - old directory or new -
25
+ # attaches to the same ones. Container and image names carry the new name; these do not.
26
+ name: tradeflow
27
+
20
28
  x-app: &app
21
29
  build:
22
30
  context: .
@@ -41,7 +49,7 @@ services:
41
49
  # ---------------------------------------------------------------- surfaces --
42
50
  mcp:
43
51
  <<: *app
44
- container_name: tradeflow-mcp
52
+ container_name: quantred-mcp
45
53
  # The server speaks stdio, so this is attach-oriented rather than a listening
46
54
  # port: an MCP client runs `docker compose run --rm mcp`. A TCP/SSE transport
47
55
  # would add a port mapping here and nothing else.
@@ -64,7 +72,7 @@ services:
64
72
  docs:
65
73
  profiles: ["docs"]
66
74
  image: node:24-slim
67
- container_name: tradeflow-docs
75
+ container_name: quantred-docs
68
76
  working_dir: /site
69
77
  volumes:
70
78
  - ./docs:/site
@@ -28,6 +28,24 @@ index; they are tagged in the repository.
28
28
 
29
29
  ---
30
30
 
31
+ ## 2.4.1 — 2026-11-08
32
+
33
+ - **No false "a pack imports the old name" line when launched through the old name.**
34
+ `python -m tradeflow.cli ...` - the form MCP client configs written before the rename
35
+ use, working through `tradeflow-engine` 2.3.1 - imports the old name itself before
36
+ discovery runs, and the check read that as a pack using it, printing the warning on
37
+ every launch. It now warns only when the old name first appears while packs are
38
+ loading. One blind spot is accepted: when the process itself was launched through the
39
+ old name, a pack that also imports it is not named.
40
+ - **The documentation moves to https://quantred.mk-dir.com.** quantred's own package
41
+ metadata, the README links and the hints the CLI prints point there.
42
+ `tradeflow-engine` 2.3.1 is already published and its metadata still names the old
43
+ address; that cannot change.
44
+ - **The Docker containers are renamed `quantred-mcp` and `quantred-docs`** (they were
45
+ `tradeflow-mcp` and `tradeflow-docs`). Update any `docker exec`, `docker logs` or
46
+ client config that names the old container. The volumes keep their names because the
47
+ compose project is pinned to `tradeflow`.
48
+
31
49
  ## 2.4.0 — 2026-11-07
32
50
 
33
51
  TradeFlow is now **QuantRed**, and a first session works from install to a result
@@ -80,6 +80,15 @@ resetting the campaign count that every multiple-testing correction depends on
80
80
  nothing would error. `scripts/compose_smoke.sh` tests exactly that: journal a trial (no keys needed),
81
81
  `down`, and check the trial is still there.
82
82
 
83
+ **Names.** The volumes are still called `tradeflow-logs`, `tradeflow-cache` and
84
+ `tradeflow-configs`, and the compose project is pinned as `tradeflow`, so Docker sees them
85
+ as `tradeflow_tradeflow-logs` and so on. That is deliberate: they hold the recorded trial
86
+ history, a renamed volume is a new empty one, and an unpinned project name would follow
87
+ the checkout directory, so a fresh clone into `quantred/` would not find a journal that a
88
+ clone into `tradeflow/` wrote. The containers and image carry the QuantRed name (the containers were renamed
89
+ `quantred-mcp` and `quantred-docs` in 2.4.1, so anything that names `tradeflow-mcp` or
90
+ `tradeflow-docs` needs updating); the volumes keep the old name on purpose.
91
+
83
92
  **Ownership.** The image runs as a pinned non-root uid (1000) and creates each mount
84
93
  point *in the image* so the named volumes inherit that ownership. Docker seeds a
85
94
  volume's ownership from the image directory at that path and makes it root-owned
@@ -82,7 +82,7 @@ QuantRed setup check
82
82
  state root: ~/.tradeflow
83
83
  (journal, trial store, bar cache, and configs all live here)
84
84
 
85
- [ok] version quantred 2.4.0
85
+ [ok] version quantred 2.4.1
86
86
  [optional] env file ~/.tradeflow/.env not found
87
87
  -> run `init` to create it, or export the keys as environment variables
88
88
  [blocked] APCA_API_KEY_ID (not set) - no command that touches the market will run
@@ -100,7 +100,7 @@ QuantRed setup check
100
100
  blocked for: data (APCA_API_KEY_ID, APCA_API_SECRET_KEY)
101
101
  blocked for: research (APCA_API_KEY_ID, APCA_API_SECRET_KEY, model provider)
102
102
 
103
- Also not installed (optional): viz - what each unlocks and how to add it: https://tradeflow.mk-dir.com/usage/extras
103
+ Also not installed (optional): viz - what each unlocks and how to add it: https://quantred.mk-dir.com/usage/extras
104
104
  ```
105
105
 
106
106
  That is a trimmed example from a machine with no keys; your rows will differ (the
@@ -10,7 +10,8 @@ The project was called TradeFlow and was distributed as `tradeflow-engine`. It i
10
10
  is for anyone who already has the old distribution installed. If you are installing for
11
11
  the first time, you do not need it: see [installation](installation).
12
12
 
13
- Two releases carry the move. QuantRed 2.4.0 is the first release published as `quantred`.
13
+ Two releases carry the move (QuantRed 2.4.1 is a later fix, described under
14
+ [MCP clients](#mcp-clients)). QuantRed 2.4.0 is the first release published as `quantred`.
14
15
  `tradeflow-engine` 2.3.1 is the last release under the old name and is published after
15
16
  it: a transition package with no engine code of its own. It depends on `quantred`, still
16
17
  provides the `tradeflow` command (which runs QuantRed's command line), and ships a
@@ -190,7 +191,8 @@ A client entry written under the old name launches `tradeflow` or
190
191
  installed, and stop once it is removed (Path B). An entry whose command is a path
191
192
  *inside* the old tool's environment (for example
192
193
  `.../uv/tools/tradeflow-engine/bin/tradeflow`) stops working as soon as that tool is
193
- uninstalled.
194
+ uninstalled. From quantred 2.4.1, a launch through `python -m tradeflow.cli` no longer
195
+ prints a spurious "a pack imports the old name" warning.
194
196
 
195
197
  To move a client across, run `quantred mcp --self-test` and paste the absolute command
196
198
  and block it prints, which uses the key and command `quantred`. The server now reports
@@ -11,7 +11,7 @@ const config = {
11
11
  // Served as its own site at the docs subdomain. `baseUrl` stays '/' because the
12
12
  // docs own the whole (sub)domain root; it would only change if these were ever
13
13
  // hosted under a path like mk-dir.com/docs.
14
- url: 'https://tradeflow.mk-dir.com',
14
+ url: 'https://quantred.mk-dir.com',
15
15
  baseUrl: '/',
16
16
 
17
17
  // Broken internal links and anchors fail the build — the docs CI relies on this
@@ -1,11 +1,11 @@
1
1
  {
2
- "name": "tradeflow-docs",
2
+ "name": "quantred-docs",
3
3
  "version": "0.1.0",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
- "name": "tradeflow-docs",
8
+ "name": "quantred-docs",
9
9
  "version": "0.1.0",
10
10
  "dependencies": {
11
11
  "@docusaurus/core": "^3.6.0",
@@ -1,5 +1,5 @@
1
1
  {
2
- "name": "tradeflow-docs",
2
+ "name": "quantred-docs",
3
3
  "version": "0.1.0",
4
4
  "private": true,
5
5
  "scripts": {
@@ -0,0 +1,19 @@
1
+ {
2
+ "$schema": "node_modules/wrangler/config-schema.json",
3
+ "name": "quantred",
4
+ // The docs domain is attached here rather than in the dashboard, so the deploy that
5
+ // creates this worker also claims its hostname (Cloudflare creates the DNS record).
6
+ // Needs the mk-dir.com zone in the deploying account and a token with Workers Routes
7
+ // and DNS edit on it, or the deploy fails at this step.
8
+ "routes": [{ "pattern": "quantred.mk-dir.com", "custom_domain": true }],
9
+ "compatibility_date": "2026-06-20",
10
+ "observability": {
11
+ "enabled": true
12
+ },
13
+ "assets": {
14
+ "directory": "build"
15
+ },
16
+ "compatibility_flags": [
17
+ "nodejs_compat"
18
+ ]
19
+ }
@@ -200,7 +200,7 @@ one if they do.
200
200
 
201
201
  ## Then read
202
202
 
203
- - [Your own strategies](https://tradeflow.mk-dir.com/usage/private-strategies)
204
- - [Run configs](https://tradeflow.mk-dir.com/usage/run-configs)
205
- - [Validation diagnostics](https://tradeflow.mk-dir.com/usage/validation-diagnostics)
206
- - [Extending](https://tradeflow.mk-dir.com/engineering/extending) — the interface reference
203
+ - [Your own strategies](https://quantred.mk-dir.com/usage/private-strategies)
204
+ - [Run configs](https://quantred.mk-dir.com/usage/run-configs)
205
+ - [Validation diagnostics](https://quantred.mk-dir.com/usage/validation-diagnostics)
206
+ - [Extending](https://quantred.mk-dir.com/engineering/extending) — the interface reference
@@ -97,16 +97,16 @@ demo_volume = "quantred.demo.scanners:DemoVolumeScanner"
97
97
  # have to be kept in agreement.
98
98
  quantred = "quantred.cli:main"
99
99
  # No `tradeflow` alias here. The previous command is provided by the final
100
- # `tradeflow-engine` release (packaging/tradeflow-engine), which depends on this
100
+ # `tradeflow-engine` release (legacy/tradeflow-engine), which depends on this
101
101
  # distribution: two distributions that both install `bin/tradeflow` would have the
102
102
  # upgrade or uninstall of one delete the other's copy.
103
103
 
104
104
  [project.urls]
105
- Homepage = "https://tradeflow.mk-dir.com/"
106
- Documentation = "https://tradeflow.mk-dir.com/"
105
+ Homepage = "https://quantred.mk-dir.com/"
106
+ Documentation = "https://quantred.mk-dir.com/"
107
107
  Source = "https://github.com/makedirectory/quantred"
108
108
  Issues = "https://github.com/makedirectory/quantred/issues"
109
- Changelog = "https://tradeflow.mk-dir.com/changelog"
109
+ Changelog = "https://quantred.mk-dir.com/changelog"
110
110
 
111
111
  [build-system]
112
112
  requires = ["hatchling"]
@@ -144,7 +144,7 @@ exclude = [
144
144
  "/docs/node_modules",
145
145
  "/docs/build",
146
146
  "/dist",
147
- "/packaging",
147
+ "/legacy",
148
148
  "*.csv",
149
149
  "/.env",
150
150
  ]
@@ -21,4 +21,4 @@ a manual human step.
21
21
 
22
22
  #: The single source of truth for the version — packaging reads it from here, so a
23
23
  #: published artifact and what `quantred --version` reports cannot drift apart.
24
- __version__ = "2.4.0"
24
+ __version__ = "2.4.1"
@@ -199,6 +199,10 @@ def _entry_point_classes(group: str, base_cls: Type) -> Dict[str, Type]:
199
199
  so a broken private package cannot make the public engine unusable.
200
200
  """
201
201
  found: Dict[str, Type] = {}
202
+ # Whether the old name was already imported before any pack loaded: launching
203
+ # through it (`python -m tradeflow.cli`, the form old MCP client configs use) does
204
+ # that itself, and is not a pack using the old name.
205
+ old_name_already_loaded = _old_import_name_loaded()
202
206
  for entry_point in _select_entry_points(group):
203
207
  declared = getattr(entry_point, "group", None) or group
204
208
  if _from_legacy_distribution(entry_point):
@@ -250,7 +254,7 @@ def _entry_point_classes(group: str, base_cls: Type) -> Dict[str, Type]:
250
254
  )
251
255
  continue
252
256
  found[name] = cls
253
- _warn_if_a_pack_imports_the_old_name()
257
+ _warn_if_a_pack_imports_the_old_name(already_loaded=old_name_already_loaded)
254
258
  return found
255
259
 
256
260
 
@@ -269,16 +273,25 @@ def _from_legacy_distribution(entry_point: Any) -> bool:
269
273
  _WARNED_OLD_IMPORT = False
270
274
 
271
275
 
272
- def _warn_if_a_pack_imports_the_old_name() -> None:
273
- """Say once that something loaded through the ``tradeflow`` import alias.
276
+ def _old_import_name_loaded() -> bool:
277
+ """Whether the old import package (the alias `tradeflow-engine` 2.3.1 ships) is loaded."""
278
+ return "tradeflow" in sys.modules
279
+
280
+
281
+ def _warn_if_a_pack_imports_the_old_name(already_loaded: bool) -> None:
282
+ """Say once that a pack loaded through the ``tradeflow`` import alias.
274
283
 
275
284
  The alias's ``DeprecationWarning`` is hidden by Python's default filters unless it
276
285
  is raised from ``__main__``, so a pack loaded by entry point would use it silently
277
286
  while the docs say it warns. Detected from the alias itself (its module and its
278
- import finder are present) rather than from any one pack.
287
+ import finder are present) rather than from any one pack, and only when the module
288
+ appeared while packs were loading: with ``already_loaded`` the process itself was
289
+ launched through the old name, and blaming a pack for that printed a false line on
290
+ every launch from an old MCP client config. Accepted blind spot: when the process
291
+ itself was launched through the old name, a pack that also imports it is not named.
279
292
  """
280
293
  global _WARNED_OLD_IMPORT
281
- if _WARNED_OLD_IMPORT or "tradeflow" not in sys.modules:
294
+ if _WARNED_OLD_IMPORT or already_loaded or not _old_import_name_loaded():
282
295
  return
283
296
  if not any(type(finder).__name__ == "_AliasFinder" for finder in sys.meta_path):
284
297
  return
@@ -70,7 +70,7 @@ MCP_SERVER_NAME = "quantred"
70
70
 
71
71
  #: The documentation root. Pages are served from the site root (there is no ``/docs/``
72
72
  #: prefix), so a link built from this constant and a page path is a page that exists.
73
- DOCS_URL = "https://tradeflow.mk-dir.com"
73
+ DOCS_URL = "https://quantred.mk-dir.com"
74
74
  #: Where the source lives: the one place an installed copy can get the example pack.
75
75
  REPOSITORY_URL = "https://github.com/makedirectory/quantred"
76
76
 
@@ -70,6 +70,8 @@ fi
70
70
 
71
71
  # 5. The volume is readable by the host user without sudo — mixed native/container
72
72
  # work against one journal is certain, and a root-owned journal breaks it.
73
+ # The project name is pinned to `tradeflow` in docker-compose.yml, so this is the same
74
+ # name in every checkout directory.
73
75
  VOLUME=$(docker volume inspect tradeflow_tradeflow-logs --format '{{.Mountpoint}}' 2>/dev/null || echo "")
74
76
  if [[ -n "$VOLUME" ]]; then
75
77
  pass "logs volume exists ($VOLUME)"
@@ -32,7 +32,7 @@ ALLOWED = {
32
32
  ("research/sandbox.py", "_guarded_import"): (
33
33
  "compares an import's root module against the import package name"
34
34
  ),
35
- ("services/registry.py", "_warn_if_a_pack_imports_the_old_name"): (
35
+ ("services/registry.py", "_old_import_name_loaded"): (
36
36
  "looks for the old *import package* in sys.modules - the alias a pack loaded - "
37
37
  "not the command a reader types"
38
38
  ),