tradingcodex 0.2.8__tar.gz → 0.2.9__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 (302) hide show
  1. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/PKG-INFO +1 -1
  2. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/docs/deployment.md +5 -3
  3. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/docs/generated-workspaces.md +3 -1
  4. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/docs/interfaces-and-surfaces.md +1 -0
  5. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/pyproject.toml +1 -1
  6. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/tests/test_python_migration.py +41 -1
  7. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/tradingcodex.egg-info/PKG-INFO +1 -1
  8. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/tradingcodex_cli/__main__.py +1 -0
  9. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/tradingcodex_cli/commands/bootstrap.py +8 -1
  10. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/tradingcodex_cli/service_autostart.py +62 -7
  11. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/tradingcodex_service/api.py +1 -0
  12. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/tradingcodex_service/static/tradingcodex_web/app.css +1 -0
  13. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/tradingcodex_service/static/tradingcodex_web/app.js +5 -1
  14. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/tradingcodex_service/templates/web/base.html +2 -2
  15. tradingcodex-0.2.9/tradingcodex_service/version.py +1 -0
  16. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/repo-skills/files/.agents/skills/tcx-server/SKILL.md +1 -1
  17. tradingcodex-0.2.8/tradingcodex_service/version.py +0 -1
  18. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/CONTRIBUTING.md +0 -0
  19. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/LICENSE +0 -0
  20. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/MANIFEST.in +0 -0
  21. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/NOTICE +0 -0
  22. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/README.md +0 -0
  23. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/TRADEMARKS.md +0 -0
  24. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/apps/__init__.py +0 -0
  25. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/apps/audit/__init__.py +0 -0
  26. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/apps/audit/admin.py +0 -0
  27. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/apps/audit/apps.py +0 -0
  28. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/apps/audit/migrations/0001_initial.py +0 -0
  29. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/apps/audit/migrations/__init__.py +0 -0
  30. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/apps/audit/models.py +0 -0
  31. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/apps/harness/__init__.py +0 -0
  32. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/apps/harness/admin.py +0 -0
  33. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/apps/harness/apps.py +0 -0
  34. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/apps/harness/migrations/0001_initial.py +0 -0
  35. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/apps/harness/migrations/__init__.py +0 -0
  36. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/apps/harness/models.py +0 -0
  37. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/apps/harness/templatetags/__init__.py +0 -0
  38. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/apps/integrations/__init__.py +0 -0
  39. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/apps/integrations/admin.py +0 -0
  40. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/apps/integrations/apps.py +0 -0
  41. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/apps/integrations/migrations/0001_initial.py +0 -0
  42. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/apps/integrations/migrations/0002_brokerconnection_brokeraccount_instrumentmap.py +0 -0
  43. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/apps/integrations/migrations/__init__.py +0 -0
  44. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/apps/integrations/models.py +0 -0
  45. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/apps/mcp/__init__.py +0 -0
  46. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/apps/mcp/admin.py +0 -0
  47. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/apps/mcp/apps.py +0 -0
  48. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/apps/mcp/migrations/0001_initial.py +0 -0
  49. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/apps/mcp/migrations/__init__.py +0 -0
  50. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/apps/mcp/models.py +0 -0
  51. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/apps/mcp/services.py +0 -0
  52. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/apps/orders/__init__.py +0 -0
  53. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/apps/orders/admin.py +0 -0
  54. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/apps/orders/apps.py +0 -0
  55. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/apps/orders/migrations/0001_initial.py +0 -0
  56. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/apps/orders/migrations/0002_approvalreceipt_approved_order_type_and_more.py +0 -0
  57. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/apps/orders/migrations/0003_migrate_orderintent_to_orderticket.py +0 -0
  58. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/apps/orders/migrations/0004_remove_order_intent_compat_fields.py +0 -0
  59. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/apps/orders/migrations/__init__.py +0 -0
  60. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/apps/orders/models.py +0 -0
  61. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/apps/orders/services.py +0 -0
  62. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/apps/policy/__init__.py +0 -0
  63. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/apps/policy/admin.py +0 -0
  64. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/apps/policy/apps.py +0 -0
  65. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/apps/policy/migrations/0001_initial.py +0 -0
  66. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/apps/policy/migrations/__init__.py +0 -0
  67. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/apps/policy/models.py +0 -0
  68. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/apps/policy/services.py +0 -0
  69. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/apps/portfolio/__init__.py +0 -0
  70. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/apps/portfolio/admin.py +0 -0
  71. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/apps/portfolio/apps.py +0 -0
  72. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/apps/portfolio/migrations/0001_initial.py +0 -0
  73. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/apps/portfolio/migrations/0002_brokersyncrun_portfolioledgerevent_reconciliationrun.py +0 -0
  74. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/apps/portfolio/migrations/__init__.py +0 -0
  75. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/apps/portfolio/models.py +0 -0
  76. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/apps/workflows/__init__.py +0 -0
  77. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/apps/workflows/admin.py +0 -0
  78. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/apps/workflows/apps.py +0 -0
  79. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/apps/workflows/migrations/0001_initial.py +0 -0
  80. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/apps/workflows/migrations/__init__.py +0 -0
  81. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/apps/workflows/models.py +0 -0
  82. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/assets/tradingcodex-banner.svg +0 -0
  83. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/docs/README.md +0 -0
  84. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/docs/artifact-supervisor-loop-prd.md +0 -0
  85. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/docs/components.md +0 -0
  86. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/docs/core-concepts-and-rules.md +0 -0
  87. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/docs/financial-workflow-references.md +0 -0
  88. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/docs/guardrails.md +0 -0
  89. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/docs/harness.md +0 -0
  90. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/docs/improvement-loop.md +0 -0
  91. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/docs/licensing-and-commercialization.md +0 -0
  92. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/docs/product-direction.md +0 -0
  93. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/docs/research-memory-and-artifacts.md +0 -0
  94. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/docs/roles-skills-and-workflows.md +0 -0
  95. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/docs/safety-policy-and-execution.md +0 -0
  96. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/docs/system-architecture.md +0 -0
  97. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/docs/validation-and-test-plan.md +0 -0
  98. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/install.sh +0 -0
  99. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/installation.md +0 -0
  100. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/setup.cfg +0 -0
  101. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/tests/test_broker_center_prd.py +0 -0
  102. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/tests/test_e2e_user_scenarios.py +0 -0
  103. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/tradingcodex.egg-info/SOURCES.txt +0 -0
  104. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/tradingcodex.egg-info/dependency_links.txt +0 -0
  105. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/tradingcodex.egg-info/entry_points.txt +0 -0
  106. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/tradingcodex.egg-info/requires.txt +0 -0
  107. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/tradingcodex.egg-info/top_level.txt +0 -0
  108. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/tradingcodex_cli/__init__.py +0 -0
  109. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/tradingcodex_cli/commands/__init__.py +0 -0
  110. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/tradingcodex_cli/commands/connectors.py +0 -0
  111. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/tradingcodex_cli/commands/db.py +0 -0
  112. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/tradingcodex_cli/commands/decision.py +0 -0
  113. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/tradingcodex_cli/commands/doctor.py +0 -0
  114. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/tradingcodex_cli/commands/mcp.py +0 -0
  115. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/tradingcodex_cli/commands/mode.py +0 -0
  116. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/tradingcodex_cli/commands/orders.py +0 -0
  117. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/tradingcodex_cli/commands/policy.py +0 -0
  118. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/tradingcodex_cli/commands/profile.py +0 -0
  119. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/tradingcodex_cli/commands/research.py +0 -0
  120. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/tradingcodex_cli/commands/skills.py +0 -0
  121. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/tradingcodex_cli/commands/strategies.py +0 -0
  122. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/tradingcodex_cli/commands/subagents.py +0 -0
  123. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/tradingcodex_cli/commands/utils.py +0 -0
  124. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/tradingcodex_cli/commands/workflow.py +0 -0
  125. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/tradingcodex_cli/commands/workspaces.py +0 -0
  126. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/tradingcodex_cli/generator.py +0 -0
  127. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/tradingcodex_cli/mcp_stdio.py +0 -0
  128. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/tradingcodex_cli/startup_status.py +0 -0
  129. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/tradingcodex_service/__init__.py +0 -0
  130. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/tradingcodex_service/admin.py +0 -0
  131. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/tradingcodex_service/application/__init__.py +0 -0
  132. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/tradingcodex_service/application/agents.py +0 -0
  133. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/tradingcodex_service/application/artifact_quality.py +0 -0
  134. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/tradingcodex_service/application/audit.py +0 -0
  135. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/tradingcodex_service/application/brokers.py +0 -0
  136. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/tradingcodex_service/application/common.py +0 -0
  137. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/tradingcodex_service/application/components.py +0 -0
  138. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/tradingcodex_service/application/context_budget.py +0 -0
  139. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/tradingcodex_service/application/decision_packages.py +0 -0
  140. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/tradingcodex_service/application/harness.py +0 -0
  141. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/tradingcodex_service/application/markdown_preview.py +0 -0
  142. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/tradingcodex_service/application/orders.py +0 -0
  143. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/tradingcodex_service/application/policy.py +0 -0
  144. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/tradingcodex_service/application/portfolio.py +0 -0
  145. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/tradingcodex_service/application/research.py +0 -0
  146. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/tradingcodex_service/application/runtime.py +0 -0
  147. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/tradingcodex_service/application/runtime_mode.py +0 -0
  148. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/tradingcodex_service/asgi.py +0 -0
  149. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/tradingcodex_service/mcp_runtime.py +0 -0
  150. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/tradingcodex_service/settings.py +0 -0
  151. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/tradingcodex_service/static/tradingcodex_admin/favicon.svg +0 -0
  152. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/tradingcodex_service/static/vendor/htmx/htmx.min.js +0 -0
  153. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/tradingcodex_service/templates/web/activity.html +0 -0
  154. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/tradingcodex_service/templates/web/agent_skills.html +0 -0
  155. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/tradingcodex_service/templates/web/agents.html +0 -0
  156. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/tradingcodex_service/templates/web/brokers.html +0 -0
  157. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/tradingcodex_service/templates/web/dashboard.html +0 -0
  158. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/tradingcodex_service/templates/web/decisions.html +0 -0
  159. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/tradingcodex_service/templates/web/fragments/role_inspector.html +0 -0
  160. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/tradingcodex_service/templates/web/fragments/starter_prompt.html +0 -0
  161. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/tradingcodex_service/templates/web/fragments/topology_canvas.html +0 -0
  162. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/tradingcodex_service/templates/web/fragments/workspace_card.html +0 -0
  163. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/tradingcodex_service/templates/web/harness.html +0 -0
  164. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/tradingcodex_service/templates/web/mcp_router.html +0 -0
  165. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/tradingcodex_service/templates/web/orders.html +0 -0
  166. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/tradingcodex_service/templates/web/policy.html +0 -0
  167. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/tradingcodex_service/templates/web/portfolio.html +0 -0
  168. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/tradingcodex_service/templates/web/research.html +0 -0
  169. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/tradingcodex_service/templates/web/starter_prompt.html +0 -0
  170. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/tradingcodex_service/templates/web/strategies.html +0 -0
  171. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/tradingcodex_service/urls.py +0 -0
  172. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/tradingcodex_service/web.py +0 -0
  173. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/tradingcodex_service/wsgi.py +0 -0
  174. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/__init__.py +0 -0
  175. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/audit/files/.tradingcodex/audit/README.md +0 -0
  176. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/audit/files/trading/audit/.gitkeep +0 -0
  177. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/audit/module.json +0 -0
  178. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/codex-base/files/.codex/config.toml +0 -0
  179. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/codex-base/files/.codex/hooks/tradingcodex_hook.py +0 -0
  180. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/codex-base/files/.codex/hooks.json +0 -0
  181. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/codex-base/files/.codex/prompts/base_instructions/head-manager.md +0 -0
  182. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/codex-base/files/.codex/rules/tradingcodex.rules +0 -0
  183. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/codex-base/files/.tradingcodex/capabilities.yaml +0 -0
  184. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/codex-base/files/.tradingcodex/cli.py +0 -0
  185. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/codex-base/files/.tradingcodex/config.yaml +0 -0
  186. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/codex-base/files/.tradingcodex/policies/policy-bindings.yaml +0 -0
  187. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/codex-base/files/.tradingcodex/policies/principals.yaml +0 -0
  188. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/codex-base/files/.tradingcodex/policies/roles.yaml +0 -0
  189. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/codex-base/files/AGENTS.md +0 -0
  190. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/codex-base/files/pyproject.toml +0 -0
  191. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/codex-base/files/tcx +0 -0
  192. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/codex-base/module.json +0 -0
  193. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/policies/access-policies.yaml +0 -0
  194. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/policies/restricted-list.yaml +0 -0
  195. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/schemas/approval_receipt.schema.json +0 -0
  196. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/schemas/audit_event.schema.json +0 -0
  197. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/schemas/evidence_pack.schema.json +0 -0
  198. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/schemas/execution_result.schema.json +0 -0
  199. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/schemas/fundamental_report.schema.json +0 -0
  200. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/schemas/news_report.schema.json +0 -0
  201. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/schemas/order_ticket.schema.json +0 -0
  202. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/schemas/portfolio_review.schema.json +0 -0
  203. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/schemas/postmortem_report.schema.json +0 -0
  204. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/schemas/research_artifact.schema.json +0 -0
  205. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/schemas/risk_report.schema.json +0 -0
  206. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/schemas/technical_report.schema.json +0 -0
  207. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/schemas/thesis.schema.json +0 -0
  208. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/schemas/valuation.schema.json +0 -0
  209. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/enforcement-guardrails/module.json +0 -0
  210. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/fixed-subagents/files/.codex/agents/execution-operator.toml +0 -0
  211. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/fixed-subagents/files/.codex/agents/fundamental-analyst.toml +0 -0
  212. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/fixed-subagents/files/.codex/agents/instrument-analyst.toml +0 -0
  213. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/fixed-subagents/files/.codex/agents/macro-analyst.toml +0 -0
  214. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/fixed-subagents/files/.codex/agents/news-analyst.toml +0 -0
  215. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/fixed-subagents/files/.codex/agents/portfolio-manager.toml +0 -0
  216. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/fixed-subagents/files/.codex/agents/risk-manager.toml +0 -0
  217. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/fixed-subagents/files/.codex/agents/technical-analyst.toml +0 -0
  218. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/fixed-subagents/files/.codex/agents/valuation-analyst.toml +0 -0
  219. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/fixed-subagents/files/.tradingcodex/mainagent/head-manager.yaml +0 -0
  220. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/fixed-subagents/files/.tradingcodex/mainagent/skill-change-proposals/.gitkeep +0 -0
  221. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/fixed-subagents/files/.tradingcodex/mainagent/subagent-registry.yaml +0 -0
  222. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/fixed-subagents/module.json +0 -0
  223. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/guidance-guardrails/files/.tradingcodex/guidance/guardrails.md +0 -0
  224. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/guidance-guardrails/files/.tradingcodex/guidance/task-quality-checklist.md +0 -0
  225. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/guidance-guardrails/module.json +0 -0
  226. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/information-barriers/files/.tradingcodex/policies/information-barriers.yaml +0 -0
  227. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/information-barriers/files/.tradingcodex/secrets.md +0 -0
  228. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/information-barriers/files/trading/approvals/.gitkeep +0 -0
  229. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/information-barriers/files/trading/forecasts/.gitkeep +0 -0
  230. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/information-barriers/files/trading/market-data/.gitkeep +0 -0
  231. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/information-barriers/files/trading/orders/approved/.gitkeep +0 -0
  232. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/information-barriers/files/trading/orders/draft/.gitkeep +0 -0
  233. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/information-barriers/files/trading/orders/executed/.gitkeep +0 -0
  234. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/information-barriers/files/trading/orders/rejected/.gitkeep +0 -0
  235. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/information-barriers/files/trading/portfolio/.gitkeep +0 -0
  236. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/information-barriers/files/trading/reports/fundamental/.gitkeep +0 -0
  237. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/information-barriers/files/trading/reports/instrument/.gitkeep +0 -0
  238. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/information-barriers/files/trading/reports/macro/.gitkeep +0 -0
  239. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/information-barriers/files/trading/reports/news/.gitkeep +0 -0
  240. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/information-barriers/files/trading/reports/policy/.gitkeep +0 -0
  241. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/information-barriers/files/trading/reports/portfolio/.gitkeep +0 -0
  242. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/information-barriers/files/trading/reports/postmortem/.gitkeep +0 -0
  243. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/information-barriers/files/trading/reports/risk/.gitkeep +0 -0
  244. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/information-barriers/files/trading/reports/technical/.gitkeep +0 -0
  245. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/information-barriers/files/trading/reports/valuation/.gitkeep +0 -0
  246. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/information-barriers/files/trading/research/.gitkeep +0 -0
  247. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/information-barriers/module.json +0 -0
  248. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/paper-trading/module.json +0 -0
  249. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/postmortem/files/.tradingcodex/workflows/postmortem.yaml +0 -0
  250. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/postmortem/module.json +0 -0
  251. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/repo-skills/files/.agents/skills/postmortem/SKILL.md +0 -0
  252. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/repo-skills/files/.agents/skills/postmortem/agents/openai.yaml +0 -0
  253. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/repo-skills/files/.agents/skills/strategy-creator/SKILL.md +0 -0
  254. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/repo-skills/files/.agents/skills/strategy-creator/agents/openai.yaml +0 -0
  255. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/repo-skills/files/.agents/skills/tcx-build/SKILL.md +0 -0
  256. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/repo-skills/files/.agents/skills/tcx-build/agents/openai.yaml +0 -0
  257. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/repo-skills/files/.agents/skills/tcx-server/agents/openai.yaml +0 -0
  258. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/repo-skills/files/.agents/skills/tcx-workflow/SKILL.md +0 -0
  259. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/repo-skills/files/.agents/skills/tcx-workflow/agents/openai.yaml +0 -0
  260. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/repo-skills/files/.agents/skills/tcx-workflow/references/decision-quality-spine.md +0 -0
  261. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/execution-operator/execute-paper-order/SKILL.md +0 -0
  262. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/execution-operator/execute-paper-order/agents/openai.yaml +0 -0
  263. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/fundamental-analyst/fundamental-analysis/SKILL.md +0 -0
  264. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/fundamental-analyst/fundamental-analysis/agents/openai.yaml +0 -0
  265. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/instrument-analyst/instrument-analysis/SKILL.md +0 -0
  266. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/instrument-analyst/instrument-analysis/agents/openai.yaml +0 -0
  267. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/macro-analyst/macro-analysis/SKILL.md +0 -0
  268. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/macro-analyst/macro-analysis/agents/openai.yaml +0 -0
  269. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/news-analyst/news-analysis/SKILL.md +0 -0
  270. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/news-analyst/news-analysis/agents/openai.yaml +0 -0
  271. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/portfolio-manager/create-order-ticket/SKILL.md +0 -0
  272. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/portfolio-manager/create-order-ticket/agents/openai.yaml +0 -0
  273. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/portfolio-manager/portfolio-review/SKILL.md +0 -0
  274. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/portfolio-manager/portfolio-review/agents/openai.yaml +0 -0
  275. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/risk-manager/approve-order/SKILL.md +0 -0
  276. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/risk-manager/approve-order/agents/openai.yaml +0 -0
  277. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/risk-manager/policy-review/SKILL.md +0 -0
  278. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/risk-manager/policy-review/agents/openai.yaml +0 -0
  279. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/risk-manager/review-risk/SKILL.md +0 -0
  280. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/risk-manager/review-risk/agents/openai.yaml +0 -0
  281. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/shared/anti-overfit-validation/SKILL.md +0 -0
  282. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/shared/anti-overfit-validation/agents/openai.yaml +0 -0
  283. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/shared/collect-evidence/SKILL.md +0 -0
  284. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/shared/collect-evidence/agents/openai.yaml +0 -0
  285. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/shared/external-data-source-gate/SKILL.md +0 -0
  286. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/shared/external-data-source-gate/agents/openai.yaml +0 -0
  287. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/shared/forecasting-discipline/SKILL.md +0 -0
  288. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/shared/forecasting-discipline/agents/openai.yaml +0 -0
  289. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/shared/numeric-data-qc/SKILL.md +0 -0
  290. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/shared/numeric-data-qc/agents/openai.yaml +0 -0
  291. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/shared/thesis-scenario-tree/SKILL.md +0 -0
  292. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/shared/thesis-scenario-tree/agents/openai.yaml +0 -0
  293. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/technical-analyst/technical-analysis/SKILL.md +0 -0
  294. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/technical-analyst/technical-analysis/agents/openai.yaml +0 -0
  295. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/valuation-analyst/valuation-review/SKILL.md +0 -0
  296. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/valuation-analyst/valuation-review/agents/openai.yaml +0 -0
  297. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/repo-skills/module.json +0 -0
  298. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/stub-execution/module.json +0 -0
  299. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/tradingcodex-mcp/files/.tradingcodex/mcp/enforcer/README.md +0 -0
  300. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/tradingcodex-mcp/files/.tradingcodex/mcp/gateway/README.md +0 -0
  301. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/tradingcodex-mcp/files/.tradingcodex/mcp/server.py +0 -0
  302. {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/tradingcodex-mcp/module.json +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: tradingcodex
3
- Version: 0.2.8
3
+ Version: 0.2.9
4
4
  Summary: Codex-native trading harness with a Django service plane and approved action boundary.
5
5
  Author: TradingCodex Authors
6
6
  License-Expression: Apache-2.0
@@ -141,7 +141,7 @@ python3.11 -m venv /tmp/tcx-testpypi
141
141
  /tmp/tcx-testpypi/bin/pip install \
142
142
  --index-url https://test.pypi.org/simple/ \
143
143
  --extra-index-url https://pypi.org/simple/ \
144
- tradingcodex==0.2.8
144
+ tradingcodex==0.2.9
145
145
  rm -rf /tmp/tcx-testpypi-smoke
146
146
  mkdir -p /tmp/tcx-testpypi-smoke
147
147
  cd /tmp/tcx-testpypi-smoke
@@ -170,7 +170,7 @@ After the PyPI workflow completes:
170
170
 
171
171
  ```bash
172
172
  python3.11 -m venv /tmp/tcx-pypi
173
- /tmp/tcx-pypi/bin/pip install tradingcodex==0.2.8
173
+ /tmp/tcx-pypi/bin/pip install tradingcodex==0.2.9
174
174
  rm -rf /tmp/tcx-pypi-smoke
175
175
  mkdir -p /tmp/tcx-pypi-smoke
176
176
  cd /tmp/tcx-pypi-smoke
@@ -261,7 +261,9 @@ Use PEP 440 versions:
261
261
  spine improvements after `0.2.6`
262
262
  - `0.2.8` for artifact-supervisor loop concurrency and run-specific workflow
263
263
  loop state after `0.2.7`
264
- - later patch releases for compatible fixes after `0.2.8`
264
+ - `0.2.9` for stale service replacement and web scroll-state fixes after
265
+ `0.2.8`
266
+ - later patch releases for compatible fixes after `0.2.9`
265
267
  - pre-releases such as `0.3.0a1`, `0.3.0b1`, or `0.3.0rc1` when preparing
266
268
  the next minor contract
267
269
 
@@ -305,6 +305,8 @@ service at `127.0.0.1:48267` while keeping MCP stdio stdout clean.
305
305
  If the port is already open, MCP startup verifies that the existing process is
306
306
  a TradingCodex service with the same package version and central DB path before
307
307
  using it.
308
+ When the existing process is an older TradingCodex service backed by the same
309
+ central DB, MCP autostart may stop it and launch the current package instead.
308
310
 
309
311
  The autostart path must be:
310
312
 
@@ -322,7 +324,7 @@ or performs package refresh on its own. The emitted context uses marker
322
324
  `allowed_next_actions`, and `routing_status`.
323
325
 
324
326
  `head-manager` uses `$tcx-server` for service/MCP doctor checks,
325
- `./tcx service status`, and `./tcx service ensure`. It tells the user that the
327
+ `./tcx service status`, `./tcx service stop`, and `./tcx service ensure`. It tells the user that the
326
328
  local dashboard is available at `http://127.0.0.1:48267/` and opens it only
327
329
  when explicitly asked. If project MCP config was created or changed, the user
328
330
  must fully quit and restart Codex and start a new thread because Codex may not
@@ -359,6 +359,7 @@ Top-level commands:
359
359
  - `tcx mcp stdio`
360
360
  - `tcx service runserver`
361
361
  - `tcx service ensure`
362
+ - `tcx service stop`
362
363
  - `tcx service status [--json]`
363
364
 
364
365
  Generated workspace wrapper commands:
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "tradingcodex"
7
- version = "0.2.8"
7
+ version = "0.2.9"
8
8
  description = "Codex-native trading harness with a Django service plane and approved action boundary."
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.11,<3.15"
@@ -137,7 +137,7 @@ def test_service_autostart_rejects_version_and_db_mismatch(monkeypatch) -> None:
137
137
  )
138
138
  with pytest.raises(RuntimeError, match="version mismatch") as version_mismatch:
139
139
  service_autostart._assert_compatible_service("127.0.0.1", 48267)
140
- assert "Stop the older TradingCodex service" in str(version_mismatch.value)
140
+ assert "tcx service stop 127.0.0.1:48267" in str(version_mismatch.value)
141
141
 
142
142
  monkeypatch.setattr(service_autostart, "tradingcodex_db_path", lambda: Path("/tmp/current.sqlite3"))
143
143
  monkeypatch.setattr(
@@ -150,6 +150,38 @@ def test_service_autostart_rejects_version_and_db_mismatch(monkeypatch) -> None:
150
150
  assert "same central DB" in str(db_mismatch.value)
151
151
 
152
152
 
153
+ def test_service_autostart_replaces_stale_same_db_service(monkeypatch, tmp_path: Path) -> None:
154
+ from tradingcodex_cli import service_autostart
155
+
156
+ current_db = tmp_path / "current.sqlite3"
157
+ state = {"open": True, "version": "0.0.1", "stopped": False, "started": False}
158
+
159
+ monkeypatch.setattr(service_autostart, "tradingcodex_db_path", lambda: current_db)
160
+ monkeypatch.setattr(service_autostart, "_tcp_open", lambda host, port: state["open"])
161
+ monkeypatch.setattr(
162
+ service_autostart,
163
+ "_service_health",
164
+ lambda host, port: {"service": "tradingcodex", "version": state["version"], "db_path": str(current_db)},
165
+ )
166
+
167
+ def stop(addr: str, timeout: float = 5.0) -> bool:
168
+ state["stopped"] = True
169
+ state["open"] = False
170
+ return True
171
+
172
+ def start(*args) -> None:
173
+ state["started"] = True
174
+ state["open"] = True
175
+ state["version"] = TRADINGCODEX_VERSION
176
+
177
+ monkeypatch.setattr(service_autostart, "stop_service", stop)
178
+ monkeypatch.setattr(service_autostart, "_start_service", start)
179
+
180
+ assert service_autostart.ensure_service_up(tmp_path, timeout=0.05) is True
181
+ assert state["stopped"] is True
182
+ assert state["started"] is True
183
+
184
+
153
185
  def test_service_status_reports_actionable_state(monkeypatch) -> None:
154
186
  from tradingcodex_cli import service_autostart
155
187
 
@@ -171,6 +203,7 @@ def test_service_status_reports_actionable_state(monkeypatch) -> None:
171
203
  assert mismatch["compatible"] is False
172
204
  assert mismatch["issue"] == "version_mismatch"
173
205
  assert mismatch["package_version"] == TRADINGCODEX_VERSION
206
+ assert "tcx service stop 127.0.0.1:48267" in mismatch["next_action"]
174
207
 
175
208
  monkeypatch.setattr(service_autostart, "tradingcodex_db_path", lambda: Path("/tmp/current.sqlite3"))
176
209
  monkeypatch.setattr(
@@ -213,9 +246,11 @@ def test_service_ensure_uses_autostart_helper(monkeypatch, tmp_path: Path, capsy
213
246
  from tradingcodex_cli import service_autostart
214
247
 
215
248
  calls: list[tuple[Path, str]] = []
249
+ stopped: list[str] = []
216
250
  monkeypatch.chdir(tmp_path)
217
251
  monkeypatch.delenv("TRADINGCODEX_WORKSPACE_ROOT", raising=False)
218
252
  monkeypatch.setattr(service_autostart, "ensure_service_up", lambda root, addr: calls.append((root, addr)) or True)
253
+ monkeypatch.setattr(service_autostart, "stop_service", lambda addr: stopped.append(addr) or True)
219
254
 
220
255
  cli_main.service(["ensure"])
221
256
 
@@ -224,6 +259,11 @@ def test_service_ensure_uses_autostart_helper(monkeypatch, tmp_path: Path, capsy
224
259
  assert "TradingCodex service started at http://127.0.0.1:48267/" in output
225
260
  assert "Health: http://127.0.0.1:48267/api/health" in output
226
261
 
262
+ cli_main.service(["stop"])
263
+
264
+ assert stopped == ["127.0.0.1:48267"]
265
+ assert "TradingCodex service stopped at http://127.0.0.1:48267/" in capsys.readouterr().out
266
+
227
267
 
228
268
  def test_service_status_cli_supports_plain_and_json(monkeypatch, tmp_path: Path, capsys) -> None:
229
269
  from tradingcodex_cli import __main__ as cli_main
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: tradingcodex
3
- Version: 0.2.8
3
+ Version: 0.2.9
4
4
  Summary: Codex-native trading harness with a Django service plane and approved action boundary.
5
5
  Author: TradingCodex Authors
6
6
  License-Expression: Apache-2.0
@@ -119,6 +119,7 @@ Usage:
119
119
  tcx mcp stdio|external
120
120
  tcx service runserver [addrport] [django runserver args]
121
121
  tcx service ensure [addrport]
122
+ tcx service stop [addrport]
122
123
  tcx service status [addrport] [--json]
123
124
  """)
124
125
 
@@ -166,8 +166,15 @@ def service(argv: list[str]) -> None:
166
166
  print(f"TradingCodex service {'started' if started else 'ready'} at {dashboard_url}")
167
167
  print(f"Health: {dashboard_url.rstrip('/')}/api/health")
168
168
  return
169
+ if sub == "stop":
170
+ from tradingcodex_cli.service_autostart import service_http_url, stop_service
171
+
172
+ addr = argv[1] if len(argv) > 1 else DEFAULT_SERVICE_ADDR
173
+ stopped = stop_service(addr)
174
+ print(f"TradingCodex service {'stopped' if stopped else 'not running'} at {service_http_url(addr)}")
175
+ return
169
176
  if sub != "runserver":
170
- raise ValueError(f"Usage: {PROGRAM_NAME} service runserver [addrport] [django runserver args]\n {PROGRAM_NAME} service ensure [addrport]\n {PROGRAM_NAME} service status [addrport] [--json]")
177
+ raise ValueError(f"Usage: {PROGRAM_NAME} service runserver [addrport] [django runserver args]\n {PROGRAM_NAME} service ensure [addrport]\n {PROGRAM_NAME} service stop [addrport]\n {PROGRAM_NAME} service status [addrport] [--json]")
171
178
  from django.core.management import execute_from_command_line
172
179
  from tradingcodex_cli.service_autostart import compatible_service_running, service_http_url
173
180
 
@@ -2,6 +2,7 @@ from __future__ import annotations
2
2
 
3
3
  import os
4
4
  import json
5
+ import signal
5
6
  import socket
6
7
  import subprocess
7
8
  import sys
@@ -28,13 +29,13 @@ def maybe_autostart_service(workspace_root: Path, source_root: Path | None = Non
28
29
 
29
30
  def ensure_service_up(workspace_root: Path, addr: str = DEFAULT_SERVICE_ADDR, source_root: Path | None = None, timeout: float = 8.0) -> bool:
30
31
  host, port = _parse_addr(addr)
31
- if _tcp_open(host, port):
32
- _assert_compatible_service(host, port)
32
+ if _tcp_open(host, port) and _compatible_service(host, port):
33
33
  return False
34
34
  with tradingcodex_file_lock(f"service-{host}-{port}"):
35
- if _tcp_open(host, port):
36
- _assert_compatible_service(host, port)
35
+ if _tcp_open(host, port) and _compatible_service(host, port):
37
36
  return False
37
+ if _tcp_open(host, port):
38
+ _replace_stale_tradingcodex_service_or_raise(host, port, timeout=timeout)
38
39
  _start_service(workspace_root, addr, source_root)
39
40
  deadline = time.monotonic() + timeout
40
41
  while time.monotonic() < deadline:
@@ -53,6 +54,30 @@ def compatible_service_running(addr: str = DEFAULT_SERVICE_ADDR) -> bool:
53
54
  return True
54
55
 
55
56
 
57
+ def stop_service(addr: str = DEFAULT_SERVICE_ADDR, timeout: float = 5.0) -> bool:
58
+ host, port = _parse_addr(addr)
59
+ normalized_addr = f"{host}:{port}"
60
+ if not _tcp_open(host, port):
61
+ return False
62
+ health = _service_health(host, port)
63
+ if not health or health.get("service") != "tradingcodex":
64
+ raise RuntimeError(f"{normalized_addr} is not a TradingCodex service; stop it outside tcx or choose a free service address.")
65
+ pids = _service_pids(host, port, health)
66
+ if not pids:
67
+ raise RuntimeError(f"Could not find the TradingCodex service process on {normalized_addr}; stop the process using port {port} and retry.")
68
+ for pid in pids:
69
+ try:
70
+ os.kill(pid, signal.SIGTERM)
71
+ except ProcessLookupError:
72
+ pass
73
+ deadline = time.monotonic() + timeout
74
+ while time.monotonic() < deadline:
75
+ if not _tcp_open(host, port):
76
+ return True
77
+ time.sleep(0.2)
78
+ raise RuntimeError(f"Timed out stopping TradingCodex service on {normalized_addr}.")
79
+
80
+
56
81
  def service_status(addr: str = DEFAULT_SERVICE_ADDR) -> dict:
57
82
  host, port = _parse_addr(addr)
58
83
  normalized_addr = f"{host}:{port}"
@@ -86,7 +111,7 @@ def service_status(addr: str = DEFAULT_SERVICE_ADDR) -> dict:
86
111
  })
87
112
  if status["version"] != TRADINGCODEX_VERSION:
88
113
  status["issue"] = "version_mismatch"
89
- status["next_action"] = "Stop the older TradingCodex service or choose a free service address, then restart Codex if MCP uses the default address."
114
+ status["next_action"] = f"Run `tcx service stop {normalized_addr}` and then restart Codex if MCP uses the default address."
90
115
  return status
91
116
  if status["db_path"] and status["db_path"] != current_db:
92
117
  status["issue"] = "db_mismatch"
@@ -149,6 +174,19 @@ def _compatible_service(host: str, port: int) -> bool:
149
174
  return False
150
175
 
151
176
 
177
+ def _replace_stale_tradingcodex_service_or_raise(host: str, port: int, *, timeout: float) -> None:
178
+ health = _service_health(host, port)
179
+ service_db = str(health.get("db_path") or "")
180
+ if (
181
+ health.get("service") == "tradingcodex"
182
+ and health.get("version") != TRADINGCODEX_VERSION
183
+ and (not service_db or service_db == str(tradingcodex_db_path()))
184
+ ):
185
+ stop_service(f"{host}:{port}", timeout=max(1.0, min(timeout, 5.0)))
186
+ return
187
+ _assert_compatible_service(host, port)
188
+
189
+
152
190
  def _assert_compatible_service(host: str, port: int) -> None:
153
191
  health = _service_health(host, port)
154
192
  addr = f"{host}:{port}"
@@ -160,8 +198,8 @@ def _assert_compatible_service(host: str, port: int) -> None:
160
198
  if health.get("version") != TRADINGCODEX_VERSION:
161
199
  raise RuntimeError(
162
200
  f"TradingCodex service version mismatch: service={health.get('version')} package={TRADINGCODEX_VERSION}. "
163
- f"Stop the older TradingCodex service at {service_http_url(addr)} "
164
- "or choose a free service address, then fully restart Codex if project MCP uses the default address."
201
+ f"Run `tcx service stop {addr}` or choose a free service address, "
202
+ "then fully restart Codex if project MCP uses the default address."
165
203
  )
166
204
  service_db = str(health.get("db_path") or "")
167
205
  current_db = str(tradingcodex_db_path())
@@ -182,3 +220,20 @@ def _service_health(host: str, port: int) -> dict:
182
220
  return data if isinstance(data, dict) else {}
183
221
  except Exception:
184
222
  return {}
223
+
224
+
225
+ def _service_pids(host: str, port: int, health: dict) -> list[int]:
226
+ pid = health.get("pid")
227
+ pids = {int(pid)} if isinstance(pid, int) and pid > 0 else set()
228
+ try:
229
+ result = subprocess.run(
230
+ ["lsof", f"-tiTCP:{port}", "-sTCP:LISTEN"],
231
+ text=True,
232
+ capture_output=True,
233
+ timeout=1,
234
+ check=False,
235
+ )
236
+ pids.update(int(line) for line in result.stdout.splitlines() if line.strip().isdigit())
237
+ except Exception:
238
+ pass
239
+ return sorted(pids)
@@ -265,6 +265,7 @@ def health(request):
265
265
  "service": "tradingcodex",
266
266
  "version": __version__,
267
267
  "db_path": str(tradingcodex_db_path()),
268
+ "pid": os.getpid(),
268
269
  "central_local_service": True,
269
270
  "process_scope": os.environ.get("TRADINGCODEX_MCP_SCOPE", "local-service"),
270
271
  }
@@ -631,6 +631,7 @@ pre {
631
631
  .tc-main-shell {
632
632
  min-width: 0;
633
633
  overflow: auto;
634
+ overflow-anchor: none;
634
635
  }
635
636
 
636
637
  .tc-content {
@@ -179,8 +179,12 @@
179
179
  });
180
180
  window.addEventListener("pagehide", saveScroll);
181
181
  window.addEventListener("beforeunload", saveScroll);
182
+ document.addEventListener("htmx:beforeRequest", saveScroll);
183
+ document.addEventListener("htmx:afterSettle", () => {
184
+ if (!window.location.hash) restoreScroll();
185
+ });
182
186
  document.addEventListener("click", (event) => {
183
- const link = event.target.closest(statefulLinks);
187
+ const link = event.target instanceof Element ? event.target.closest(statefulLinks) : null;
184
188
  if (link) saveScroll();
185
189
  });
186
190
  })();
@@ -6,9 +6,9 @@
6
6
  <meta name="viewport" content="width=device-width, initial-scale=1">
7
7
  <title>{% block title %}tcx{% endblock %}</title>
8
8
  <link rel="icon" type="image/svg+xml" href="{% static 'tradingcodex_admin/favicon.svg' %}">
9
- <link rel="stylesheet" href="{% static 'tradingcodex_web/app.css' %}?v=tcx-base-9">
9
+ <link rel="stylesheet" href="{% static 'tradingcodex_web/app.css' %}?v=tcx-base-10">
10
10
  <script src="{% static 'vendor/htmx/htmx.min.js' %}" defer></script>
11
- <script src="{% static 'tradingcodex_web/app.js' %}?v=tcx-web-3" defer></script>
11
+ <script src="{% static 'tradingcodex_web/app.js' %}?v=tcx-web-4" defer></script>
12
12
  </head>
13
13
  <body class="tc-web-body">
14
14
  <a class="tc-skip-link" href="#main-content">Skip to content</a>
@@ -0,0 +1 @@
1
+ TRADINGCODEX_VERSION = "0.2.9"
@@ -14,7 +14,7 @@ Use this skill for operate-plane TradingCodex status checks, service recovery, d
14
14
  3. Use `./tcx mode status` and `./tcx update status --json` for mode/update posture.
15
15
  4. Use read-only connector commands and MCP tools for broker profile, capability, instrument constraints, sync state, and order status.
16
16
  5. If update or build work is requested but build is not enabled, explain that Codex full access plus `tcx mode set build --reason <reason>` is required, or give the terminal command.
17
- 6. If startup context reports `service_issue=version_mismatch`, `db_mismatch`, or `port_occupied`, report the issue with service/package versions or DB paths when present, and give the recorded next action before opening or recommending the dashboard.
17
+ 6. If startup context reports `service_issue=version_mismatch`, `db_mismatch`, or `port_occupied`, report the issue with service/package versions or DB paths when present, and give the recorded next action before opening or recommending the dashboard. For a stale same-DB TradingCodex service, prefer `./tcx service stop` and Codex restart so MCP autostart can launch the current package.
18
18
 
19
19
  ## Hard Stops
20
20
 
@@ -1 +0,0 @@
1
- TRADINGCODEX_VERSION = "0.2.8"
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes