tradingcodex 0.3.2__tar.gz → 0.3.3__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 (310) hide show
  1. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/PKG-INFO +2 -2
  2. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/README.md +1 -1
  3. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/docs/README.md +1 -1
  4. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/docs/deployment.md +13 -45
  5. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/docs/generated-workspaces.md +7 -3
  6. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/pyproject.toml +1 -1
  7. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/tests/test_python_migration.py +184 -3
  8. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/tradingcodex.egg-info/PKG-INFO +2 -2
  9. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/tradingcodex_cli/commands/bootstrap.py +1 -1
  10. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/tradingcodex_cli/service_autostart.py +28 -4
  11. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/tradingcodex_cli/startup_status.py +39 -7
  12. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/tradingcodex_service/mcp_runtime.py +1 -1
  13. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/tradingcodex_service/static/tradingcodex_web/app.css +2 -2
  14. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/tradingcodex_service/templates/web/agents.html +15 -12
  15. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/tradingcodex_service/templates/web/fragments/starter_prompt.html +53 -59
  16. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/tradingcodex_service/templates/web/research.html +15 -12
  17. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/tradingcodex_service/templates/web/strategies.html +15 -12
  18. tradingcodex-0.3.3/tradingcodex_service/version.py +1 -0
  19. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/codex-base/files/tcx +0 -3
  20. tradingcodex-0.3.2/tradingcodex_service/version.py +0 -1
  21. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/CONTRIBUTING.md +0 -0
  22. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/LICENSE +0 -0
  23. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/MANIFEST.in +0 -0
  24. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/NOTICE +0 -0
  25. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/TRADEMARKS.md +0 -0
  26. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/apps/__init__.py +0 -0
  27. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/apps/audit/__init__.py +0 -0
  28. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/apps/audit/admin.py +0 -0
  29. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/apps/audit/apps.py +0 -0
  30. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/apps/audit/migrations/0001_initial.py +0 -0
  31. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/apps/audit/migrations/__init__.py +0 -0
  32. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/apps/audit/models.py +0 -0
  33. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/apps/harness/__init__.py +0 -0
  34. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/apps/harness/admin.py +0 -0
  35. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/apps/harness/apps.py +0 -0
  36. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/apps/harness/migrations/0001_initial.py +0 -0
  37. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/apps/harness/migrations/__init__.py +0 -0
  38. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/apps/harness/models.py +0 -0
  39. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/apps/harness/templatetags/__init__.py +0 -0
  40. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/apps/integrations/__init__.py +0 -0
  41. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/apps/integrations/admin.py +0 -0
  42. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/apps/integrations/apps.py +0 -0
  43. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/apps/integrations/migrations/0001_initial.py +0 -0
  44. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/apps/integrations/migrations/0002_brokerconnection_brokeraccount_instrumentmap.py +0 -0
  45. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/apps/integrations/migrations/__init__.py +0 -0
  46. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/apps/integrations/models.py +0 -0
  47. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/apps/mcp/__init__.py +0 -0
  48. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/apps/mcp/admin.py +0 -0
  49. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/apps/mcp/apps.py +0 -0
  50. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/apps/mcp/migrations/0001_initial.py +0 -0
  51. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/apps/mcp/migrations/__init__.py +0 -0
  52. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/apps/mcp/models.py +0 -0
  53. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/apps/mcp/services.py +0 -0
  54. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/apps/orders/__init__.py +0 -0
  55. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/apps/orders/admin.py +0 -0
  56. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/apps/orders/apps.py +0 -0
  57. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/apps/orders/migrations/0001_initial.py +0 -0
  58. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/apps/orders/migrations/0002_approvalreceipt_approved_order_type_and_more.py +0 -0
  59. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/apps/orders/migrations/0003_migrate_orderintent_to_orderticket.py +0 -0
  60. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/apps/orders/migrations/0004_remove_order_intent_compat_fields.py +0 -0
  61. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/apps/orders/migrations/__init__.py +0 -0
  62. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/apps/orders/models.py +0 -0
  63. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/apps/orders/services.py +0 -0
  64. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/apps/policy/__init__.py +0 -0
  65. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/apps/policy/admin.py +0 -0
  66. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/apps/policy/apps.py +0 -0
  67. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/apps/policy/migrations/0001_initial.py +0 -0
  68. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/apps/policy/migrations/__init__.py +0 -0
  69. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/apps/policy/models.py +0 -0
  70. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/apps/policy/services.py +0 -0
  71. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/apps/portfolio/__init__.py +0 -0
  72. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/apps/portfolio/admin.py +0 -0
  73. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/apps/portfolio/apps.py +0 -0
  74. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/apps/portfolio/migrations/0001_initial.py +0 -0
  75. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/apps/portfolio/migrations/0002_brokersyncrun_portfolioledgerevent_reconciliationrun.py +0 -0
  76. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/apps/portfolio/migrations/__init__.py +0 -0
  77. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/apps/portfolio/models.py +0 -0
  78. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/apps/workflows/__init__.py +0 -0
  79. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/apps/workflows/admin.py +0 -0
  80. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/apps/workflows/apps.py +0 -0
  81. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/apps/workflows/migrations/0001_initial.py +0 -0
  82. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/apps/workflows/migrations/__init__.py +0 -0
  83. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/apps/workflows/models.py +0 -0
  84. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/assets/tradingcodex-banner.svg +0 -0
  85. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/docs/artifact-supervisor-loop-prd.md +0 -0
  86. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/docs/components.md +0 -0
  87. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/docs/core-concepts-and-rules.md +0 -0
  88. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/docs/financial-workflow-references.md +0 -0
  89. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/docs/guardrails.md +0 -0
  90. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/docs/harness.md +0 -0
  91. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/docs/improvement-loop.md +0 -0
  92. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/docs/interfaces-and-surfaces.md +0 -0
  93. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/docs/licensing-and-commercialization.md +0 -0
  94. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/docs/product-direction.md +0 -0
  95. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/docs/research-memory-and-artifacts.md +0 -0
  96. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/docs/roles-skills-and-workflows.md +0 -0
  97. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/docs/safety-policy-and-execution.md +0 -0
  98. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/docs/system-architecture.md +0 -0
  99. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/docs/user-facing-skills.md +0 -0
  100. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/docs/validation-and-test-plan.md +0 -0
  101. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/install.sh +0 -0
  102. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/installation.md +0 -0
  103. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/setup.cfg +0 -0
  104. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/tests/test_broker_center_prd.py +0 -0
  105. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/tests/test_e2e_user_scenarios.py +0 -0
  106. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/tradingcodex.egg-info/SOURCES.txt +0 -0
  107. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/tradingcodex.egg-info/dependency_links.txt +0 -0
  108. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/tradingcodex.egg-info/entry_points.txt +0 -0
  109. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/tradingcodex.egg-info/requires.txt +0 -0
  110. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/tradingcodex.egg-info/top_level.txt +0 -0
  111. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/tradingcodex_cli/__init__.py +0 -0
  112. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/tradingcodex_cli/__main__.py +0 -0
  113. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/tradingcodex_cli/commands/__init__.py +0 -0
  114. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/tradingcodex_cli/commands/connectors.py +0 -0
  115. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/tradingcodex_cli/commands/db.py +0 -0
  116. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/tradingcodex_cli/commands/decision.py +0 -0
  117. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/tradingcodex_cli/commands/doctor.py +0 -0
  118. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/tradingcodex_cli/commands/mcp.py +0 -0
  119. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/tradingcodex_cli/commands/mode.py +0 -0
  120. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/tradingcodex_cli/commands/orders.py +0 -0
  121. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/tradingcodex_cli/commands/policy.py +0 -0
  122. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/tradingcodex_cli/commands/profile.py +0 -0
  123. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/tradingcodex_cli/commands/research.py +0 -0
  124. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/tradingcodex_cli/commands/skills.py +0 -0
  125. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/tradingcodex_cli/commands/strategies.py +0 -0
  126. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/tradingcodex_cli/commands/subagents.py +0 -0
  127. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/tradingcodex_cli/commands/utils.py +0 -0
  128. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/tradingcodex_cli/commands/workflow.py +0 -0
  129. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/tradingcodex_cli/commands/workspaces.py +0 -0
  130. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/tradingcodex_cli/generator.py +0 -0
  131. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/tradingcodex_cli/mcp_stdio.py +0 -0
  132. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/tradingcodex_service/__init__.py +0 -0
  133. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/tradingcodex_service/admin.py +0 -0
  134. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/tradingcodex_service/api.py +0 -0
  135. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/tradingcodex_service/application/__init__.py +0 -0
  136. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/tradingcodex_service/application/agents.py +0 -0
  137. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/tradingcodex_service/application/artifact_quality.py +0 -0
  138. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/tradingcodex_service/application/audit.py +0 -0
  139. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/tradingcodex_service/application/brokers.py +0 -0
  140. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/tradingcodex_service/application/common.py +0 -0
  141. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/tradingcodex_service/application/components.py +0 -0
  142. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/tradingcodex_service/application/context_budget.py +0 -0
  143. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/tradingcodex_service/application/decision_packages.py +0 -0
  144. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/tradingcodex_service/application/harness.py +0 -0
  145. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/tradingcodex_service/application/markdown_preview.py +0 -0
  146. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/tradingcodex_service/application/orders.py +0 -0
  147. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/tradingcodex_service/application/policy.py +0 -0
  148. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/tradingcodex_service/application/portfolio.py +0 -0
  149. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/tradingcodex_service/application/research.py +0 -0
  150. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/tradingcodex_service/application/runtime.py +0 -0
  151. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/tradingcodex_service/application/runtime_mode.py +0 -0
  152. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/tradingcodex_service/application/workflow_planner.py +0 -0
  153. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/tradingcodex_service/application/workflow_routing.py +0 -0
  154. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/tradingcodex_service/asgi.py +0 -0
  155. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/tradingcodex_service/settings.py +0 -0
  156. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/tradingcodex_service/static/tradingcodex_admin/favicon.svg +0 -0
  157. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/tradingcodex_service/static/tradingcodex_web/app.js +0 -0
  158. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/tradingcodex_service/static/vendor/htmx/htmx.min.js +0 -0
  159. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/tradingcodex_service/templates/web/activity.html +0 -0
  160. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/tradingcodex_service/templates/web/agent_skills.html +0 -0
  161. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/tradingcodex_service/templates/web/base.html +0 -0
  162. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/tradingcodex_service/templates/web/brokers.html +0 -0
  163. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/tradingcodex_service/templates/web/dashboard.html +0 -0
  164. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/tradingcodex_service/templates/web/decisions.html +0 -0
  165. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/tradingcodex_service/templates/web/fragments/role_inspector.html +0 -0
  166. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/tradingcodex_service/templates/web/fragments/topology_canvas.html +0 -0
  167. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/tradingcodex_service/templates/web/fragments/workspace_card.html +0 -0
  168. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/tradingcodex_service/templates/web/harness.html +0 -0
  169. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/tradingcodex_service/templates/web/mcp_router.html +0 -0
  170. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/tradingcodex_service/templates/web/orders.html +0 -0
  171. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/tradingcodex_service/templates/web/policy.html +0 -0
  172. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/tradingcodex_service/templates/web/portfolio.html +0 -0
  173. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/tradingcodex_service/templates/web/starter_prompt.html +0 -0
  174. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/tradingcodex_service/urls.py +0 -0
  175. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/tradingcodex_service/web.py +0 -0
  176. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/tradingcodex_service/wsgi.py +0 -0
  177. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/__init__.py +0 -0
  178. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/audit/files/.tradingcodex/audit/README.md +0 -0
  179. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/audit/files/trading/audit/.gitkeep +0 -0
  180. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/audit/module.json +0 -0
  181. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/codex-base/files/.codex/config.toml +0 -0
  182. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/codex-base/files/.codex/hooks/tradingcodex_hook.py +0 -0
  183. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/codex-base/files/.codex/hooks.json +0 -0
  184. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/codex-base/files/.codex/prompts/base_instructions/head-manager.md +0 -0
  185. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/codex-base/files/.codex/rules/tradingcodex.rules +0 -0
  186. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/codex-base/files/.tradingcodex/capabilities.yaml +0 -0
  187. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/codex-base/files/.tradingcodex/cli.py +0 -0
  188. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/codex-base/files/.tradingcodex/config.yaml +0 -0
  189. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/codex-base/files/.tradingcodex/policies/policy-bindings.yaml +0 -0
  190. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/codex-base/files/.tradingcodex/policies/principals.yaml +0 -0
  191. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/codex-base/files/.tradingcodex/policies/roles.yaml +0 -0
  192. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/codex-base/files/AGENTS.md +0 -0
  193. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/codex-base/files/pyproject.toml +0 -0
  194. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/codex-base/module.json +0 -0
  195. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/policies/access-policies.yaml +0 -0
  196. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/policies/restricted-list.yaml +0 -0
  197. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/schemas/approval_receipt.schema.json +0 -0
  198. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/schemas/audit_event.schema.json +0 -0
  199. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/schemas/evidence_pack.schema.json +0 -0
  200. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/schemas/execution_result.schema.json +0 -0
  201. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/schemas/fundamental_report.schema.json +0 -0
  202. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/schemas/news_report.schema.json +0 -0
  203. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/schemas/order_ticket.schema.json +0 -0
  204. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/schemas/portfolio_review.schema.json +0 -0
  205. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/schemas/postmortem_report.schema.json +0 -0
  206. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/schemas/research_artifact.schema.json +0 -0
  207. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/schemas/risk_report.schema.json +0 -0
  208. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/schemas/technical_report.schema.json +0 -0
  209. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/schemas/thesis.schema.json +0 -0
  210. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/schemas/valuation.schema.json +0 -0
  211. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/enforcement-guardrails/module.json +0 -0
  212. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/fixed-subagents/files/.codex/agents/execution-operator.toml +0 -0
  213. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/fixed-subagents/files/.codex/agents/fundamental-analyst.toml +0 -0
  214. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/fixed-subagents/files/.codex/agents/instrument-analyst.toml +0 -0
  215. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/fixed-subagents/files/.codex/agents/judgment-reviewer.toml +0 -0
  216. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/fixed-subagents/files/.codex/agents/macro-analyst.toml +0 -0
  217. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/fixed-subagents/files/.codex/agents/news-analyst.toml +0 -0
  218. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/fixed-subagents/files/.codex/agents/portfolio-manager.toml +0 -0
  219. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/fixed-subagents/files/.codex/agents/risk-manager.toml +0 -0
  220. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/fixed-subagents/files/.codex/agents/technical-analyst.toml +0 -0
  221. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/fixed-subagents/files/.codex/agents/valuation-analyst.toml +0 -0
  222. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/fixed-subagents/files/.tradingcodex/mainagent/skill-change-proposals/.gitkeep +0 -0
  223. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/fixed-subagents/module.json +0 -0
  224. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/guidance-guardrails/files/.tradingcodex/guidance/guardrails.md +0 -0
  225. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/guidance-guardrails/files/.tradingcodex/guidance/task-quality-checklist.md +0 -0
  226. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/guidance-guardrails/module.json +0 -0
  227. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/information-barriers/files/.tradingcodex/policies/information-barriers.yaml +0 -0
  228. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/information-barriers/files/.tradingcodex/secrets.md +0 -0
  229. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/information-barriers/files/trading/approvals/.gitkeep +0 -0
  230. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/information-barriers/files/trading/forecasts/.gitkeep +0 -0
  231. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/information-barriers/files/trading/market-data/.gitkeep +0 -0
  232. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/information-barriers/files/trading/orders/approved/.gitkeep +0 -0
  233. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/information-barriers/files/trading/orders/draft/.gitkeep +0 -0
  234. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/information-barriers/files/trading/orders/executed/.gitkeep +0 -0
  235. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/information-barriers/files/trading/orders/rejected/.gitkeep +0 -0
  236. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/information-barriers/files/trading/portfolio/.gitkeep +0 -0
  237. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/information-barriers/files/trading/reports/fundamental/.gitkeep +0 -0
  238. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/information-barriers/files/trading/reports/instrument/.gitkeep +0 -0
  239. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/information-barriers/files/trading/reports/macro/.gitkeep +0 -0
  240. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/information-barriers/files/trading/reports/news/.gitkeep +0 -0
  241. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/information-barriers/files/trading/reports/policy/.gitkeep +0 -0
  242. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/information-barriers/files/trading/reports/portfolio/.gitkeep +0 -0
  243. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/information-barriers/files/trading/reports/postmortem/.gitkeep +0 -0
  244. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/information-barriers/files/trading/reports/risk/.gitkeep +0 -0
  245. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/information-barriers/files/trading/reports/technical/.gitkeep +0 -0
  246. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/information-barriers/files/trading/reports/valuation/.gitkeep +0 -0
  247. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/information-barriers/files/trading/research/.gitkeep +0 -0
  248. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/information-barriers/module.json +0 -0
  249. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/paper-trading/module.json +0 -0
  250. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/postmortem/files/.tradingcodex/workflows/postmortem.yaml +0 -0
  251. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/postmortem/module.json +0 -0
  252. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/repo-skills/files/.agents/skills/automate-workflow/SKILL.md +0 -0
  253. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/repo-skills/files/.agents/skills/automate-workflow/agents/openai.yaml +0 -0
  254. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/repo-skills/files/.agents/skills/plan-workflow/SKILL.md +0 -0
  255. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/repo-skills/files/.agents/skills/plan-workflow/agents/openai.yaml +0 -0
  256. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/repo-skills/files/.agents/skills/postmortem/SKILL.md +0 -0
  257. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/repo-skills/files/.agents/skills/postmortem/agents/openai.yaml +0 -0
  258. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/repo-skills/files/.agents/skills/strategy-creator/SKILL.md +0 -0
  259. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/repo-skills/files/.agents/skills/strategy-creator/agents/openai.yaml +0 -0
  260. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/repo-skills/files/.agents/skills/tcx-build/SKILL.md +0 -0
  261. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/repo-skills/files/.agents/skills/tcx-build/agents/openai.yaml +0 -0
  262. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/repo-skills/files/.agents/skills/tcx-server/SKILL.md +0 -0
  263. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/repo-skills/files/.agents/skills/tcx-server/agents/openai.yaml +0 -0
  264. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/repo-skills/files/.agents/skills/tcx-workflow/SKILL.md +0 -0
  265. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/repo-skills/files/.agents/skills/tcx-workflow/agents/openai.yaml +0 -0
  266. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/repo-skills/files/.agents/skills/tcx-workflow/references/decision-quality-spine.md +0 -0
  267. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/execution-operator/execute-paper-order/SKILL.md +0 -0
  268. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/execution-operator/execute-paper-order/agents/openai.yaml +0 -0
  269. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/fundamental-analyst/fundamental-analysis/SKILL.md +0 -0
  270. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/fundamental-analyst/fundamental-analysis/agents/openai.yaml +0 -0
  271. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/instrument-analyst/instrument-analysis/SKILL.md +0 -0
  272. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/instrument-analyst/instrument-analysis/agents/openai.yaml +0 -0
  273. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/judgment-reviewer/agent-judgment-review/SKILL.md +0 -0
  274. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/judgment-reviewer/agent-judgment-review/agents/openai.yaml +0 -0
  275. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/macro-analyst/macro-analysis/SKILL.md +0 -0
  276. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/macro-analyst/macro-analysis/agents/openai.yaml +0 -0
  277. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/news-analyst/news-analysis/SKILL.md +0 -0
  278. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/news-analyst/news-analysis/agents/openai.yaml +0 -0
  279. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/portfolio-manager/create-order-ticket/SKILL.md +0 -0
  280. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/portfolio-manager/create-order-ticket/agents/openai.yaml +0 -0
  281. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/portfolio-manager/portfolio-review/SKILL.md +0 -0
  282. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/portfolio-manager/portfolio-review/agents/openai.yaml +0 -0
  283. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/risk-manager/approve-order/SKILL.md +0 -0
  284. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/risk-manager/approve-order/agents/openai.yaml +0 -0
  285. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/risk-manager/policy-review/SKILL.md +0 -0
  286. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/risk-manager/policy-review/agents/openai.yaml +0 -0
  287. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/risk-manager/review-risk/SKILL.md +0 -0
  288. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/risk-manager/review-risk/agents/openai.yaml +0 -0
  289. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/shared/anti-overfit-validation/SKILL.md +0 -0
  290. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/shared/anti-overfit-validation/agents/openai.yaml +0 -0
  291. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/shared/collect-evidence/SKILL.md +0 -0
  292. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/shared/collect-evidence/agents/openai.yaml +0 -0
  293. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/shared/external-data-source-gate/SKILL.md +0 -0
  294. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/shared/external-data-source-gate/agents/openai.yaml +0 -0
  295. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/shared/forecasting-discipline/SKILL.md +0 -0
  296. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/shared/forecasting-discipline/agents/openai.yaml +0 -0
  297. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/shared/numeric-data-qc/SKILL.md +0 -0
  298. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/shared/numeric-data-qc/agents/openai.yaml +0 -0
  299. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/shared/thesis-scenario-tree/SKILL.md +0 -0
  300. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/shared/thesis-scenario-tree/agents/openai.yaml +0 -0
  301. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/technical-analyst/technical-analysis/SKILL.md +0 -0
  302. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/technical-analyst/technical-analysis/agents/openai.yaml +0 -0
  303. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/valuation-analyst/valuation-review/SKILL.md +0 -0
  304. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/valuation-analyst/valuation-review/agents/openai.yaml +0 -0
  305. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/repo-skills/module.json +0 -0
  306. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/stub-execution/module.json +0 -0
  307. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/tradingcodex-mcp/files/.tradingcodex/mcp/enforcer/README.md +0 -0
  308. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/tradingcodex-mcp/files/.tradingcodex/mcp/gateway/README.md +0 -0
  309. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/tradingcodex-mcp/files/.tradingcodex/mcp/server.py +0 -0
  310. {tradingcodex-0.3.2 → tradingcodex-0.3.3}/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.3.2
3
+ Version: 0.3.3
4
4
  Summary: Agentic investment workflow harness for Codex-native research and service-gated execution checks.
5
5
  Author: TradingCodex Authors
6
6
  License-Expression: Apache-2.0
@@ -229,7 +229,7 @@ provide investment recommendations or guarantee returns.
229
229
  | Status | Milestone |
230
230
  | --- | --- |
231
231
  | Shipped | Generated Codex workspace, fixed role roster, project MCP config, Django service plane, local web dashboard, Admin, Ninja API, file-native research memory, component registry, policy/audit primitives. |
232
- | Current `0.3.2` | Brief research chat replies with saved head-manager synthesis reports, Codex-native Decision Packages, independent judgment-review gate, staged workflow planning, artifact-supervisor loop closure state, Evidence Run/Validation Cards, provider capability profiles, and Python `>=3.11,<3.15` support. |
232
+ | Current `0.3.3` | Flexible package/workspace update status, skipped-version Django migration smoke coverage, brief research chat replies with saved head-manager synthesis reports, Codex-native Decision Packages, independent judgment-review gate, staged workflow planning, artifact-supervisor loop closure state, Evidence Run/Validation Cards, provider capability profiles, and Python `>=3.11,<3.15` support. |
233
233
  | Next | Deeper validation scenarios, richer provider capability profiles, stronger generated-workspace smoke coverage, and improved artifact quality tooling. |
234
234
  | Future | Separately governed verified adapters, hosted/managed services, enterprise policy/compliance packs, and broker-specific live providers only after explicit product, policy, adapter, and validation work. |
235
235
 
@@ -198,7 +198,7 @@ provide investment recommendations or guarantee returns.
198
198
  | Status | Milestone |
199
199
  | --- | --- |
200
200
  | Shipped | Generated Codex workspace, fixed role roster, project MCP config, Django service plane, local web dashboard, Admin, Ninja API, file-native research memory, component registry, policy/audit primitives. |
201
- | Current `0.3.2` | Brief research chat replies with saved head-manager synthesis reports, Codex-native Decision Packages, independent judgment-review gate, staged workflow planning, artifact-supervisor loop closure state, Evidence Run/Validation Cards, provider capability profiles, and Python `>=3.11,<3.15` support. |
201
+ | Current `0.3.3` | Flexible package/workspace update status, skipped-version Django migration smoke coverage, brief research chat replies with saved head-manager synthesis reports, Codex-native Decision Packages, independent judgment-review gate, staged workflow planning, artifact-supervisor loop closure state, Evidence Run/Validation Cards, provider capability profiles, and Python `>=3.11,<3.15` support. |
202
202
  | Next | Deeper validation scenarios, richer provider capability profiles, stronger generated-workspace smoke coverage, and improved artifact quality tooling. |
203
203
  | Future | Separately governed verified adapters, hosted/managed services, enterprise policy/compliance packs, and broker-specific live providers only after explicit product, policy, adapter, and validation work. |
204
204
 
@@ -64,7 +64,7 @@ If these layers disagree, treat `docs/` as the durable product intent and fix th
64
64
  | [interfaces-and-surfaces.md](./interfaces-and-surfaces.md) | Product web, Django Admin, Django Ninja API, MCP boundary, CLI, generated wrapper behavior, and external MCP surface. |
65
65
  | [generated-workspaces.md](./generated-workspaces.md) | `tcx attach`, `tcx init`, `tcx update`, generated files, project-scoped MCP config, hooks, workspace provenance, profile scope, and template rules. |
66
66
  | [validation-and-test-plan.md](./validation-and-test-plan.md) | Required validation commands, unit/API/generator/smoke coverage, MCP smokes, broker provider smokes, routing scenarios, and release-sensitive checks. |
67
- | [deployment.md](./deployment.md) | PyPI/TestPyPI release process, CI/CD, Trusted Publishing, installer/update policy, versioning, and what is not deployed. |
67
+ | [deployment.md](./deployment.md) | PyPI release process, CI/CD, Trusted Publishing, installer/update policy, versioning, and what is not deployed. |
68
68
  | [licensing-and-commercialization.md](./licensing-and-commercialization.md) | Apache-2.0 open-core boundary, generated workspace ownership, contributions, trademark posture, and legal review needs. |
69
69
 
70
70
  ## Change-To-Docs Map
@@ -34,9 +34,6 @@ Use Python 3.11 for release build verification and keep CI green across the
34
34
  supported range. The package metadata requires `>=3.11,<3.15`, and CI runs on
35
35
  Python 3.11, 3.12, 3.13, and 3.14.
36
36
 
37
- Create separate PyPI and TestPyPI accounts. TestPyPI is a separate service and
38
- does not share login state with PyPI.
39
-
40
37
  Configure Trusted Publishing before the first upload. Do not store long-lived
41
38
  PyPI API tokens in GitHub repository secrets unless Trusted Publishing is not
42
39
  available.
@@ -46,12 +43,9 @@ Trusted Publisher settings:
46
43
  | Index | Project | Owner | Repository | Workflow | Environment |
47
44
  | --- | --- | --- | --- | --- | --- |
48
45
  | PyPI | `tradingcodex` | repository owner/org | repository name | `release.yml` | `pypi` |
49
- | TestPyPI | `tradingcodex` | repository owner/org | repository name | `release.yml` | `testpypi` |
50
-
51
- On GitHub, create both environments:
52
46
 
53
- - `testpypi`: no manual approval required by default
54
- - `pypi`: require manual approval before deployment
47
+ On GitHub, create the `pypi` environment and require manual approval before
48
+ deployment.
55
49
 
56
50
  ## Local Build Verification
57
51
 
@@ -101,27 +95,25 @@ It runs on pull requests and pushes to `main` or `develop`:
101
95
  - builds the package for validation only
102
96
  - validates distribution metadata with `twine check`
103
97
 
104
- The CI workflow never uploads to TestPyPI or PyPI. Pushes to `main` or
105
- `develop` run tests and packaging checks only.
98
+ The CI workflow never uploads to PyPI. Pushes to `main` or `develop` run tests
99
+ and packaging checks only.
106
100
 
107
101
  Release automation is defined in `.github/workflows/release.yml` and appears as
108
102
  `Manual Release` in GitHub Actions.
109
103
 
110
104
  The release workflow is manual-only. Branch pushes and tag pushes must not
111
- publish package artifacts to TestPyPI or PyPI.
105
+ publish package artifacts to PyPI.
112
106
 
113
107
  The release workflow has additional guardrails:
114
108
 
115
109
  - publication requires `workflow_dispatch`
116
110
  - PyPI publication is allowed only from the `main` branch
117
- - TestPyPI and PyPI publication must be run as separate manual workflow runs
118
111
  - concurrent release runs on the same ref are serialized instead of cancelled
119
112
 
120
- Manual `workflow_dispatch` can publish to TestPyPI when
121
- `publish_testpypi=true`, and to PyPI when `publish_pypi=true`.
113
+ Manual `workflow_dispatch` can publish to PyPI when `publish_pypi=true`.
122
114
 
123
- Keep both publish inputs set to `false` when the run should only build and
124
- verify distributions.
115
+ Keep `publish_pypi=false` when the run should only build and verify
116
+ distributions.
125
117
 
126
118
  The workflow uses PyPI Trusted Publishing. The publish jobs request only an
127
119
  OIDC token through `id-token: write`; they do not require API-token secrets.
@@ -134,32 +126,6 @@ and download do not depend on the deprecated Node.js 20 action runtime.
134
126
  `tcx update` applies central DB migrations before the updated workspace is used.
135
127
  Product flows create, check, approve, and submit `OrderTicket` records directly.
136
128
 
137
- ## TestPyPI Release
138
-
139
- Use TestPyPI before the first public PyPI release and after packaging changes.
140
-
141
- 1. Confirm the local build verification steps pass.
142
- 2. Run the `Manual Release` workflow manually with `publish_testpypi=true`.
143
- 3. Install from TestPyPI in a clean environment.
144
-
145
- Example:
146
-
147
- ```bash
148
- python3.11 -m venv /tmp/tcx-testpypi
149
- /tmp/tcx-testpypi/bin/pip install \
150
- --index-url https://test.pypi.org/simple/ \
151
- --extra-index-url https://pypi.org/simple/ \
152
- tradingcodex==0.3.2
153
- rm -rf /tmp/tcx-testpypi-smoke
154
- mkdir -p /tmp/tcx-testpypi-smoke
155
- cd /tmp/tcx-testpypi-smoke
156
- /tmp/tcx-testpypi/bin/tcx attach .
157
- ./tcx doctor
158
- ```
159
-
160
- `--extra-index-url` is used because dependencies such as Django may not be
161
- available on TestPyPI.
162
-
163
129
  ## PyPI Release
164
130
 
165
131
  Before pushing the release tag:
@@ -168,7 +134,6 @@ Before pushing the release tag:
168
134
  - verify `README.md` describes execution as service-gated
169
135
  - verify docs mention that live broker execution requires installed providers and explicit gates
170
136
  - run local build verification
171
- - run a TestPyPI release when packaging changed
172
137
 
173
138
  Then create or update the GitHub release/tag as needed, and run the
174
139
  `Manual Release` workflow manually with `publish_pypi=true`. Do not rely on tag push for
@@ -178,7 +143,7 @@ After the PyPI workflow completes:
178
143
 
179
144
  ```bash
180
145
  python3.11 -m venv /tmp/tcx-pypi
181
- /tmp/tcx-pypi/bin/pip install tradingcodex==0.3.2
146
+ /tmp/tcx-pypi/bin/pip install tradingcodex==0.3.3
182
147
  rm -rf /tmp/tcx-pypi-smoke
183
148
  mkdir -p /tmp/tcx-pypi-smoke
184
149
  cd /tmp/tcx-pypi-smoke
@@ -279,7 +244,10 @@ Use PEP 440 versions:
279
244
  state fixes after `0.3.0`
280
245
  - `0.3.2` for brief research chat replies with saved head-manager synthesis
281
246
  reports after `0.3.1`
282
- - later patch releases for compatible fixes after `0.3.2`
247
+ - `0.3.3` for flexible update status across package/workspace drift,
248
+ skipped-version Django migration smoke coverage, and PyPI-only release flow
249
+ after `0.3.2`
250
+ - later patch releases for compatible fixes after `0.3.3`
283
251
  - pre-releases such as `0.4.0a1`, `0.4.0b1`, or `0.4.0rc1` when preparing
284
252
  the next minor contract
285
253
 
@@ -250,8 +250,9 @@ user-terminal workspace-only path:
250
250
  step. If startup health reports `update_status.workspace_update_allowed=true`,
251
251
  `head-manager` should tell the user to run
252
252
  `update_status.workspace_update_command` from their terminal. If startup health
253
- reports `update_status.package_update_required_first=true`, package refresh is
254
- also a user-terminal action, normally:
253
+ reports `update_status.package_update_required_first=true`, including when the
254
+ generated workspace and installed wrapper both match an older release, package
255
+ refresh is also a user-terminal action, normally:
255
256
 
256
257
  ```bash
257
258
  uvx --refresh --from tradingcodex tcx update .
@@ -366,7 +367,10 @@ must explain the two supported paths: switch Codex to full access and enable
366
367
  TradingCodex build mode, or run the recommended `update_status.command` from a
367
368
  terminal. Self-update is allowed only when Codex full access and explicit
368
369
  workspace build mode are both active and the user asks for the update. After
369
- self-update, `head-manager` stops and tells the user to restart Codex.
370
+ self-update, `head-manager` stops and tells the user to restart Codex. If a
371
+ same-DB service is already running with a newer TradingCodex version than the
372
+ current wrapper, startup health treats that service version as an update hint
373
+ and should recommend package/workspace refresh before service stop.
370
374
 
371
375
  Build mode is per workspace and explicit:
372
376
 
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "tradingcodex"
7
- version = "0.3.2"
7
+ version = "0.3.3"
8
8
  description = "Agentic investment workflow harness for Codex-native research and service-gated execution checks."
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.11,<3.15"
@@ -150,7 +150,7 @@ def test_service_autostart_rejects_version_and_db_mismatch(monkeypatch) -> None:
150
150
  )
151
151
  with pytest.raises(RuntimeError, match="version mismatch") as version_mismatch:
152
152
  service_autostart._assert_compatible_service("127.0.0.1", 48267)
153
- assert "tcx service stop 127.0.0.1:48267" in str(version_mismatch.value)
153
+ assert "uvx --refresh --from tradingcodex tcx update ." in str(version_mismatch.value)
154
154
 
155
155
  monkeypatch.setattr(service_autostart, "tradingcodex_db_path", lambda: Path("/tmp/current.sqlite3"))
156
156
  monkeypatch.setattr(
@@ -195,6 +195,24 @@ def test_service_autostart_replaces_stale_same_db_service(monkeypatch, tmp_path:
195
195
  assert state["started"] is True
196
196
 
197
197
 
198
+ def test_service_autostart_does_not_replace_newer_same_db_service(monkeypatch, tmp_path: Path) -> None:
199
+ from tradingcodex_cli import service_autostart
200
+
201
+ current_db = tmp_path / "current.sqlite3"
202
+ monkeypatch.setattr(service_autostart, "tradingcodex_db_path", lambda: current_db)
203
+ monkeypatch.setattr(service_autostart, "_tcp_open", lambda host, port: True)
204
+ monkeypatch.setattr(
205
+ service_autostart,
206
+ "_service_health",
207
+ lambda host, port: {"service": "tradingcodex", "version": "999.0.0", "db_path": str(current_db)},
208
+ )
209
+ monkeypatch.setattr(service_autostart, "stop_service", lambda *args, **kwargs: (_ for _ in ()).throw(AssertionError("stopped newer service")))
210
+ monkeypatch.setattr(service_autostart, "_start_service", lambda *args: (_ for _ in ()).throw(AssertionError("started over newer service")))
211
+
212
+ with pytest.raises(RuntimeError, match="uvx --refresh --from tradingcodex tcx update"):
213
+ service_autostart.ensure_service_up(tmp_path, timeout=0.01)
214
+
215
+
198
216
  def test_service_status_reports_actionable_state(monkeypatch) -> None:
199
217
  from tradingcodex_cli import service_autostart
200
218
 
@@ -218,6 +236,15 @@ def test_service_status_reports_actionable_state(monkeypatch) -> None:
218
236
  assert mismatch["package_version"] == TRADINGCODEX_VERSION
219
237
  assert "tcx service stop 127.0.0.1:48267" in mismatch["next_action"]
220
238
 
239
+ monkeypatch.setattr(
240
+ service_autostart,
241
+ "_service_health",
242
+ lambda host, port: {"service": "tradingcodex", "version": "999.0.0", "db_path": str(Path("/tmp/current.sqlite3"))},
243
+ )
244
+ newer_service = service_autostart.service_status("127.0.0.1:48267")
245
+ assert newer_service["issue"] == "version_mismatch"
246
+ assert "uvx --refresh --from tradingcodex tcx update ." in newer_service["next_action"]
247
+
221
248
  monkeypatch.setattr(service_autostart, "tradingcodex_db_path", lambda: Path("/tmp/current.sqlite3"))
222
249
  monkeypatch.setattr(
223
250
  service_autostart,
@@ -230,6 +257,67 @@ def test_service_status_reports_actionable_state(monkeypatch) -> None:
230
257
  assert compatible["next_action"] == "No action needed."
231
258
 
232
259
 
260
+ def test_db_migrate_applies_skipped_django_migrations_and_legacy_order_data(tmp_path: Path) -> None:
261
+ workspace = tmp_path / "skip-migration-workspace"
262
+ workspace.mkdir()
263
+ home = tmp_path / "tc-home-skip-migration"
264
+ env_extra = {"TRADINGCODEX_HOME": str(home), "TRADINGCODEX_DB_NAME": None}
265
+
266
+ run([sys.executable, "manage.py", "migrate", "orders", "0001", "--noinput"], ROOT, env_extra=env_extra)
267
+ db_path = home / "state" / "tradingcodex.sqlite3"
268
+ with sqlite3.connect(db_path) as connection:
269
+ connection.execute(
270
+ """
271
+ INSERT INTO orders_orderintent (
272
+ intent_id, symbol, side, quantity, limit_price, currency, broker,
273
+ estimated_notional_krw, created_by, created_at, portfolio_id,
274
+ account_id, strategy_id, workspace_context, payload
275
+ )
276
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
277
+ """,
278
+ (
279
+ "legacy-intent-1",
280
+ "NVDA",
281
+ "buy",
282
+ "1",
283
+ "100",
284
+ "USD",
285
+ "paper",
286
+ "100",
287
+ "portfolio-manager",
288
+ "2026-01-01 00:00:00",
289
+ "default-paper",
290
+ "local-paper",
291
+ "default-strategy",
292
+ "{}",
293
+ json.dumps({"order_intent": {"order_ticket_id": "legacy-ticket-1", "symbol": "NVDA", "side": "buy", "quantity": "1"}}),
294
+ ),
295
+ )
296
+
297
+ migrated = json.loads(run([sys.executable, "-m", "tradingcodex_cli", "db", "migrate"], workspace, env_extra=env_extra).stdout)
298
+ assert migrated["status"] == "migrated"
299
+ with sqlite3.connect(db_path) as connection:
300
+ applied = {
301
+ (row[0], row[1])
302
+ for row in connection.execute("SELECT app, name FROM django_migrations")
303
+ }
304
+ tables = {
305
+ row[0]
306
+ for row in connection.execute("SELECT name FROM sqlite_master WHERE type='table'")
307
+ }
308
+ ticket = connection.execute(
309
+ "SELECT ticket_id, symbol, side, payload_hash FROM orders_orderticket WHERE ticket_id = ?",
310
+ ("legacy-ticket-1",),
311
+ ).fetchone()
312
+
313
+ assert ("orders", "0004_remove_order_intent_compat_fields") in applied
314
+ assert ("integrations", "0002_brokerconnection_brokeraccount_instrumentmap") in applied
315
+ assert "orders_orderintent" not in tables
316
+ assert ticket is not None
317
+ assert ticket[:3] == ("legacy-ticket-1", "NVDA", "buy")
318
+ assert ticket[3]
319
+
320
+
233
321
  def test_service_runserver_uses_fixed_port_and_skips_duplicate(monkeypatch, tmp_path: Path, capsys) -> None:
234
322
  from django.core import management
235
323
  from tradingcodex_cli import __main__ as cli_main
@@ -351,6 +439,49 @@ def test_startup_status_preserves_service_mismatch_details(monkeypatch, tmp_path
351
439
  assert status["allowed_next_actions"][0] == service_detail["next_action"]
352
440
 
353
441
 
442
+ def test_startup_status_uses_same_db_newer_service_as_update_hint(monkeypatch, tmp_path: Path) -> None:
443
+ from tradingcodex_cli import startup_status
444
+
445
+ workspace = make_workspace(tmp_path)
446
+ module_lock_path = workspace / ".tradingcodex" / "generated" / "module-lock.json"
447
+ module_lock = json.loads(module_lock_path.read_text(encoding="utf-8"))
448
+ module_lock["tradingcodex_version"] = "0.3.1"
449
+ module_lock_path.write_text(json.dumps(module_lock, indent=2) + "\n", encoding="utf-8")
450
+ db_path = "/tmp/current.sqlite3"
451
+ monkeypatch.setattr(startup_status, "TRADINGCODEX_VERSION", "0.3.1")
452
+ monkeypatch.setattr(
453
+ startup_status,
454
+ "latest_release_info",
455
+ lambda: (_ for _ in ()).throw(AssertionError("latest release check should use service hint")),
456
+ )
457
+ monkeypatch.setattr(
458
+ startup_status,
459
+ "inspect_service_status",
460
+ lambda addr: {
461
+ "addr": addr,
462
+ "url": f"http://{addr}/",
463
+ "reachable": True,
464
+ "compatible": False,
465
+ "service": "tradingcodex",
466
+ "version": "0.3.2",
467
+ "package_version": "0.3.1",
468
+ "db_path": db_path,
469
+ "expected_db_path": db_path,
470
+ "issue": "version_mismatch",
471
+ "next_action": "Run package refresh.",
472
+ },
473
+ )
474
+ monkeypatch.setattr(startup_status, "_read_health", lambda url: {"service": "tradingcodex", "version": "0.3.2", "db_path": db_path})
475
+
476
+ status = startup_status.build_server_status(workspace)
477
+
478
+ update_status = status["update_status"]
479
+ assert update_status["versions_match"] is True
480
+ assert update_status["latest_release_source"] == "service_status"
481
+ assert update_status["package_update_required"] is True
482
+ assert update_status["command"] == "uvx --refresh --from tradingcodex tcx update ."
483
+
484
+
354
485
  def test_manage_runserver_uses_fixed_port_and_skips_duplicate(monkeypatch, capsys) -> None:
355
486
  from tradingcodex_cli import service_autostart
356
487
 
@@ -898,6 +1029,55 @@ def test_session_start_update_recommendation_respects_home_preference(tmp_path:
898
1029
  assert run_user_prompt_hook(workspace, "Create a quality income strategy for dividend stocks") is None
899
1030
 
900
1031
 
1032
+ def test_update_status_detects_stale_package_when_workspace_matches_installed(monkeypatch, tmp_path: Path) -> None:
1033
+ from tradingcodex_cli import startup_status
1034
+
1035
+ workspace = make_workspace(tmp_path)
1036
+ module_lock_path = workspace / ".tradingcodex" / "generated" / "module-lock.json"
1037
+ module_lock = json.loads(module_lock_path.read_text(encoding="utf-8"))
1038
+ module_lock["tradingcodex_version"] = "0.3.1"
1039
+ module_lock_path.write_text(json.dumps(module_lock, indent=2) + "\n", encoding="utf-8")
1040
+ monkeypatch.setattr(startup_status, "TRADINGCODEX_VERSION", "0.3.1")
1041
+ monkeypatch.setattr(
1042
+ startup_status,
1043
+ "latest_release_info",
1044
+ lambda: {"latest_release_version": "0.3.2", "latest_release_status": "ok", "latest_release_source": "test"},
1045
+ )
1046
+
1047
+ update_status = startup_status.build_update_status(workspace, check_latest_release=True)
1048
+
1049
+ assert update_status["versions_match"] is True
1050
+ assert update_status["workspace_update_available"] is False
1051
+ assert update_status["package_update_required"] is True
1052
+ assert update_status["package_update_required_first"] is True
1053
+ assert update_status["update_available"] is True
1054
+ assert update_status["command"] == "uvx --refresh --from tradingcodex tcx update ."
1055
+
1056
+
1057
+ def test_update_status_uses_service_hint_when_latest_check_unavailable(monkeypatch, tmp_path: Path) -> None:
1058
+ from tradingcodex_cli import startup_status
1059
+
1060
+ workspace = make_workspace(tmp_path)
1061
+ module_lock_path = workspace / ".tradingcodex" / "generated" / "module-lock.json"
1062
+ module_lock = json.loads(module_lock_path.read_text(encoding="utf-8"))
1063
+ module_lock["tradingcodex_version"] = "0.3.0"
1064
+ module_lock_path.write_text(json.dumps(module_lock, indent=2) + "\n", encoding="utf-8")
1065
+ monkeypatch.setattr(startup_status, "TRADINGCODEX_VERSION", "0.3.1")
1066
+ monkeypatch.setattr(
1067
+ startup_status,
1068
+ "latest_release_info",
1069
+ lambda: {"latest_release_version": "unknown", "latest_release_status": "unavailable", "latest_release_source": "test"},
1070
+ )
1071
+
1072
+ update_status = startup_status.build_update_status(workspace, latest_version_hint="0.3.2")
1073
+
1074
+ assert update_status["workspace_update_available"] is True
1075
+ assert update_status["latest_release_source"] == "service_status"
1076
+ assert update_status["package_update_required"] is True
1077
+ assert update_status["workspace_update_allowed"] is False
1078
+ assert update_status["command"] == "uvx --refresh --from tradingcodex tcx update ."
1079
+
1080
+
901
1081
  def test_repo_skill_templates_keep_instruction_boundary() -> None:
902
1082
  skill_root = ROOT / "workspace_templates" / "modules" / "repo-skills" / "files" / ".agents" / "skills"
903
1083
  subagent_skill_root = ROOT / "workspace_templates" / "modules" / "repo-skills" / "files" / ".tradingcodex" / "subagents" / "skills"
@@ -1393,7 +1573,7 @@ def test_runtime_mode_update_and_connector_build_cli(tmp_path: Path) -> None:
1393
1573
  module_lock_path.write_text(json.dumps(module_lock, indent=2) + "\n", encoding="utf-8")
1394
1574
  update_status = json.loads(
1395
1575
  run(
1396
- ["./tcx", "update", "status", "--json"],
1576
+ ["./tcx", "update", "status", "--json", "--skip-refresh"],
1397
1577
  workspace,
1398
1578
  env_extra={"TRADINGCODEX_CODEX_PERMISSION": "danger-full-access", "TRADINGCODEX_LATEST_RELEASE_VERSION": TRADINGCODEX_VERSION},
1399
1579
  ).stdout
@@ -1693,6 +1873,7 @@ def test_update_refreshes_workspace_contract_and_preserves_identity(tmp_path: Pa
1693
1873
  assert module_lock["tradingcodex_version"] == TRADINGCODEX_VERSION
1694
1874
  assert module_lock["tradingcodex_package_spec"] == "tradingcodex"
1695
1875
  assert 'TRADINGCODEX_UPDATE_SKIP_REFRESH="${TRADINGCODEX_UPDATE_SKIP_REFRESH:-0}"' in wrapper
1876
+ assert 'if [ "${1:-}" = "update" ] && [ "${2:-}" = "status" ]; then' not in wrapper
1696
1877
  assert 'if [ "${1:-}" = "update" ] && [ "$TRADINGCODEX_UPDATE_SKIP_REFRESH" != "1" ] && command -v uvx >/dev/null 2>&1; then' in wrapper
1697
1878
  assert '"--skip-refresh"' in wrapper
1698
1879
  assert " ./tcx doctor" in updated.stdout
@@ -4601,7 +4782,7 @@ def test_product_web_does_not_create_approvals_or_executions(monkeypatch) -> Non
4601
4782
  assert "Idea translated" in decision_body
4602
4783
  assert "candidate thesis" in decision_body
4603
4784
  assert "Portfolio fit" in decision_body
4604
- assert "Reviews the business, financial drivers" in decision_body
4785
+ assert "Reviews the business, financial drivers" not in decision_body
4605
4786
  assert "workflow reaches portfolio/order readiness" in decision_body
4606
4787
  assert "Next allowed actions" in decision_body
4607
4788
  assert "Answer missing profile questions" in decision_body
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: tradingcodex
3
- Version: 0.3.2
3
+ Version: 0.3.3
4
4
  Summary: Agentic investment workflow harness for Codex-native research and service-gated execution checks.
5
5
  Author: TradingCodex Authors
6
6
  License-Expression: Apache-2.0
@@ -229,7 +229,7 @@ provide investment recommendations or guarantee returns.
229
229
  | Status | Milestone |
230
230
  | --- | --- |
231
231
  | Shipped | Generated Codex workspace, fixed role roster, project MCP config, Django service plane, local web dashboard, Admin, Ninja API, file-native research memory, component registry, policy/audit primitives. |
232
- | Current `0.3.2` | Brief research chat replies with saved head-manager synthesis reports, Codex-native Decision Packages, independent judgment-review gate, staged workflow planning, artifact-supervisor loop closure state, Evidence Run/Validation Cards, provider capability profiles, and Python `>=3.11,<3.15` support. |
232
+ | Current `0.3.3` | Flexible package/workspace update status, skipped-version Django migration smoke coverage, brief research chat replies with saved head-manager synthesis reports, Codex-native Decision Packages, independent judgment-review gate, staged workflow planning, artifact-supervisor loop closure state, Evidence Run/Validation Cards, provider capability profiles, and Python `>=3.11,<3.15` support. |
233
233
  | Next | Deeper validation scenarios, richer provider capability profiles, stronger generated-workspace smoke coverage, and improved artifact quality tooling. |
234
234
  | Future | Separately governed verified adapters, hosted/managed services, enterprise policy/compliance packs, and broker-specific live providers only after explicit product, policy, adapter, and validation work. |
235
235
 
@@ -115,7 +115,7 @@ def update_status(argv: list[str]) -> None:
115
115
  parser.add_argument("project_dir", nargs="?", default=".")
116
116
  args = parser.parse_args(argv)
117
117
  root = configure_workspace_env(Path(args.project_dir).resolve(), force=True)
118
- status = build_update_status(root)
118
+ status = build_update_status(root, check_latest_release=True)
119
119
  if args.json:
120
120
  print_json(status)
121
121
  return
@@ -3,6 +3,8 @@ from __future__ import annotations
3
3
  import os
4
4
  import json
5
5
  import signal
6
+ import re
7
+ import shlex
6
8
  import socket
7
9
  import subprocess
8
10
  import sys
@@ -111,7 +113,7 @@ def service_status(addr: str = DEFAULT_SERVICE_ADDR) -> dict:
111
113
  })
112
114
  if status["version"] != TRADINGCODEX_VERSION:
113
115
  status["issue"] = "version_mismatch"
114
- status["next_action"] = f"Run `tcx service stop {normalized_addr}` and then restart Codex if MCP uses the default address."
116
+ status["next_action"] = _version_mismatch_next_action(status["version"], normalized_addr)
115
117
  return status
116
118
  if status["db_path"] and status["db_path"] != current_db:
117
119
  status["issue"] = "db_mismatch"
@@ -179,7 +181,7 @@ def _replace_stale_tradingcodex_service_or_raise(host: str, port: int, *, timeou
179
181
  service_db = str(health.get("db_path") or "")
180
182
  if (
181
183
  health.get("service") == "tradingcodex"
182
- and health.get("version") != TRADINGCODEX_VERSION
184
+ and _version_less_than(str(health.get("version") or ""), TRADINGCODEX_VERSION)
183
185
  and (not service_db or service_db == str(tradingcodex_db_path()))
184
186
  ):
185
187
  stop_service(f"{host}:{port}", timeout=max(1.0, min(timeout, 5.0)))
@@ -198,8 +200,7 @@ def _assert_compatible_service(host: str, port: int) -> None:
198
200
  if health.get("version") != TRADINGCODEX_VERSION:
199
201
  raise RuntimeError(
200
202
  f"TradingCodex service version mismatch: service={health.get('version')} package={TRADINGCODEX_VERSION}. "
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."
203
+ f"{_version_mismatch_next_action(str(health.get('version') or ''), addr)}"
203
204
  )
204
205
  service_db = str(health.get("db_path") or "")
205
206
  current_db = str(tradingcodex_db_path())
@@ -237,3 +238,26 @@ def _service_pids(host: str, port: int, health: dict) -> list[int]:
237
238
  except Exception:
238
239
  pass
239
240
  return sorted(pids)
241
+
242
+
243
+ def _version_mismatch_next_action(service_version: str, addr: str) -> str:
244
+ if _version_less_than(TRADINGCODEX_VERSION, service_version):
245
+ package_spec = shlex.quote(os.environ.get("TRADINGCODEX_MCP_PACKAGE_SPEC", "tradingcodex"))
246
+ return f"Run `uvx --refresh --from {package_spec} tcx update .`, then fully restart Codex so MCP reloads the refreshed package."
247
+ return f"Run `tcx service stop {addr}` and then restart Codex if MCP uses the default address."
248
+
249
+
250
+ def _version_less_than(left: str, right: str) -> bool:
251
+ left_key = _release_version_key(left)
252
+ right_key = _release_version_key(right)
253
+ if not left_key or not right_key:
254
+ return False
255
+ length = max(len(left_key), len(right_key))
256
+ return left_key + (0,) * (length - len(left_key)) < right_key + (0,) * (length - len(right_key))
257
+
258
+
259
+ def _release_version_key(version: str) -> tuple[int, ...]:
260
+ match = re.match(r"^\s*(\d+(?:\.\d+)*)", version)
261
+ if not match:
262
+ return ()
263
+ return tuple(int(part) for part in match.group(1).split("."))
@@ -28,8 +28,14 @@ def build_server_status(workspace_root: Path | str, addr: str | None = None) ->
28
28
  health_url = f"{dashboard_url.rstrip('/')}/api/health"
29
29
  permission_status = detect_codex_permission_status(root)
30
30
  mode_status = get_runtime_mode_status(root, full_access_detected=permission_status["full_access_detected"])
31
- update_status = build_update_status(root, permission_status=permission_status, mode_status=mode_status)
32
31
  service_detail = inspect_service_status(service_addr)
32
+ latest_version_hint = _latest_version_hint_from_service(service_detail)
33
+ update_status = build_update_status(
34
+ root,
35
+ permission_status=permission_status,
36
+ mode_status=mode_status,
37
+ latest_version_hint=latest_version_hint,
38
+ )
33
39
  health = _read_health(health_url) if service_detail.get("reachable") else {}
34
40
  service_state = _service_state_from_detail(service_detail)
35
41
  mcp_config_present = _is_project_mcp_config_present(root)
@@ -121,6 +127,8 @@ def build_update_status(
121
127
  *,
122
128
  permission_status: dict[str, Any] | None = None,
123
129
  mode_status: dict[str, Any] | None = None,
130
+ check_latest_release: bool = False,
131
+ latest_version_hint: str = "",
124
132
  ) -> dict[str, Any]:
125
133
  root = Path(workspace_root).expanduser().resolve()
126
134
  permission_status = permission_status or detect_codex_permission_status(root)
@@ -134,8 +142,21 @@ def build_update_status(
134
142
  suppressed = bool(preferences.get("suppress_update_recommendation"))
135
143
  versions_match = workspace_version == installed_version
136
144
  workspace_update_available = workspace_version not in {"", "unknown"} and not versions_match
137
- if workspace_update_available:
145
+ latest_version_hint = latest_version_hint.strip()
146
+ if workspace_update_available or check_latest_release:
138
147
  latest = latest_release_info()
148
+ if latest["latest_release_status"] != "ok" and latest_version_hint and version_less_than(installed_version, latest_version_hint):
149
+ latest = {
150
+ "latest_release_version": latest_version_hint,
151
+ "latest_release_status": "ok",
152
+ "latest_release_source": "service_status",
153
+ }
154
+ elif latest_version_hint and version_less_than(installed_version, latest_version_hint):
155
+ latest = {
156
+ "latest_release_version": latest_version_hint,
157
+ "latest_release_status": "ok",
158
+ "latest_release_source": "service_status",
159
+ }
139
160
  else:
140
161
  latest = {
141
162
  "latest_release_version": "not_checked",
@@ -145,14 +166,15 @@ def build_update_status(
145
166
  latest_version = latest["latest_release_version"]
146
167
  latest_status = latest["latest_release_status"]
147
168
  installed_release_is_stale = latest_status == "ok" and version_less_than(installed_version, latest_version)
148
- package_update_required_first = workspace_update_available and installed_release_is_stale
169
+ package_update_required = installed_release_is_stale
170
+ package_update_required_first = package_update_required
149
171
  workspace_update_allowed = workspace_update_available and not package_update_required_first
150
172
  workspace_update_recommended = workspace_update_allowed and not suppressed
151
- blocked_reason = "installed tcx is older than the latest release; update the package before refreshing this workspace" if package_update_required_first else ""
173
+ blocked_reason = "installed tcx is older than the latest release; update the package before refreshing this workspace" if package_update_required else ""
152
174
  workspace_update_command = "./tcx update --skip-refresh"
153
175
  update_available = workspace_update_available or installed_release_is_stale
154
176
  user_update_command = f"uvx --refresh --from {shlex.quote(package_spec)} tcx update ."
155
- self_update_command = user_update_command if package_update_required_first else workspace_update_command
177
+ self_update_command = user_update_command if package_update_required else workspace_update_command
156
178
  can_self_update = bool(update_available and mode_status.get("build_enabled"))
157
179
  head_manager_update_allowed = can_self_update
158
180
  head_manager_update_command = self_update_command if can_self_update else ""
@@ -162,7 +184,7 @@ def build_update_status(
162
184
  head_manager_update_blocked_reason = "package refresh must run outside restricted Codex permissions or inside build mode with full access"
163
185
  else:
164
186
  head_manager_update_blocked_reason = ""
165
- if package_update_required_first:
187
+ if package_update_required:
166
188
  recommended_action = f"Use build mode with full access for self-update, or ask the user to run from a terminal: {user_update_command}"
167
189
  elif workspace_update_recommended:
168
190
  recommended_action = f"Use build mode with full access for self-update, or ask the user to run from a terminal: {workspace_update_command}"
@@ -183,7 +205,7 @@ def build_update_status(
183
205
  "workspace_update_required": workspace_update_available,
184
206
  "workspace_update_allowed": workspace_update_allowed,
185
207
  "workspace_update_recommended": workspace_update_recommended,
186
- "package_update_required": package_update_required_first,
208
+ "package_update_required": package_update_required,
187
209
  "package_update_required_first": package_update_required_first,
188
210
  "workspace_update_command": workspace_update_command,
189
211
  "command": self_update_command,
@@ -320,6 +342,16 @@ def build_startup_notice(*, service_detail: dict[str, Any], service_status: str)
320
342
  return next_action
321
343
 
322
344
 
345
+ def _latest_version_hint_from_service(service_detail: dict[str, Any]) -> str:
346
+ if service_detail.get("service") != "tradingcodex":
347
+ return ""
348
+ service_db = str(service_detail.get("db_path") or "")
349
+ expected_db = str(service_detail.get("expected_db_path") or tradingcodex_db_path())
350
+ if service_db and service_db != expected_db:
351
+ return ""
352
+ return str(service_detail.get("version") or "")
353
+
354
+
323
355
  def latest_release_info() -> dict[str, str]:
324
356
  override = os.environ.get("TRADINGCODEX_LATEST_RELEASE_VERSION", "").strip()
325
357
  if override:
@@ -914,7 +914,7 @@ def raw_call_tool(workspace_root: Path | str, tool: McpToolSpec, args: dict[str,
914
914
  def get_update_status() -> dict[str, Any]:
915
915
  from tradingcodex_cli.startup_status import build_update_status
916
916
 
917
- return build_update_status(workspace_root)
917
+ return build_update_status(workspace_root, check_latest_release=True)
918
918
 
919
919
  with_principal = {**args, "principal_id": principal_id}
920
920
  handlers: dict[str, Callable[[], dict[str, Any]]] = {