tradingcodex 0.3.4__tar.gz → 0.3.6__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 (314) hide show
  1. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/PKG-INFO +2 -2
  2. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/README.md +1 -1
  3. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/docs/deployment.md +7 -2
  4. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/docs/generated-workspaces.md +10 -1
  5. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/docs/safety-policy-and-execution.md +6 -0
  6. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/pyproject.toml +1 -1
  7. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tests/test_python_migration.py +107 -6
  8. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tradingcodex.egg-info/PKG-INFO +2 -2
  9. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tradingcodex_cli/commands/doctor.py +23 -1
  10. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tradingcodex_cli/commands/mcp.py +0 -1
  11. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tradingcodex_service/application/agents.py +0 -1
  12. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tradingcodex_service/application/customization.py +0 -1
  13. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tradingcodex_service/application/decision_packages.py +0 -1
  14. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tradingcodex_service/application/harness.py +32 -30
  15. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tradingcodex_service/application/workflow_planner.py +4 -3
  16. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tradingcodex_service/urls.py +0 -1
  17. tradingcodex-0.3.6/tradingcodex_service/version.py +1 -0
  18. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tradingcodex_service/web.py +0 -3
  19. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/codex-base/files/.codex/config.toml +1 -1
  20. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/codex-base/files/.codex/hooks/tradingcodex_hook.py +39 -30
  21. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/codex-base/files/.tradingcodex/cli.py +1 -1
  22. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/fixed-subagents/files/.codex/agents/execution-operator.toml +1 -4
  23. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/fixed-subagents/files/.codex/agents/fundamental-analyst.toml +1 -0
  24. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/fixed-subagents/files/.codex/agents/instrument-analyst.toml +1 -0
  25. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/fixed-subagents/files/.codex/agents/judgment-reviewer.toml +1 -0
  26. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/fixed-subagents/files/.codex/agents/macro-analyst.toml +1 -0
  27. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/fixed-subagents/files/.codex/agents/news-analyst.toml +1 -0
  28. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/fixed-subagents/files/.codex/agents/portfolio-manager.toml +1 -0
  29. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/fixed-subagents/files/.codex/agents/risk-manager.toml +1 -0
  30. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/fixed-subagents/files/.codex/agents/technical-analyst.toml +1 -0
  31. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/fixed-subagents/files/.codex/agents/valuation-analyst.toml +1 -0
  32. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/tradingcodex-mcp/files/.tradingcodex/mcp/server.py +3 -3
  33. tradingcodex-0.3.4/tradingcodex_service/version.py +0 -1
  34. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/CONTRIBUTING.md +0 -0
  35. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/LICENSE +0 -0
  36. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/MANIFEST.in +0 -0
  37. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/NOTICE +0 -0
  38. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/TRADEMARKS.md +0 -0
  39. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/apps/__init__.py +0 -0
  40. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/apps/audit/__init__.py +0 -0
  41. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/apps/audit/admin.py +0 -0
  42. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/apps/audit/apps.py +0 -0
  43. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/apps/audit/migrations/0001_initial.py +0 -0
  44. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/apps/audit/migrations/__init__.py +0 -0
  45. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/apps/audit/models.py +0 -0
  46. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/apps/harness/__init__.py +0 -0
  47. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/apps/harness/admin.py +0 -0
  48. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/apps/harness/apps.py +0 -0
  49. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/apps/harness/migrations/0001_initial.py +0 -0
  50. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/apps/harness/migrations/__init__.py +0 -0
  51. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/apps/harness/models.py +0 -0
  52. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/apps/harness/templatetags/__init__.py +0 -0
  53. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/apps/integrations/__init__.py +0 -0
  54. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/apps/integrations/admin.py +0 -0
  55. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/apps/integrations/apps.py +0 -0
  56. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/apps/integrations/migrations/0001_initial.py +0 -0
  57. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/apps/integrations/migrations/0002_brokerconnection_brokeraccount_instrumentmap.py +0 -0
  58. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/apps/integrations/migrations/__init__.py +0 -0
  59. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/apps/integrations/models.py +0 -0
  60. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/apps/mcp/__init__.py +0 -0
  61. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/apps/mcp/admin.py +0 -0
  62. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/apps/mcp/apps.py +0 -0
  63. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/apps/mcp/migrations/0001_initial.py +0 -0
  64. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/apps/mcp/migrations/0002_mcpexternalpermissionrequest.py +0 -0
  65. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/apps/mcp/migrations/__init__.py +0 -0
  66. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/apps/mcp/models.py +0 -0
  67. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/apps/mcp/services.py +0 -0
  68. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/apps/orders/__init__.py +0 -0
  69. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/apps/orders/admin.py +0 -0
  70. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/apps/orders/apps.py +0 -0
  71. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/apps/orders/migrations/0001_initial.py +0 -0
  72. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/apps/orders/migrations/0002_approvalreceipt_approved_order_type_and_more.py +0 -0
  73. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/apps/orders/migrations/0003_migrate_orderintent_to_orderticket.py +0 -0
  74. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/apps/orders/migrations/0004_remove_order_intent_compat_fields.py +0 -0
  75. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/apps/orders/migrations/__init__.py +0 -0
  76. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/apps/orders/models.py +0 -0
  77. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/apps/orders/services.py +0 -0
  78. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/apps/policy/__init__.py +0 -0
  79. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/apps/policy/admin.py +0 -0
  80. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/apps/policy/apps.py +0 -0
  81. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/apps/policy/migrations/0001_initial.py +0 -0
  82. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/apps/policy/migrations/__init__.py +0 -0
  83. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/apps/policy/models.py +0 -0
  84. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/apps/policy/services.py +0 -0
  85. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/apps/portfolio/__init__.py +0 -0
  86. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/apps/portfolio/admin.py +0 -0
  87. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/apps/portfolio/apps.py +0 -0
  88. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/apps/portfolio/migrations/0001_initial.py +0 -0
  89. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/apps/portfolio/migrations/0002_brokersyncrun_portfolioledgerevent_reconciliationrun.py +0 -0
  90. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/apps/portfolio/migrations/__init__.py +0 -0
  91. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/apps/portfolio/models.py +0 -0
  92. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/apps/workflows/__init__.py +0 -0
  93. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/apps/workflows/admin.py +0 -0
  94. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/apps/workflows/apps.py +0 -0
  95. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/apps/workflows/migrations/0001_initial.py +0 -0
  96. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/apps/workflows/migrations/__init__.py +0 -0
  97. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/apps/workflows/models.py +0 -0
  98. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/assets/tradingcodex-banner.svg +0 -0
  99. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/docs/README.md +0 -0
  100. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/docs/artifact-supervisor-loop-prd.md +0 -0
  101. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/docs/components.md +0 -0
  102. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/docs/core-concepts-and-rules.md +0 -0
  103. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/docs/financial-workflow-references.md +0 -0
  104. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/docs/guardrails.md +0 -0
  105. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/docs/harness.md +0 -0
  106. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/docs/improvement-loop.md +0 -0
  107. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/docs/interfaces-and-surfaces.md +0 -0
  108. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/docs/licensing-and-commercialization.md +0 -0
  109. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/docs/product-direction.md +0 -0
  110. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/docs/research-memory-and-artifacts.md +0 -0
  111. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/docs/roles-skills-and-workflows.md +0 -0
  112. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/docs/system-architecture.md +0 -0
  113. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/docs/user-facing-skills.md +0 -0
  114. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/docs/validation-and-test-plan.md +0 -0
  115. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/install.sh +0 -0
  116. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/installation.md +0 -0
  117. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/setup.cfg +0 -0
  118. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tests/test_broker_center_prd.py +0 -0
  119. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tests/test_e2e_user_scenarios.py +0 -0
  120. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tradingcodex.egg-info/SOURCES.txt +0 -0
  121. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tradingcodex.egg-info/dependency_links.txt +0 -0
  122. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tradingcodex.egg-info/entry_points.txt +0 -0
  123. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tradingcodex.egg-info/requires.txt +0 -0
  124. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tradingcodex.egg-info/top_level.txt +0 -0
  125. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tradingcodex_cli/__init__.py +0 -0
  126. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tradingcodex_cli/__main__.py +0 -0
  127. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tradingcodex_cli/commands/__init__.py +0 -0
  128. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tradingcodex_cli/commands/bootstrap.py +0 -0
  129. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tradingcodex_cli/commands/build.py +0 -0
  130. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tradingcodex_cli/commands/connectors.py +0 -0
  131. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tradingcodex_cli/commands/db.py +0 -0
  132. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tradingcodex_cli/commands/decision.py +0 -0
  133. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tradingcodex_cli/commands/mode.py +0 -0
  134. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tradingcodex_cli/commands/orders.py +0 -0
  135. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tradingcodex_cli/commands/policy.py +0 -0
  136. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tradingcodex_cli/commands/profile.py +0 -0
  137. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tradingcodex_cli/commands/research.py +0 -0
  138. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tradingcodex_cli/commands/skills.py +0 -0
  139. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tradingcodex_cli/commands/strategies.py +0 -0
  140. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tradingcodex_cli/commands/subagents.py +0 -0
  141. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tradingcodex_cli/commands/utils.py +0 -0
  142. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tradingcodex_cli/commands/workflow.py +0 -0
  143. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tradingcodex_cli/commands/workspaces.py +0 -0
  144. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tradingcodex_cli/generator.py +0 -0
  145. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tradingcodex_cli/mcp_stdio.py +0 -0
  146. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tradingcodex_cli/service_autostart.py +0 -0
  147. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tradingcodex_cli/startup_status.py +0 -0
  148. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tradingcodex_service/__init__.py +0 -0
  149. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tradingcodex_service/admin.py +0 -0
  150. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tradingcodex_service/api.py +0 -0
  151. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tradingcodex_service/application/__init__.py +0 -0
  152. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tradingcodex_service/application/artifact_quality.py +0 -0
  153. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tradingcodex_service/application/audit.py +0 -0
  154. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tradingcodex_service/application/brokers.py +0 -0
  155. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tradingcodex_service/application/common.py +0 -0
  156. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tradingcodex_service/application/components.py +0 -0
  157. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tradingcodex_service/application/context_budget.py +0 -0
  158. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tradingcodex_service/application/markdown_preview.py +0 -0
  159. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tradingcodex_service/application/orders.py +0 -0
  160. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tradingcodex_service/application/policy.py +0 -0
  161. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tradingcodex_service/application/portfolio.py +0 -0
  162. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tradingcodex_service/application/research.py +0 -0
  163. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tradingcodex_service/application/runtime.py +0 -0
  164. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tradingcodex_service/application/runtime_mode.py +0 -0
  165. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tradingcodex_service/application/workflow_routing.py +0 -0
  166. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tradingcodex_service/asgi.py +0 -0
  167. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tradingcodex_service/mcp_runtime.py +0 -0
  168. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tradingcodex_service/settings.py +0 -0
  169. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tradingcodex_service/static/tradingcodex_admin/favicon.svg +0 -0
  170. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tradingcodex_service/static/tradingcodex_web/app.css +0 -0
  171. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tradingcodex_service/static/tradingcodex_web/app.js +0 -0
  172. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tradingcodex_service/static/vendor/htmx/htmx.min.js +0 -0
  173. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tradingcodex_service/templates/web/activity.html +0 -0
  174. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tradingcodex_service/templates/web/agent_skills.html +0 -0
  175. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tradingcodex_service/templates/web/agents.html +0 -0
  176. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tradingcodex_service/templates/web/base.html +0 -0
  177. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tradingcodex_service/templates/web/brokers.html +0 -0
  178. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tradingcodex_service/templates/web/build_center.html +0 -0
  179. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tradingcodex_service/templates/web/dashboard.html +0 -0
  180. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tradingcodex_service/templates/web/decisions.html +0 -0
  181. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tradingcodex_service/templates/web/fragments/role_inspector.html +0 -0
  182. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tradingcodex_service/templates/web/fragments/starter_prompt.html +0 -0
  183. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tradingcodex_service/templates/web/fragments/topology_canvas.html +0 -0
  184. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tradingcodex_service/templates/web/fragments/workspace_card.html +0 -0
  185. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tradingcodex_service/templates/web/harness.html +0 -0
  186. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tradingcodex_service/templates/web/mcp_router.html +0 -0
  187. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tradingcodex_service/templates/web/orders.html +0 -0
  188. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tradingcodex_service/templates/web/policy.html +0 -0
  189. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tradingcodex_service/templates/web/portfolio.html +0 -0
  190. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tradingcodex_service/templates/web/research.html +0 -0
  191. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tradingcodex_service/templates/web/starter_prompt.html +0 -0
  192. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tradingcodex_service/templates/web/strategies.html +0 -0
  193. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tradingcodex_service/wsgi.py +0 -0
  194. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/__init__.py +0 -0
  195. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/audit/files/.tradingcodex/audit/README.md +0 -0
  196. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/audit/files/trading/audit/.gitkeep +0 -0
  197. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/audit/module.json +0 -0
  198. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/codex-base/files/.codex/hooks.json +0 -0
  199. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/codex-base/files/.codex/prompts/base_instructions/head-manager.md +0 -0
  200. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/codex-base/files/.codex/rules/tradingcodex.rules +0 -0
  201. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/codex-base/files/.tradingcodex/capabilities.yaml +0 -0
  202. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/codex-base/files/.tradingcodex/config.yaml +0 -0
  203. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/codex-base/files/.tradingcodex/policies/policy-bindings.yaml +0 -0
  204. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/codex-base/files/.tradingcodex/policies/principals.yaml +0 -0
  205. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/codex-base/files/.tradingcodex/policies/roles.yaml +0 -0
  206. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/codex-base/files/AGENTS.md +0 -0
  207. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/codex-base/files/pyproject.toml +0 -0
  208. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/codex-base/files/tcx +0 -0
  209. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/codex-base/module.json +0 -0
  210. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/policies/access-policies.yaml +0 -0
  211. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/policies/restricted-list.yaml +0 -0
  212. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/schemas/approval_receipt.schema.json +0 -0
  213. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/schemas/audit_event.schema.json +0 -0
  214. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/schemas/evidence_pack.schema.json +0 -0
  215. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/schemas/execution_result.schema.json +0 -0
  216. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/schemas/fundamental_report.schema.json +0 -0
  217. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/schemas/news_report.schema.json +0 -0
  218. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/schemas/order_ticket.schema.json +0 -0
  219. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/schemas/portfolio_review.schema.json +0 -0
  220. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/schemas/postmortem_report.schema.json +0 -0
  221. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/schemas/research_artifact.schema.json +0 -0
  222. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/schemas/risk_report.schema.json +0 -0
  223. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/schemas/technical_report.schema.json +0 -0
  224. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/schemas/thesis.schema.json +0 -0
  225. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/schemas/valuation.schema.json +0 -0
  226. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/enforcement-guardrails/module.json +0 -0
  227. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/fixed-subagents/files/.tradingcodex/mainagent/skill-change-proposals/.gitkeep +0 -0
  228. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/fixed-subagents/module.json +0 -0
  229. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/guidance-guardrails/files/.tradingcodex/guidance/guardrails.md +0 -0
  230. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/guidance-guardrails/files/.tradingcodex/guidance/task-quality-checklist.md +0 -0
  231. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/guidance-guardrails/module.json +0 -0
  232. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/information-barriers/files/.tradingcodex/policies/information-barriers.yaml +0 -0
  233. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/information-barriers/files/.tradingcodex/secrets.md +0 -0
  234. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/information-barriers/files/trading/approvals/.gitkeep +0 -0
  235. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/information-barriers/files/trading/forecasts/.gitkeep +0 -0
  236. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/information-barriers/files/trading/market-data/.gitkeep +0 -0
  237. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/information-barriers/files/trading/orders/approved/.gitkeep +0 -0
  238. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/information-barriers/files/trading/orders/draft/.gitkeep +0 -0
  239. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/information-barriers/files/trading/orders/executed/.gitkeep +0 -0
  240. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/information-barriers/files/trading/orders/rejected/.gitkeep +0 -0
  241. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/information-barriers/files/trading/portfolio/.gitkeep +0 -0
  242. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/information-barriers/files/trading/reports/fundamental/.gitkeep +0 -0
  243. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/information-barriers/files/trading/reports/instrument/.gitkeep +0 -0
  244. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/information-barriers/files/trading/reports/macro/.gitkeep +0 -0
  245. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/information-barriers/files/trading/reports/news/.gitkeep +0 -0
  246. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/information-barriers/files/trading/reports/policy/.gitkeep +0 -0
  247. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/information-barriers/files/trading/reports/portfolio/.gitkeep +0 -0
  248. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/information-barriers/files/trading/reports/postmortem/.gitkeep +0 -0
  249. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/information-barriers/files/trading/reports/risk/.gitkeep +0 -0
  250. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/information-barriers/files/trading/reports/technical/.gitkeep +0 -0
  251. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/information-barriers/files/trading/reports/valuation/.gitkeep +0 -0
  252. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/information-barriers/files/trading/research/.gitkeep +0 -0
  253. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/information-barriers/module.json +0 -0
  254. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/paper-trading/module.json +0 -0
  255. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/postmortem/files/.tradingcodex/workflows/postmortem.yaml +0 -0
  256. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/postmortem/module.json +0 -0
  257. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/repo-skills/files/.agents/skills/automate-workflow/SKILL.md +0 -0
  258. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/repo-skills/files/.agents/skills/automate-workflow/agents/openai.yaml +0 -0
  259. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/repo-skills/files/.agents/skills/plan-workflow/SKILL.md +0 -0
  260. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/repo-skills/files/.agents/skills/plan-workflow/agents/openai.yaml +0 -0
  261. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/repo-skills/files/.agents/skills/postmortem/SKILL.md +0 -0
  262. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/repo-skills/files/.agents/skills/postmortem/agents/openai.yaml +0 -0
  263. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/repo-skills/files/.agents/skills/strategy-creator/SKILL.md +0 -0
  264. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/repo-skills/files/.agents/skills/strategy-creator/agents/openai.yaml +0 -0
  265. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/repo-skills/files/.agents/skills/tcx-build/SKILL.md +0 -0
  266. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/repo-skills/files/.agents/skills/tcx-build/agents/openai.yaml +0 -0
  267. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/repo-skills/files/.agents/skills/tcx-server/SKILL.md +0 -0
  268. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/repo-skills/files/.agents/skills/tcx-server/agents/openai.yaml +0 -0
  269. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/repo-skills/files/.agents/skills/tcx-workflow/SKILL.md +0 -0
  270. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/repo-skills/files/.agents/skills/tcx-workflow/agents/openai.yaml +0 -0
  271. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/repo-skills/files/.agents/skills/tcx-workflow/references/decision-quality-spine.md +0 -0
  272. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/execution-operator/execute-paper-order/SKILL.md +0 -0
  273. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/execution-operator/execute-paper-order/agents/openai.yaml +0 -0
  274. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/fundamental-analyst/fundamental-analysis/SKILL.md +0 -0
  275. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/fundamental-analyst/fundamental-analysis/agents/openai.yaml +0 -0
  276. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/instrument-analyst/instrument-analysis/SKILL.md +0 -0
  277. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/instrument-analyst/instrument-analysis/agents/openai.yaml +0 -0
  278. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/judgment-reviewer/agent-judgment-review/SKILL.md +0 -0
  279. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/judgment-reviewer/agent-judgment-review/agents/openai.yaml +0 -0
  280. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/macro-analyst/macro-analysis/SKILL.md +0 -0
  281. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/macro-analyst/macro-analysis/agents/openai.yaml +0 -0
  282. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/news-analyst/news-analysis/SKILL.md +0 -0
  283. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/news-analyst/news-analysis/agents/openai.yaml +0 -0
  284. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/portfolio-manager/create-order-ticket/SKILL.md +0 -0
  285. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/portfolio-manager/create-order-ticket/agents/openai.yaml +0 -0
  286. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/portfolio-manager/portfolio-review/SKILL.md +0 -0
  287. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/portfolio-manager/portfolio-review/agents/openai.yaml +0 -0
  288. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/risk-manager/approve-order/SKILL.md +0 -0
  289. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/risk-manager/approve-order/agents/openai.yaml +0 -0
  290. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/risk-manager/policy-review/SKILL.md +0 -0
  291. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/risk-manager/policy-review/agents/openai.yaml +0 -0
  292. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/risk-manager/review-risk/SKILL.md +0 -0
  293. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/risk-manager/review-risk/agents/openai.yaml +0 -0
  294. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/shared/anti-overfit-validation/SKILL.md +0 -0
  295. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/shared/anti-overfit-validation/agents/openai.yaml +0 -0
  296. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/shared/collect-evidence/SKILL.md +0 -0
  297. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/shared/collect-evidence/agents/openai.yaml +0 -0
  298. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/shared/external-data-source-gate/SKILL.md +0 -0
  299. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/shared/external-data-source-gate/agents/openai.yaml +0 -0
  300. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/shared/forecasting-discipline/SKILL.md +0 -0
  301. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/shared/forecasting-discipline/agents/openai.yaml +0 -0
  302. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/shared/numeric-data-qc/SKILL.md +0 -0
  303. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/shared/numeric-data-qc/agents/openai.yaml +0 -0
  304. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/shared/thesis-scenario-tree/SKILL.md +0 -0
  305. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/shared/thesis-scenario-tree/agents/openai.yaml +0 -0
  306. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/technical-analyst/technical-analysis/SKILL.md +0 -0
  307. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/technical-analyst/technical-analysis/agents/openai.yaml +0 -0
  308. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/valuation-analyst/valuation-review/SKILL.md +0 -0
  309. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/valuation-analyst/valuation-review/agents/openai.yaml +0 -0
  310. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/repo-skills/module.json +0 -0
  311. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/stub-execution/module.json +0 -0
  312. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/tradingcodex-mcp/files/.tradingcodex/mcp/enforcer/README.md +0 -0
  313. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/tradingcodex-mcp/files/.tradingcodex/mcp/gateway/README.md +0 -0
  314. {tradingcodex-0.3.4 → tradingcodex-0.3.6}/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.4
3
+ Version: 0.3.6
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.4` | Build Center customization, Codex MCP discovery/import, external MCP permission approval UX, head-manager research synthesis depth, flexible package/workspace update status, skipped-version Django migration smoke coverage, 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.6` | Reviewer follow-up loop fixes, duplicate pending-task protection, harness cleanup, safe TradingCodex MCP tools auto-approved for subagents, execution tools hidden outside `execution-operator`, Build Center customization, Codex MCP discovery/import, external MCP permission approval UX, head-manager research synthesis depth, flexible package/workspace update status, skipped-version Django migration smoke coverage, 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.4` | Build Center customization, Codex MCP discovery/import, external MCP permission approval UX, head-manager research synthesis depth, flexible package/workspace update status, skipped-version Django migration smoke coverage, 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.6` | Reviewer follow-up loop fixes, duplicate pending-task protection, harness cleanup, safe TradingCodex MCP tools auto-approved for subagents, execution tools hidden outside `execution-operator`, Build Center customization, Codex MCP discovery/import, external MCP permission approval UX, head-manager research synthesis depth, flexible package/workspace update status, skipped-version Django migration smoke coverage, 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
 
@@ -143,7 +143,7 @@ After the PyPI workflow completes:
143
143
 
144
144
  ```bash
145
145
  python3.11 -m venv /tmp/tcx-pypi
146
- /tmp/tcx-pypi/bin/pip install tradingcodex==0.3.4
146
+ /tmp/tcx-pypi/bin/pip install tradingcodex==0.3.6
147
147
  rm -rf /tmp/tcx-pypi-smoke
148
148
  mkdir -p /tmp/tcx-pypi-smoke
149
149
  cd /tmp/tcx-pypi-smoke
@@ -250,7 +250,12 @@ Use PEP 440 versions:
250
250
  - `0.3.4` for Build Center customization, Codex MCP discovery/import, external
251
251
  MCP permission approval UX, and head-manager research synthesis depth after
252
252
  `0.3.3`
253
- - later patch releases for compatible fixes after `0.3.4`
253
+ - `0.3.5` for safe built-in TradingCodex MCP auto-approval, execution-tool
254
+ hiding outside `execution-operator`, and service-gated execution UX after
255
+ `0.3.4`
256
+ - `0.3.6` for reviewer follow-up loop fixes, duplicate pending-task protection,
257
+ and harness cleanup after `0.3.5`
258
+ - later patch releases for compatible fixes after `0.3.6`
254
259
  - pre-releases such as `0.4.0a1`, `0.4.0b1`, or `0.4.0rc1` when preparing
255
260
  the next minor contract
256
261
 
@@ -281,6 +281,14 @@ The config follows the OpenAI Codex MCP shape:
281
281
  - `startup_timeout_sec`
282
282
  - `tool_timeout_sec`
283
283
 
284
+ The built-in `tradingcodex` MCP server defaults safe enabled tools to
285
+ `approve` so routine research, audit, status, and reviewed service calls do not
286
+ bury Codex permission prompts inside subagent transcripts. Execution-sensitive
287
+ tools remain excluded from non-execution roles; `execution-operator` exposes
288
+ only the TradingCodex approved-order submit/cancel tools, and the service layer
289
+ still revalidates permission, policy, approval, duplicate-request state,
290
+ connection, and audit before any adapter call.
291
+
284
292
  Project-scoped Codex config applies only when the generated workspace is
285
293
  trusted by Codex.
286
294
 
@@ -298,6 +306,8 @@ Generated permission profiles allow network access for public evidence
298
306
  gathering, such as filings, disclosures, news, web sources, and market-data
299
307
  references. They still deny workspace secret paths and do not authorize direct
300
308
  broker APIs, broker-specific Codex MCP servers, approval bypass, or execution.
309
+ Managed external Codex MCP entries written through `tcx build codex-mcp add`
310
+ default to `prompt`; import them into the External MCP Gate before use.
301
311
  Broker APIs are attached through provider-driven TradingCodex connector profiles
302
312
  using canonical MCP tools such as `list_broker_adapter_providers`,
303
313
  `scaffold_broker_connector`, `register_broker_connector`,
@@ -438,7 +448,6 @@ enforcement.
438
448
  route to the `connector_build` lane and `$tcx-build`, not investment
439
449
  thesis review; their workflow packages use workflow lifecycle and boundary
440
450
  sections rather than thesis lifecycle or portfolio/risk sections
441
- dispatch
442
451
  - secret-only routing: credential, token, password, broker-key, or `.env`
443
452
  storage/read/rotation prompts create warning context without activating
444
453
  investment subagent dispatch unless a separate investment or execution
@@ -137,6 +137,12 @@ External MCP permission is not execution authorization. Even if an external
137
137
  broker order tool is present and reviewed, order submission must still pass the
138
138
  TradingCodex order-ticket, approval, duplicate-request, connection, and audit lifecycle.
139
139
 
140
+ The built-in TradingCodex MCP server auto-approves safe enabled tools to avoid
141
+ buried subagent prompts for routine research and audit writes. Execution
142
+ submission and cancellation are the exception: non-execution roles do not see
143
+ those tools, and `execution-operator` can only submit or cancel through
144
+ TradingCodex service-layer checks.
145
+
140
146
  Reviewed external MCP calls that expose private account state, write research
141
147
  state, use workflow prompts, or map to execution require an explicit user
142
148
  permission request before proxy evaluation returns `allow`. The request is
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "tradingcodex"
7
- version = "0.3.4"
7
+ version = "0.3.6"
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"
@@ -36,14 +36,8 @@ from tradingcodex_service.application.harness import (
36
36
  get_harness_health,
37
37
  build_subagent_starter_prompt,
38
38
  build_workflow_intake_summary,
39
- classify_starter_request,
40
39
  evaluate_artifact_supervisor_loop,
41
- is_connector_build_request,
42
- is_investment_workflow_request,
43
- is_secret_only_request,
44
40
  list_workflow_improvements,
45
- normalize_investment_intent,
46
- plan_follow_up_request,
47
41
  )
48
42
  from tradingcodex_service.application.decision_packages import (
49
43
  build_workflow_plan,
@@ -59,6 +53,12 @@ from tradingcodex_service.application.workflow_planner import (
59
53
  )
60
54
  from tradingcodex_service.application.workflow_routing import (
61
55
  build_loop_exit_criteria,
56
+ classify_starter_request,
57
+ is_connector_build_request,
58
+ is_investment_workflow_request,
59
+ is_secret_only_request,
60
+ normalize_investment_intent,
61
+ plan_follow_up_request,
62
62
  selected_workflow_roles,
63
63
  workflow_plan_has_role,
64
64
  )
@@ -1355,7 +1355,9 @@ def test_python_generator_creates_workspace_contract(tmp_path: Path) -> None:
1355
1355
  assert "TradingCodex doctor passed" in doctor
1356
1356
  assert "improvement" in doctor
1357
1357
  assert "TradingCodex MCP autostarts local service" in doctor
1358
+ assert "TradingCodex MCP safe tools auto-approved" in doctor
1358
1359
  assert "head-manager MCP execution submit excluded" in doctor
1360
+ assert "non-execution roles block execution MCP tools" in doctor
1359
1361
  assert "execution-operator MCP execution allowlist configured" in doctor
1360
1362
  assert "risk-manager MCP approval allowlist configured" in doctor
1361
1363
  improvement_doctor = run(["./tcx", "doctor", "--layer", "improvement"], workspace).stdout
@@ -1482,6 +1484,7 @@ def test_python_generator_creates_workspace_contract(tmp_path: Path) -> None:
1482
1484
  assert root_mcp["command"] == "uvx"
1483
1485
  assert root_mcp["args"] == expected_tcx_mcp_args
1484
1486
  assert root_mcp["enabled"] is True
1487
+ assert root_mcp["default_tools_approval_mode"] == "approve"
1485
1488
  assert root_mcp["env"]["TRADINGCODEX_MCP_AUTOSTART_SERVICE"] == "1"
1486
1489
  assert root_mcp["env"]["TRADINGCODEX_SERVICE_ADDR"] == "127.0.0.1:48267"
1487
1490
  assert root_mcp["env"]["TRADINGCODEX_WORKSPACE_ROOT"] == str(workspace)
@@ -1510,6 +1513,7 @@ def test_python_generator_creates_workspace_contract(tmp_path: Path) -> None:
1510
1513
  assert "preview_order_translation" in root_mcp["enabled_tools"]
1511
1514
  assert "submit_approved_order" not in root_mcp["enabled_tools"]
1512
1515
  assert "cancel_approved_order" not in root_mcp["enabled_tools"]
1516
+ sensitive_execution_tools = {"submit_approved_order", "cancel_approved_order"}
1513
1517
  for agent_file in agent_files:
1514
1518
  agent_config = agent_file.read_text(encoding="utf-8")
1515
1519
  agent_toml = tomllib.loads(agent_config)
@@ -1527,6 +1531,7 @@ def test_python_generator_creates_workspace_contract(tmp_path: Path) -> None:
1527
1531
  agent_mcp = agent_toml["mcp_servers"]["tradingcodex"]
1528
1532
  assert agent_mcp["command"] == "uvx"
1529
1533
  assert agent_mcp["args"] == expected_tcx_mcp_args
1534
+ assert agent_mcp["default_tools_approval_mode"] == "approve"
1530
1535
  assert agent_mcp["env"]["TRADINGCODEX_MCP_AUTOSTART_SERVICE"] == "1"
1531
1536
  assert agent_mcp["env"]["TRADINGCODEX_WORKSPACE_ROOT"] == str(workspace)
1532
1537
  configured_tools = set(agent_mcp.get("enabled_tools", [])) | set(agent_mcp.get("disabled_tools", []))
@@ -1543,8 +1548,12 @@ def test_python_generator_creates_workspace_contract(tmp_path: Path) -> None:
1543
1548
  assert "create_order_ticket" not in agent_mcp["enabled_tools"]
1544
1549
  if agent_file.stem == "execution-operator":
1545
1550
  assert "submit_approved_order" in agent_mcp["enabled_tools"]
1551
+ assert "cancel_approved_order" in agent_mcp["enabled_tools"]
1546
1552
  assert "request_order_approval" not in agent_mcp["enabled_tools"]
1547
1553
  assert {"place_order", "replace_order", "withdraw"}.isdisjoint(set(agent_mcp["enabled_tools"]))
1554
+ else:
1555
+ assert sensitive_execution_tools.isdisjoint(set(agent_mcp["enabled_tools"]))
1556
+ assert sensitive_execution_tools.issubset(set(agent_mcp.get("disabled_tools", [])))
1548
1557
  assert run(["./tcx", "skills", "list"], workspace).stdout.splitlines() == [
1549
1558
  "plan-workflow",
1550
1559
  "tcx-workflow",
@@ -2333,9 +2342,44 @@ def test_dynamic_workflow_plan_validation_and_recording(tmp_path: Path) -> None:
2333
2342
  loop_state = json.loads((workspace / result["loop_state_path"]).read_text(encoding="utf-8"))
2334
2343
  assert loop_state["state_mode"] == "validated_dynamic_workflow_plan"
2335
2344
  assert loop_state["pending_tasks"][0]["status"] == "pending"
2345
+ assert loop_state["pending_tasks"][0]["active_roles"] == []
2346
+ assert loop_state["pending_tasks"][0]["completed_roles"] == []
2336
2347
  latest_loop_state = json.loads((workspace / ".tradingcodex/mainagent/workflow-loop-state.json").read_text(encoding="utf-8"))
2337
2348
  assert latest_loop_state["selected_team"] == loop_state["selected_team"]
2338
2349
  assert latest_loop_state["allowed_followup_team"] == loop_state["allowed_followup_team"]
2350
+
2351
+ hook = workspace / ".codex" / "hooks" / "tradingcodex_hook.py"
2352
+ for event, role in (
2353
+ ("subagent-start", "fundamental-analyst"),
2354
+ ("subagent-stop", "fundamental-analyst"),
2355
+ ):
2356
+ run(
2357
+ [sys.executable, str(hook), event],
2358
+ workspace,
2359
+ input_text=json.dumps({"workflow_run_id": preview["workflow_run_id"], "agent_type": role, "task_name": f"{role} evidence"}),
2360
+ )
2361
+ partial_state = json.loads((workspace / result["loop_state_path"]).read_text(encoding="utf-8"))
2362
+ evidence_task = next(task for task in partial_state["pending_tasks"] if task["stage_id"] == "evidence")
2363
+ judgment_task = next(task for task in partial_state["pending_tasks"] if task["stage_id"] == "judgment_review")
2364
+ assert evidence_task["status"] == "active"
2365
+ assert evidence_task["completed_roles"] == ["fundamental-analyst"]
2366
+ assert evidence_task["active_roles"] == []
2367
+ assert judgment_task["status"] == "blocked_by_dependency"
2368
+
2369
+ for role in ("technical-analyst", "news-analyst"):
2370
+ for event in ("subagent-start", "subagent-stop"):
2371
+ run(
2372
+ [sys.executable, str(hook), event],
2373
+ workspace,
2374
+ input_text=json.dumps({"workflow_run_id": preview["workflow_run_id"], "agent_type": role, "task_name": f"{role} evidence"}),
2375
+ )
2376
+ complete_state = json.loads((workspace / result["loop_state_path"]).read_text(encoding="utf-8"))
2377
+ evidence_task = next(task for task in complete_state["pending_tasks"] if task["stage_id"] == "evidence")
2378
+ judgment_task = next(task for task in complete_state["pending_tasks"] if task["stage_id"] == "judgment_review")
2379
+ assert evidence_task["status"] == "completed"
2380
+ assert evidence_task["completed_roles"] == ["fundamental-analyst", "technical-analyst", "news-analyst"]
2381
+ assert judgment_task["status"] == "pending"
2382
+
2339
2383
  dict_role_plan = {
2340
2384
  **preview,
2341
2385
  "workflow_run_id": preview["workflow_run_id"] + "-dict-role",
@@ -2918,7 +2962,18 @@ improvements:
2918
2962
  assert listed_improvements["index_path"] == ".tradingcodex/mainagent/improve-index.json"
2919
2963
  assert listed_improvements["index_status"] == "current"
2920
2964
  assert listed_improvements["summary"]["by_type"]["valuation_sensitivity"] == 1
2965
+ queued_task_ids = [
2966
+ task["task_id"]
2967
+ for task in recorded_state["pending_tasks"]
2968
+ if task.get("task_type") == "artifact_follow_up"
2969
+ ]
2921
2970
  evaluate_artifact_supervisor_loop(workspace, request, ["trading/reports/news/nvda-news.md"], record=True)
2971
+ recorded_again_state = json.loads((workspace / ".tradingcodex" / "mainagent" / "workflow-loop-state.json").read_text(encoding="utf-8"))
2972
+ assert [
2973
+ task["task_id"]
2974
+ for task in recorded_again_state["pending_tasks"]
2975
+ if task.get("task_type") == "artifact_follow_up"
2976
+ ] == queued_task_ids
2922
2977
  listed_again = json.loads(run(["./tcx", "workflow", "improve"], workspace).stdout)
2923
2978
  assert listed_again["improvement_count"] == listed_improvements["improvement_count"]
2924
2979
  improve_index.unlink()
@@ -2979,6 +3034,50 @@ improvements:
2979
3034
  assert revise_loop["pending_tasks"][0]["planner_action"] == "revise_same_role"
2980
3035
  assert revise_loop["pending_tasks"][0]["role"] == "news-analyst"
2981
3036
 
3037
+ judgment_artifact = workspace / "trading" / "reports" / "judgment" / "nvda-judgment.md"
3038
+ judgment_artifact.parent.mkdir(parents=True, exist_ok=True)
3039
+ judgment_artifact.write_text(
3040
+ """---
3041
+ artifact_id: nvda-judgment
3042
+ artifact_type: judgment_review
3043
+ role: judgment-reviewer
3044
+ title: NVDA judgment review
3045
+ source_as_of: "2026-06-30"
3046
+ readiness_label: needs-news-revision
3047
+ context_summary: Reviewer found a source freshness gap owned by news.
3048
+ reader_summary: Judgment review asks news to refresh one evidence point.
3049
+ next_action: Ask news to refresh the source timestamp before synthesis.
3050
+ handoff_state: revise
3051
+ confidence: medium
3052
+ next_recipient: news-analyst
3053
+ missing_evidence: [refreshed news source timestamp]
3054
+ blocked_actions: [synthesis]
3055
+ source_snapshot_ids: [judgment-source-001]
3056
+ follow_up_requests:
3057
+ - trigger: freshness_gap
3058
+ suggested_role: news-analyst
3059
+ question: Refresh the stale source timestamp before synthesis.
3060
+ reason: Judgment review found a freshness gap in the news artifact.
3061
+ materiality: medium
3062
+ requested_by_role: judgment-reviewer
3063
+ source_artifact_id: nvda-judgment
3064
+ source_artifact_path: trading/reports/judgment/nvda-judgment.md
3065
+ source_artifact_version: 1
3066
+ source_artifact_content_hash: sha256:judgment
3067
+ required_inputs: [accepted judgment review]
3068
+ suggested_consent_posture: no_consent_expected
3069
+ blocked_actions: [synthesis]
3070
+ ---
3071
+
3072
+ [factual] Reviewer found a freshness gap.
3073
+ """,
3074
+ encoding="utf-8",
3075
+ )
3076
+ judgment_loop = evaluate_artifact_supervisor_loop(workspace, request, ["trading/reports/judgment/nvda-judgment.md"])
3077
+ assert judgment_loop["pending_tasks"][0]["planner_action"] == "follow_up_existing_team"
3078
+ assert judgment_loop["pending_tasks"][0]["role"] == "news-analyst"
3079
+ assert all(task.get("role") != "judgment-reviewer" for task in judgment_loop["pending_tasks"])
3080
+
2982
3081
  bad_artifact = workspace / "trading" / "reports" / "news" / "bad-followup.md"
2983
3082
  bad_artifact.write_text(
2984
3083
  artifact.read_text(encoding="utf-8").replace(
@@ -3740,6 +3839,7 @@ env = { TOKEN = "also-hidden" }
3740
3839
  assert "[mcp_servers.managed_one]" in text
3741
3840
  assert "[mcp_servers.managed_two]" in text
3742
3841
  assert "MANAGED_KEY" in text
3842
+ assert 'default_tools_approval_mode = "prompt"' in text
3743
3843
 
3744
3844
  with pytest.raises(ValueError, match="outside TradingCodex managed block"):
3745
3845
  write_codex_mcp_server_config(workspace, name="user_mcp", command="uvx", full_access_detected=True)
@@ -3780,6 +3880,7 @@ def test_tcx_build_cli_status_and_codex_mcp_dry_run(tmp_path: Path) -> None:
3780
3880
  )
3781
3881
  assert dry_run["status"] == "dry_run"
3782
3882
  assert "[mcp_servers.cli_mcp]" in dry_run["preview"]
3883
+ assert 'default_tools_approval_mode = "prompt"' in dry_run["preview"]
3783
3884
 
3784
3885
  run([sys.executable, "-m", "tradingcodex_cli", "mode", "set", "build", "--reason", "cli build smoke"], workspace, env_extra=env_extra)
3785
3886
  status = json.loads(run([sys.executable, "-m", "tradingcodex_cli", "build", "status", "--json"], workspace, env_extra=env_extra).stdout)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: tradingcodex
3
- Version: 0.3.4
3
+ Version: 0.3.6
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.4` | Build Center customization, Codex MCP discovery/import, external MCP permission approval UX, head-manager research synthesis depth, flexible package/workspace update status, skipped-version Django migration smoke coverage, 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.6` | Reviewer follow-up loop fixes, duplicate pending-task protection, harness cleanup, safe TradingCodex MCP tools auto-approved for subagents, execution tools hidden outside `execution-operator`, Build Center customization, Codex MCP discovery/import, external MCP permission approval UX, head-manager research synthesis depth, flexible package/workspace update status, skipped-version Django migration smoke coverage, 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
 
@@ -19,7 +19,6 @@ from tradingcodex_service.application.runtime import (
19
19
  tradingcodex_db_path,
20
20
  )
21
21
  from tradingcodex_cli.commands.utils import (
22
- _safe_read,
23
22
  list_subagents,
24
23
  path_check,
25
24
  read_thread_policy,
@@ -128,6 +127,15 @@ def _codex_mcp_config_checks(root: Path) -> list[dict[str, Any]]:
128
127
  root_tools = set(root_mcp.get("enabled_tools") or [])
129
128
  execution_tools = set(execution_mcp.get("enabled_tools") or [])
130
129
  risk_tools = set(risk_mcp.get("enabled_tools") or [])
130
+ sensitive_execution_tools = {"submit_approved_order", "cancel_approved_order"}
131
+ non_execution_exposure = []
132
+ for agent_path in sorted((root / ".codex" / "agents").glob("*.toml")):
133
+ if agent_path.stem == "execution-operator":
134
+ continue
135
+ enabled = set((_read_codex_mcp_config(agent_path).get("enabled_tools") or []))
136
+ exposed = sensitive_execution_tools & enabled
137
+ if exposed:
138
+ non_execution_exposure.append(f"{agent_path.stem}: {', '.join(sorted(exposed))}")
131
139
  raw_broker_tools = {"place_order", "replace_order", "cancel_order", "withdraw", "transfer"}
132
140
  broker_connector_tools = {
133
141
  "list_broker_adapter_providers",
@@ -153,6 +161,13 @@ def _codex_mcp_config_checks(root: Path) -> list[dict[str, Any]]:
153
161
  "codexNative": True,
154
162
  "detail": "MCP env enables dashboard/service autostart" if root_mcp.get("env", {}).get("TRADINGCODEX_MCP_AUTOSTART_SERVICE") == "1" else "missing TRADINGCODEX_MCP_AUTOSTART_SERVICE=1",
155
163
  },
164
+ {
165
+ "layer": "enforcement",
166
+ "name": "TradingCodex MCP safe tools auto-approved",
167
+ "ok": root_mcp.get("default_tools_approval_mode") == "approve",
168
+ "codexNative": True,
169
+ "detail": "default tool approval is approve" if root_mcp.get("default_tools_approval_mode") == "approve" else "default tool approval should be approve",
170
+ },
156
171
  {
157
172
  "layer": "enforcement",
158
173
  "name": "head-manager MCP execution submit excluded",
@@ -181,6 +196,13 @@ def _codex_mcp_config_checks(root: Path) -> list[dict[str, Any]]:
181
196
  "codexNative": True,
182
197
  "detail": "execution-operator allowlist includes submit_approved_order" if "submit_approved_order" in execution_tools else "missing submit_approved_order",
183
198
  },
199
+ {
200
+ "layer": "enforcement",
201
+ "name": "non-execution roles block execution MCP tools",
202
+ "ok": not non_execution_exposure,
203
+ "codexNative": True,
204
+ "detail": "submit/cancel disabled outside execution-operator" if not non_execution_exposure else "; ".join(non_execution_exposure),
205
+ },
184
206
  {
185
207
  "layer": "enforcement",
186
208
  "name": "execution-operator raw broker MCP tools excluded",
@@ -103,7 +103,6 @@ def mcp(root: Path, argv: list[str]) -> None:
103
103
  "follow_up_requests": _list_option(args, "--follow-up-requests"),
104
104
  "query": _option_value(args, "--query") or _option_value(args, "--q"),
105
105
  "limit": _int_option(args, "--limit"),
106
- "provider": _option_value(args, "--provider"),
107
106
  "source_category": _option_value(args, "--source-category") or _option_value(args, "--category"),
108
107
  "as_of": _option_value(args, "--as-of"),
109
108
  "live_confirmation": _option_value(args, "--live-confirmation"),
@@ -742,7 +742,6 @@ def create_or_update_strategy_skill(
742
742
  raise ValueError("; ".join(validation_errors))
743
743
  _atomic_write_text(skill_path, text)
744
744
  _atomic_write_text(skill_dir / "agents" / "openai.yaml", _render_openai_yaml(_strategy_display_name(name, body), description, f"Use ${name} to apply this user-approved strategy."))
745
- record = _strategy_record_payload(root, skill_path)
746
745
  project_agent_configuration(root, applied_by=actor)
747
746
  return _strategy_record_payload(root, skill_path)
748
747
 
@@ -1,6 +1,5 @@
1
1
  from __future__ import annotations
2
2
 
3
- import json
4
3
  import os
5
4
  import re
6
5
  import shutil
@@ -205,7 +205,6 @@ def _decision_markdown(metadata: dict[str, Any], plan: dict[str, Any]) -> str:
205
205
  frontmatter["workflow_lifecycle"] = metadata["workflow_lifecycle"]
206
206
  next_actions = "\n".join(f"- {item['label']}: {item['detail']}" for item in metadata["allowed_next_actions"]) or "- None yet."
207
207
  roles = ", ".join(metadata["selected_roles"]) or "head-manager"
208
- blocked = ", ".join(metadata["blocked_actions"]) or "none"
209
208
  profile = "\n".join(f"- {item}" for item in metadata["missing_profile"]) or "- No required profile gaps for this lane."
210
209
  stages = "\n".join(f"- {stage['label']}: {stage['summary']}" for stage in plan["intake_summary"].get("workflow_stages") or [])
211
210
  artifact_waiting = "waiting for workflow artifacts" if metadata.get("workflow_lifecycle") else "waiting for accepted role artifacts"
@@ -14,9 +14,7 @@ from tradingcodex_service.application.agents import (
14
14
  ROLE_FORBIDDEN_ACTIONS,
15
15
  ROLE_HANDOFF_CONTRACTS,
16
16
  ROLE_PURPOSES,
17
- ROLE_PERMISSION_PROFILES,
18
17
  ROLE_SKILL_MAP,
19
- USER_VISIBLE_SKILLS,
20
18
  read_strategy_skill_records,
21
19
  )
22
20
  from tradingcodex_service.application.components import count_harness_component_tags, list_harness_components
@@ -25,17 +23,13 @@ from tradingcodex_service.application.research import list_workspace_research_ar
25
23
  from tradingcodex_service.application.runtime import active_profile_for_workspace, ensure_runtime_database, tradingcodex_db_path, workspace_context_payload
26
24
  from tradingcodex_service.mcp_runtime import static_mcp_tools as _static_mcp_tools
27
25
  from tradingcodex_service.application.workflow_routing import (
28
- ARTIFACT_EVALUATION_STATES,
29
26
  BLOCKED_ACTION_COPY,
30
- DEFAULT_LOOP_POLICY,
31
27
  EDGE_GROUP_CONTRACTS,
32
- FIXED_INVESTMENT_ROLES,
33
28
  HANDOFF_STATES,
34
29
  IDEA_TRANSLATION_COPY,
35
30
  INVESTMENT_UNIVERSE_LABELS,
36
31
  JUDGMENT_CONTROL_COPY,
37
32
  JUDGMENT_REVIEW_ROLE,
38
- LANE_LOOP_POLICY_OVERRIDES,
39
33
  LOOP_CONTROL_COPY,
40
34
  LOOP_RUNS_DIR,
41
35
  LOOP_RUN_STATE_FILENAME,
@@ -48,33 +42,16 @@ from tradingcodex_service.application.workflow_routing import (
48
42
  PROFILE_FIELD_KEYS,
49
43
  PROFILE_QUESTION_COPY,
50
44
  PROFILE_REQUIRED_LANES,
51
- RESEARCH_AND_DECISION_ROLES,
52
45
  RESEARCH_STAGE_ROLES,
53
46
  ROLE_SELECTION_COPY,
54
47
  SUITABILITY_PROFILE_FIELDS,
55
48
  TERMINAL_WORKFLOW_ACTIONS,
56
49
  WORKFLOW_LANE_COPY,
57
- NormalizedInvestmentIntent,
58
- base_research_team,
59
- build_artifact_supervisor_loop_contract,
60
- build_delta_follow_up_brief,
61
50
  build_loop_exit_criteria,
62
51
  build_loop_policy,
63
- classify_investment_universe,
64
52
  classify_starter_request,
65
- explicit_public_equity_research_team,
66
- is_connector_build_request,
67
- is_connector_operations_only_request,
68
- is_investment_workflow_request,
69
- is_secret_only_request,
70
- is_secret_warning_request,
71
- negates_scope,
72
- normalize_investment_intent,
73
53
  plan_follow_up_request,
74
54
  workflow_plan_has_role,
75
- strip_guardrail_verification_phrases,
76
- strip_negated_action_phrases,
77
- strip_skill_invocation_tokens,
78
55
  )
79
56
 
80
57
 
@@ -211,7 +188,7 @@ def evaluate_artifact_supervisor_loop(
211
188
  root = Path(workspace_root or ".")
212
189
  state = read_workflow_loop_state(root)
213
190
  plan = _loop_plan_for_runtime(request, state)
214
- policy = plan.get("loopPolicy") or build_loop_policy(str(plan.get("lane") or "research_only"))
191
+ policy = {**build_loop_policy(str(plan.get("lane") or "research_only")), **(plan.get("loopPolicy") or {})}
215
192
  workflow_run_id = str(state.get("workflow_run_id") or f"workflow-preview-{stable_hash({'request': request, 'artifacts': artifact_paths})[:12]}")
216
193
  pending_tasks: list[dict[str, Any]] = []
217
194
  escalation_proposals: list[dict[str, Any]] = []
@@ -225,8 +202,17 @@ def evaluate_artifact_supervisor_loop(
225
202
  for task in state.get("pending_tasks", [])
226
203
  if isinstance(task, dict) and task.get("task_type") in {"artifact_follow_up", "same_role_revision"}
227
204
  ]
205
+ existing_task_ids = {str(task.get("task_id") or "") for task in existing_loop_tasks}
206
+ same_role_revision_counts: dict[str, int] = {}
207
+ for task in existing_loop_tasks:
208
+ if task.get("task_type") == "same_role_revision":
209
+ role = str(task.get("role") or "")
210
+ same_role_revision_counts[role] = same_role_revision_counts.get(role, 0) + 1
228
211
  remaining_budget = max(0, task_budget - len(existing_loop_tasks))
229
212
  followups_this_iteration = int(policy.get("max_followups_per_iteration") or 0)
213
+ revision_limit = int(policy.get("max_same_role_revisions") or 0)
214
+ max_iterations = int(policy.get("max_iterations") or 0)
215
+ iteration_exhausted = max_iterations > 0 and int(state.get("iteration") or 0) >= max_iterations
230
216
 
231
217
  for artifact_path in artifact_paths:
232
218
  quality = evaluate_artifact_quality(root, artifact_path, strict=True)
@@ -248,9 +234,19 @@ def evaluate_artifact_supervisor_loop(
248
234
  artifact_evaluations.append(artifact_record)
249
235
  improvements.extend(_artifact_improvements(workflow_run_id, artifact_record, frontmatter))
250
236
 
251
- if evaluation_action == "revise_artifact":
252
- pending_tasks.append(_same_role_revision_task(workflow_run_id, plan, artifact_record, quality))
253
- loop_decisions.append(_loop_decision("revise_same_role", f"{role} artifact needs repair before downstream use", artifact_record))
237
+ revision_followups = frontmatter.get("follow_up_requests") if role == JUDGMENT_REVIEW_ROLE and isinstance(frontmatter.get("follow_up_requests"), list) else []
238
+ if evaluation_action == "revise_artifact" and not (quality.get("status") == "pass" and revision_followups):
239
+ task = _same_role_revision_task(workflow_run_id, plan, artifact_record, quality)
240
+ if task["task_id"] in existing_task_ids:
241
+ loop_decisions.append(_loop_decision("waiting", f"{role} revision is already queued", {**artifact_record, "task_id": task["task_id"]}))
242
+ elif iteration_exhausted or remaining_budget <= 0 or same_role_revision_counts.get(role, 0) >= revision_limit:
243
+ loop_decisions.append(_loop_decision("waiting", f"{role} revision could not be queued within loop policy", {**artifact_record, "budget_exhausted": True}))
244
+ else:
245
+ pending_tasks.append(task)
246
+ existing_task_ids.add(task["task_id"])
247
+ same_role_revision_counts[role] = same_role_revision_counts.get(role, 0) + 1
248
+ remaining_budget -= 1
249
+ loop_decisions.append(_loop_decision("revise_same_role", f"{role} artifact needs repair before downstream use", artifact_record))
254
250
  continue
255
251
  if evaluation_action == "block_artifact":
256
252
  blocked_actions = _unique([*blocked_actions, *[str(item) for item in frontmatter.get("blocked_actions") or []]])
@@ -276,8 +272,13 @@ def evaluate_artifact_supervisor_loop(
276
272
  "requested_by_role": request_with_source.get("requested_by_role") or role,
277
273
  "materiality": request_with_source.get("materiality"),
278
274
  }
279
- if planner_action in {"follow_up_existing_team", "challenge_conflict"} and len(pending_tasks) < followups_this_iteration and remaining_budget > 0:
280
- pending_tasks.append(_follow_up_task(workflow_run_id, plan, request_with_source, decision, index))
275
+ if planner_action in {"follow_up_existing_team", "challenge_conflict"}:
276
+ task = _follow_up_task(workflow_run_id, plan, request_with_source, decision, index)
277
+ if planner_action in {"follow_up_existing_team", "challenge_conflict"} and task["task_id"] in existing_task_ids:
278
+ loop_decisions.append(_loop_decision("waiting", "loop task already queued", {**decision_record, "task_id": task["task_id"]}))
279
+ elif planner_action in {"follow_up_existing_team", "challenge_conflict"} and len(pending_tasks) < followups_this_iteration and remaining_budget > 0 and not iteration_exhausted:
280
+ pending_tasks.append(task)
281
+ existing_task_ids.add(task["task_id"])
281
282
  remaining_budget -= 1
282
283
  loop_decisions.append(_loop_decision(planner_action, decision["policy_reason"], decision_record))
283
284
  elif planner_action == "lane_escalation_proposal":
@@ -321,6 +322,7 @@ def _loop_plan_for_runtime(request: str, state: dict[str, Any]) -> dict[str, Any
321
322
  return classify_starter_request(request)
322
323
  lane = str(state.get("lane") or "research_only")
323
324
  selected = [str(role) for role in state.get("selected_team") or []]
325
+ state_policy = state.get("loop_policy") if isinstance(state.get("loop_policy"), dict) else {}
324
326
  plan: dict[str, Any] = {
325
327
  "universe": "public_equity",
326
328
  "lane": lane,
@@ -329,7 +331,7 @@ def _loop_plan_for_runtime(request: str, state: dict[str, Any]) -> dict[str, Any
329
331
  "selectedTeam": selected,
330
332
  "allowedFollowupTeam": [str(role) for role in state.get("allowed_followup_team") or selected],
331
333
  "escalationTeam": [str(role) for role in state.get("escalation_team") or []],
332
- "loopPolicy": state.get("loop_policy") or build_loop_policy(lane),
334
+ "loopPolicy": {**build_loop_policy(lane), **state_policy},
333
335
  "loopStatePath": LOOP_STATE_PATH,
334
336
  "exitCriteria": build_loop_exit_criteria(lane, selected),
335
337
  "terminalWorkflowActions": list(TERMINAL_WORKFLOW_ACTIONS),
@@ -1,7 +1,6 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  import hashlib
4
- import json
5
4
  from datetime import datetime, timezone
6
5
  from pathlib import Path
7
6
  from typing import Any
@@ -215,7 +214,7 @@ def record_workflow_plan(workspace_root: Path | str, plan: dict[str, Any], *, in
215
214
  write_json(root / LATEST_PLAN_PATH, plan)
216
215
  loop_state = _initial_loop_state(plan, intake)
217
216
  write_json(root / workflow_loop_relpath(run_id), loop_state)
218
- write_json(root / LATEST_LOOP_STATE_PATH, _compact_loop_state(loop_state))
217
+ write_json(root / LATEST_LOOP_STATE_PATH, compact_workflow_loop_state(loop_state))
219
218
  append_jsonl(root / "trading" / "audit" / "workflow-plan-events.jsonl", {
220
219
  "ts": _now(),
221
220
  "event": "workflow-plan-recorded",
@@ -345,6 +344,8 @@ def _initial_loop_state(plan: dict[str, Any], intake: dict[str, Any] | None) ->
345
344
  "roles": _role_names(stage.get("roles") or []),
346
345
  "task_type": "stage_dispatch",
347
346
  "status": "pending" if not stage.get("depends_on") else "blocked_by_dependency",
347
+ "active_roles": [],
348
+ "completed_roles": [],
348
349
  "depends_on": stage.get("depends_on") or [],
349
350
  "planner_action": "dispatch_ready_stage",
350
351
  "delta_brief": stage.get("purpose", ""),
@@ -381,7 +382,7 @@ def _initial_loop_state(plan: dict[str, Any], intake: dict[str, Any] | None) ->
381
382
  }
382
383
 
383
384
 
384
- def _compact_loop_state(state: dict[str, Any]) -> dict[str, Any]:
385
+ def compact_workflow_loop_state(state: dict[str, Any]) -> dict[str, Any]:
385
386
  return {
386
387
  "workflow_run_id": state.get("workflow_run_id", ""),
387
388
  "lane": state.get("lane", ""),
@@ -3,7 +3,6 @@ from django.templatetags.static import static
3
3
  from django.urls import path
4
4
  from django.views.generic import RedirectView
5
5
 
6
- import tradingcodex_service.admin
7
6
  from tradingcodex_service.api import api
8
7
  from tradingcodex_service import web
9
8
 
@@ -0,0 +1 @@
1
+ TRADINGCODEX_VERSION = "0.3.5"
@@ -14,7 +14,6 @@ from django.views.decorators.http import require_GET, require_POST
14
14
 
15
15
  from tradingcodex_cli.generator import bootstrap_workspace
16
16
  from tradingcodex_service.application.agents import (
17
- AGENT_SPECS,
18
17
  EXPECTED_SUBAGENTS,
19
18
  SKILL_SPECS,
20
19
  build_projection_state,
@@ -29,8 +28,6 @@ from tradingcodex_service.application.harness import (
29
28
  build_workflow_loop_preview,
30
29
  build_workflow_intake_summary,
31
30
  build_subagent_starter_prompt,
32
- get_harness_health,
33
- get_harness_topology,
34
31
  get_role_detail,
35
32
  investment_universe_label,
36
33
  list_policy_overview,
@@ -345,7 +345,7 @@ enabled_tools = [
345
345
  "review_external_mcp_tool",
346
346
  "record_audit_event"
347
347
  ]
348
- default_tools_approval_mode = "prompt"
348
+ default_tools_approval_mode = "approve"
349
349
  startup_timeout_sec = 20
350
350
  tool_timeout_sec = 30
351
351