tradingcodex 0.3.5__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 (313) hide show
  1. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/PKG-INFO +2 -2
  2. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/README.md +1 -1
  3. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/docs/deployment.md +4 -2
  4. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/docs/generated-workspaces.md +0 -1
  5. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/pyproject.toml +1 -1
  6. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/tests/test_python_migration.py +96 -6
  7. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/tradingcodex.egg-info/PKG-INFO +2 -2
  8. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/tradingcodex_cli/commands/doctor.py +0 -1
  9. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/tradingcodex_cli/commands/mcp.py +0 -1
  10. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/tradingcodex_service/application/agents.py +0 -1
  11. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/tradingcodex_service/application/customization.py +0 -1
  12. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/tradingcodex_service/application/decision_packages.py +0 -1
  13. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/tradingcodex_service/application/harness.py +32 -30
  14. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/tradingcodex_service/application/workflow_planner.py +4 -3
  15. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/tradingcodex_service/urls.py +0 -1
  16. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/tradingcodex_service/web.py +0 -3
  17. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/workspace_templates/modules/codex-base/files/.codex/hooks/tradingcodex_hook.py +39 -30
  18. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/workspace_templates/modules/codex-base/files/.tradingcodex/cli.py +1 -1
  19. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/workspace_templates/modules/tradingcodex-mcp/files/.tradingcodex/mcp/server.py +3 -3
  20. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/CONTRIBUTING.md +0 -0
  21. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/LICENSE +0 -0
  22. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/MANIFEST.in +0 -0
  23. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/NOTICE +0 -0
  24. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/TRADEMARKS.md +0 -0
  25. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/apps/__init__.py +0 -0
  26. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/apps/audit/__init__.py +0 -0
  27. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/apps/audit/admin.py +0 -0
  28. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/apps/audit/apps.py +0 -0
  29. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/apps/audit/migrations/0001_initial.py +0 -0
  30. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/apps/audit/migrations/__init__.py +0 -0
  31. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/apps/audit/models.py +0 -0
  32. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/apps/harness/__init__.py +0 -0
  33. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/apps/harness/admin.py +0 -0
  34. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/apps/harness/apps.py +0 -0
  35. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/apps/harness/migrations/0001_initial.py +0 -0
  36. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/apps/harness/migrations/__init__.py +0 -0
  37. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/apps/harness/models.py +0 -0
  38. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/apps/harness/templatetags/__init__.py +0 -0
  39. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/apps/integrations/__init__.py +0 -0
  40. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/apps/integrations/admin.py +0 -0
  41. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/apps/integrations/apps.py +0 -0
  42. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/apps/integrations/migrations/0001_initial.py +0 -0
  43. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/apps/integrations/migrations/0002_brokerconnection_brokeraccount_instrumentmap.py +0 -0
  44. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/apps/integrations/migrations/__init__.py +0 -0
  45. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/apps/integrations/models.py +0 -0
  46. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/apps/mcp/__init__.py +0 -0
  47. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/apps/mcp/admin.py +0 -0
  48. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/apps/mcp/apps.py +0 -0
  49. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/apps/mcp/migrations/0001_initial.py +0 -0
  50. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/apps/mcp/migrations/0002_mcpexternalpermissionrequest.py +0 -0
  51. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/apps/mcp/migrations/__init__.py +0 -0
  52. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/apps/mcp/models.py +0 -0
  53. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/apps/mcp/services.py +0 -0
  54. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/apps/orders/__init__.py +0 -0
  55. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/apps/orders/admin.py +0 -0
  56. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/apps/orders/apps.py +0 -0
  57. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/apps/orders/migrations/0001_initial.py +0 -0
  58. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/apps/orders/migrations/0002_approvalreceipt_approved_order_type_and_more.py +0 -0
  59. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/apps/orders/migrations/0003_migrate_orderintent_to_orderticket.py +0 -0
  60. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/apps/orders/migrations/0004_remove_order_intent_compat_fields.py +0 -0
  61. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/apps/orders/migrations/__init__.py +0 -0
  62. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/apps/orders/models.py +0 -0
  63. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/apps/orders/services.py +0 -0
  64. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/apps/policy/__init__.py +0 -0
  65. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/apps/policy/admin.py +0 -0
  66. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/apps/policy/apps.py +0 -0
  67. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/apps/policy/migrations/0001_initial.py +0 -0
  68. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/apps/policy/migrations/__init__.py +0 -0
  69. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/apps/policy/models.py +0 -0
  70. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/apps/policy/services.py +0 -0
  71. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/apps/portfolio/__init__.py +0 -0
  72. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/apps/portfolio/admin.py +0 -0
  73. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/apps/portfolio/apps.py +0 -0
  74. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/apps/portfolio/migrations/0001_initial.py +0 -0
  75. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/apps/portfolio/migrations/0002_brokersyncrun_portfolioledgerevent_reconciliationrun.py +0 -0
  76. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/apps/portfolio/migrations/__init__.py +0 -0
  77. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/apps/portfolio/models.py +0 -0
  78. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/apps/workflows/__init__.py +0 -0
  79. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/apps/workflows/admin.py +0 -0
  80. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/apps/workflows/apps.py +0 -0
  81. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/apps/workflows/migrations/0001_initial.py +0 -0
  82. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/apps/workflows/migrations/__init__.py +0 -0
  83. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/apps/workflows/models.py +0 -0
  84. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/assets/tradingcodex-banner.svg +0 -0
  85. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/docs/README.md +0 -0
  86. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/docs/artifact-supervisor-loop-prd.md +0 -0
  87. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/docs/components.md +0 -0
  88. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/docs/core-concepts-and-rules.md +0 -0
  89. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/docs/financial-workflow-references.md +0 -0
  90. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/docs/guardrails.md +0 -0
  91. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/docs/harness.md +0 -0
  92. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/docs/improvement-loop.md +0 -0
  93. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/docs/interfaces-and-surfaces.md +0 -0
  94. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/docs/licensing-and-commercialization.md +0 -0
  95. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/docs/product-direction.md +0 -0
  96. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/docs/research-memory-and-artifacts.md +0 -0
  97. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/docs/roles-skills-and-workflows.md +0 -0
  98. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/docs/safety-policy-and-execution.md +0 -0
  99. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/docs/system-architecture.md +0 -0
  100. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/docs/user-facing-skills.md +0 -0
  101. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/docs/validation-and-test-plan.md +0 -0
  102. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/install.sh +0 -0
  103. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/installation.md +0 -0
  104. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/setup.cfg +0 -0
  105. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/tests/test_broker_center_prd.py +0 -0
  106. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/tests/test_e2e_user_scenarios.py +0 -0
  107. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/tradingcodex.egg-info/SOURCES.txt +0 -0
  108. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/tradingcodex.egg-info/dependency_links.txt +0 -0
  109. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/tradingcodex.egg-info/entry_points.txt +0 -0
  110. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/tradingcodex.egg-info/requires.txt +0 -0
  111. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/tradingcodex.egg-info/top_level.txt +0 -0
  112. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/tradingcodex_cli/__init__.py +0 -0
  113. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/tradingcodex_cli/__main__.py +0 -0
  114. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/tradingcodex_cli/commands/__init__.py +0 -0
  115. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/tradingcodex_cli/commands/bootstrap.py +0 -0
  116. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/tradingcodex_cli/commands/build.py +0 -0
  117. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/tradingcodex_cli/commands/connectors.py +0 -0
  118. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/tradingcodex_cli/commands/db.py +0 -0
  119. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/tradingcodex_cli/commands/decision.py +0 -0
  120. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/tradingcodex_cli/commands/mode.py +0 -0
  121. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/tradingcodex_cli/commands/orders.py +0 -0
  122. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/tradingcodex_cli/commands/policy.py +0 -0
  123. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/tradingcodex_cli/commands/profile.py +0 -0
  124. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/tradingcodex_cli/commands/research.py +0 -0
  125. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/tradingcodex_cli/commands/skills.py +0 -0
  126. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/tradingcodex_cli/commands/strategies.py +0 -0
  127. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/tradingcodex_cli/commands/subagents.py +0 -0
  128. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/tradingcodex_cli/commands/utils.py +0 -0
  129. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/tradingcodex_cli/commands/workflow.py +0 -0
  130. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/tradingcodex_cli/commands/workspaces.py +0 -0
  131. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/tradingcodex_cli/generator.py +0 -0
  132. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/tradingcodex_cli/mcp_stdio.py +0 -0
  133. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/tradingcodex_cli/service_autostart.py +0 -0
  134. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/tradingcodex_cli/startup_status.py +0 -0
  135. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/tradingcodex_service/__init__.py +0 -0
  136. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/tradingcodex_service/admin.py +0 -0
  137. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/tradingcodex_service/api.py +0 -0
  138. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/tradingcodex_service/application/__init__.py +0 -0
  139. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/tradingcodex_service/application/artifact_quality.py +0 -0
  140. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/tradingcodex_service/application/audit.py +0 -0
  141. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/tradingcodex_service/application/brokers.py +0 -0
  142. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/tradingcodex_service/application/common.py +0 -0
  143. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/tradingcodex_service/application/components.py +0 -0
  144. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/tradingcodex_service/application/context_budget.py +0 -0
  145. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/tradingcodex_service/application/markdown_preview.py +0 -0
  146. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/tradingcodex_service/application/orders.py +0 -0
  147. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/tradingcodex_service/application/policy.py +0 -0
  148. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/tradingcodex_service/application/portfolio.py +0 -0
  149. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/tradingcodex_service/application/research.py +0 -0
  150. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/tradingcodex_service/application/runtime.py +0 -0
  151. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/tradingcodex_service/application/runtime_mode.py +0 -0
  152. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/tradingcodex_service/application/workflow_routing.py +0 -0
  153. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/tradingcodex_service/asgi.py +0 -0
  154. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/tradingcodex_service/mcp_runtime.py +0 -0
  155. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/tradingcodex_service/settings.py +0 -0
  156. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/tradingcodex_service/static/tradingcodex_admin/favicon.svg +0 -0
  157. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/tradingcodex_service/static/tradingcodex_web/app.css +0 -0
  158. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/tradingcodex_service/static/tradingcodex_web/app.js +0 -0
  159. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/tradingcodex_service/static/vendor/htmx/htmx.min.js +0 -0
  160. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/tradingcodex_service/templates/web/activity.html +0 -0
  161. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/tradingcodex_service/templates/web/agent_skills.html +0 -0
  162. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/tradingcodex_service/templates/web/agents.html +0 -0
  163. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/tradingcodex_service/templates/web/base.html +0 -0
  164. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/tradingcodex_service/templates/web/brokers.html +0 -0
  165. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/tradingcodex_service/templates/web/build_center.html +0 -0
  166. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/tradingcodex_service/templates/web/dashboard.html +0 -0
  167. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/tradingcodex_service/templates/web/decisions.html +0 -0
  168. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/tradingcodex_service/templates/web/fragments/role_inspector.html +0 -0
  169. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/tradingcodex_service/templates/web/fragments/starter_prompt.html +0 -0
  170. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/tradingcodex_service/templates/web/fragments/topology_canvas.html +0 -0
  171. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/tradingcodex_service/templates/web/fragments/workspace_card.html +0 -0
  172. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/tradingcodex_service/templates/web/harness.html +0 -0
  173. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/tradingcodex_service/templates/web/mcp_router.html +0 -0
  174. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/tradingcodex_service/templates/web/orders.html +0 -0
  175. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/tradingcodex_service/templates/web/policy.html +0 -0
  176. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/tradingcodex_service/templates/web/portfolio.html +0 -0
  177. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/tradingcodex_service/templates/web/research.html +0 -0
  178. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/tradingcodex_service/templates/web/starter_prompt.html +0 -0
  179. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/tradingcodex_service/templates/web/strategies.html +0 -0
  180. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/tradingcodex_service/version.py +0 -0
  181. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/tradingcodex_service/wsgi.py +0 -0
  182. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/workspace_templates/__init__.py +0 -0
  183. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/workspace_templates/modules/audit/files/.tradingcodex/audit/README.md +0 -0
  184. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/workspace_templates/modules/audit/files/trading/audit/.gitkeep +0 -0
  185. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/workspace_templates/modules/audit/module.json +0 -0
  186. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/workspace_templates/modules/codex-base/files/.codex/config.toml +0 -0
  187. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/workspace_templates/modules/codex-base/files/.codex/hooks.json +0 -0
  188. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/workspace_templates/modules/codex-base/files/.codex/prompts/base_instructions/head-manager.md +0 -0
  189. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/workspace_templates/modules/codex-base/files/.codex/rules/tradingcodex.rules +0 -0
  190. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/workspace_templates/modules/codex-base/files/.tradingcodex/capabilities.yaml +0 -0
  191. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/workspace_templates/modules/codex-base/files/.tradingcodex/config.yaml +0 -0
  192. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/workspace_templates/modules/codex-base/files/.tradingcodex/policies/policy-bindings.yaml +0 -0
  193. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/workspace_templates/modules/codex-base/files/.tradingcodex/policies/principals.yaml +0 -0
  194. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/workspace_templates/modules/codex-base/files/.tradingcodex/policies/roles.yaml +0 -0
  195. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/workspace_templates/modules/codex-base/files/AGENTS.md +0 -0
  196. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/workspace_templates/modules/codex-base/files/pyproject.toml +0 -0
  197. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/workspace_templates/modules/codex-base/files/tcx +0 -0
  198. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/workspace_templates/modules/codex-base/module.json +0 -0
  199. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/policies/access-policies.yaml +0 -0
  200. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/policies/restricted-list.yaml +0 -0
  201. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/schemas/approval_receipt.schema.json +0 -0
  202. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/schemas/audit_event.schema.json +0 -0
  203. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/schemas/evidence_pack.schema.json +0 -0
  204. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/schemas/execution_result.schema.json +0 -0
  205. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/schemas/fundamental_report.schema.json +0 -0
  206. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/schemas/news_report.schema.json +0 -0
  207. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/schemas/order_ticket.schema.json +0 -0
  208. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/schemas/portfolio_review.schema.json +0 -0
  209. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/schemas/postmortem_report.schema.json +0 -0
  210. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/schemas/research_artifact.schema.json +0 -0
  211. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/schemas/risk_report.schema.json +0 -0
  212. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/schemas/technical_report.schema.json +0 -0
  213. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/schemas/thesis.schema.json +0 -0
  214. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/schemas/valuation.schema.json +0 -0
  215. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/workspace_templates/modules/enforcement-guardrails/module.json +0 -0
  216. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/workspace_templates/modules/fixed-subagents/files/.codex/agents/execution-operator.toml +0 -0
  217. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/workspace_templates/modules/fixed-subagents/files/.codex/agents/fundamental-analyst.toml +0 -0
  218. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/workspace_templates/modules/fixed-subagents/files/.codex/agents/instrument-analyst.toml +0 -0
  219. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/workspace_templates/modules/fixed-subagents/files/.codex/agents/judgment-reviewer.toml +0 -0
  220. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/workspace_templates/modules/fixed-subagents/files/.codex/agents/macro-analyst.toml +0 -0
  221. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/workspace_templates/modules/fixed-subagents/files/.codex/agents/news-analyst.toml +0 -0
  222. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/workspace_templates/modules/fixed-subagents/files/.codex/agents/portfolio-manager.toml +0 -0
  223. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/workspace_templates/modules/fixed-subagents/files/.codex/agents/risk-manager.toml +0 -0
  224. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/workspace_templates/modules/fixed-subagents/files/.codex/agents/technical-analyst.toml +0 -0
  225. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/workspace_templates/modules/fixed-subagents/files/.codex/agents/valuation-analyst.toml +0 -0
  226. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/workspace_templates/modules/fixed-subagents/files/.tradingcodex/mainagent/skill-change-proposals/.gitkeep +0 -0
  227. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/workspace_templates/modules/fixed-subagents/module.json +0 -0
  228. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/workspace_templates/modules/guidance-guardrails/files/.tradingcodex/guidance/guardrails.md +0 -0
  229. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/workspace_templates/modules/guidance-guardrails/files/.tradingcodex/guidance/task-quality-checklist.md +0 -0
  230. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/workspace_templates/modules/guidance-guardrails/module.json +0 -0
  231. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/workspace_templates/modules/information-barriers/files/.tradingcodex/policies/information-barriers.yaml +0 -0
  232. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/workspace_templates/modules/information-barriers/files/.tradingcodex/secrets.md +0 -0
  233. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/workspace_templates/modules/information-barriers/files/trading/approvals/.gitkeep +0 -0
  234. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/workspace_templates/modules/information-barriers/files/trading/forecasts/.gitkeep +0 -0
  235. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/workspace_templates/modules/information-barriers/files/trading/market-data/.gitkeep +0 -0
  236. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/workspace_templates/modules/information-barriers/files/trading/orders/approved/.gitkeep +0 -0
  237. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/workspace_templates/modules/information-barriers/files/trading/orders/draft/.gitkeep +0 -0
  238. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/workspace_templates/modules/information-barriers/files/trading/orders/executed/.gitkeep +0 -0
  239. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/workspace_templates/modules/information-barriers/files/trading/orders/rejected/.gitkeep +0 -0
  240. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/workspace_templates/modules/information-barriers/files/trading/portfolio/.gitkeep +0 -0
  241. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/workspace_templates/modules/information-barriers/files/trading/reports/fundamental/.gitkeep +0 -0
  242. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/workspace_templates/modules/information-barriers/files/trading/reports/instrument/.gitkeep +0 -0
  243. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/workspace_templates/modules/information-barriers/files/trading/reports/macro/.gitkeep +0 -0
  244. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/workspace_templates/modules/information-barriers/files/trading/reports/news/.gitkeep +0 -0
  245. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/workspace_templates/modules/information-barriers/files/trading/reports/policy/.gitkeep +0 -0
  246. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/workspace_templates/modules/information-barriers/files/trading/reports/portfolio/.gitkeep +0 -0
  247. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/workspace_templates/modules/information-barriers/files/trading/reports/postmortem/.gitkeep +0 -0
  248. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/workspace_templates/modules/information-barriers/files/trading/reports/risk/.gitkeep +0 -0
  249. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/workspace_templates/modules/information-barriers/files/trading/reports/technical/.gitkeep +0 -0
  250. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/workspace_templates/modules/information-barriers/files/trading/reports/valuation/.gitkeep +0 -0
  251. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/workspace_templates/modules/information-barriers/files/trading/research/.gitkeep +0 -0
  252. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/workspace_templates/modules/information-barriers/module.json +0 -0
  253. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/workspace_templates/modules/paper-trading/module.json +0 -0
  254. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/workspace_templates/modules/postmortem/files/.tradingcodex/workflows/postmortem.yaml +0 -0
  255. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/workspace_templates/modules/postmortem/module.json +0 -0
  256. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/workspace_templates/modules/repo-skills/files/.agents/skills/automate-workflow/SKILL.md +0 -0
  257. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/workspace_templates/modules/repo-skills/files/.agents/skills/automate-workflow/agents/openai.yaml +0 -0
  258. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/workspace_templates/modules/repo-skills/files/.agents/skills/plan-workflow/SKILL.md +0 -0
  259. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/workspace_templates/modules/repo-skills/files/.agents/skills/plan-workflow/agents/openai.yaml +0 -0
  260. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/workspace_templates/modules/repo-skills/files/.agents/skills/postmortem/SKILL.md +0 -0
  261. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/workspace_templates/modules/repo-skills/files/.agents/skills/postmortem/agents/openai.yaml +0 -0
  262. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/workspace_templates/modules/repo-skills/files/.agents/skills/strategy-creator/SKILL.md +0 -0
  263. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/workspace_templates/modules/repo-skills/files/.agents/skills/strategy-creator/agents/openai.yaml +0 -0
  264. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/workspace_templates/modules/repo-skills/files/.agents/skills/tcx-build/SKILL.md +0 -0
  265. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/workspace_templates/modules/repo-skills/files/.agents/skills/tcx-build/agents/openai.yaml +0 -0
  266. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/workspace_templates/modules/repo-skills/files/.agents/skills/tcx-server/SKILL.md +0 -0
  267. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/workspace_templates/modules/repo-skills/files/.agents/skills/tcx-server/agents/openai.yaml +0 -0
  268. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/workspace_templates/modules/repo-skills/files/.agents/skills/tcx-workflow/SKILL.md +0 -0
  269. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/workspace_templates/modules/repo-skills/files/.agents/skills/tcx-workflow/agents/openai.yaml +0 -0
  270. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/workspace_templates/modules/repo-skills/files/.agents/skills/tcx-workflow/references/decision-quality-spine.md +0 -0
  271. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/execution-operator/execute-paper-order/SKILL.md +0 -0
  272. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/execution-operator/execute-paper-order/agents/openai.yaml +0 -0
  273. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/fundamental-analyst/fundamental-analysis/SKILL.md +0 -0
  274. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/fundamental-analyst/fundamental-analysis/agents/openai.yaml +0 -0
  275. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/instrument-analyst/instrument-analysis/SKILL.md +0 -0
  276. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/instrument-analyst/instrument-analysis/agents/openai.yaml +0 -0
  277. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/judgment-reviewer/agent-judgment-review/SKILL.md +0 -0
  278. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/judgment-reviewer/agent-judgment-review/agents/openai.yaml +0 -0
  279. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/macro-analyst/macro-analysis/SKILL.md +0 -0
  280. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/macro-analyst/macro-analysis/agents/openai.yaml +0 -0
  281. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/news-analyst/news-analysis/SKILL.md +0 -0
  282. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/news-analyst/news-analysis/agents/openai.yaml +0 -0
  283. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/portfolio-manager/create-order-ticket/SKILL.md +0 -0
  284. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/portfolio-manager/create-order-ticket/agents/openai.yaml +0 -0
  285. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/portfolio-manager/portfolio-review/SKILL.md +0 -0
  286. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/portfolio-manager/portfolio-review/agents/openai.yaml +0 -0
  287. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/risk-manager/approve-order/SKILL.md +0 -0
  288. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/risk-manager/approve-order/agents/openai.yaml +0 -0
  289. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/risk-manager/policy-review/SKILL.md +0 -0
  290. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/risk-manager/policy-review/agents/openai.yaml +0 -0
  291. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/risk-manager/review-risk/SKILL.md +0 -0
  292. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/risk-manager/review-risk/agents/openai.yaml +0 -0
  293. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/shared/anti-overfit-validation/SKILL.md +0 -0
  294. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/shared/anti-overfit-validation/agents/openai.yaml +0 -0
  295. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/shared/collect-evidence/SKILL.md +0 -0
  296. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/shared/collect-evidence/agents/openai.yaml +0 -0
  297. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/shared/external-data-source-gate/SKILL.md +0 -0
  298. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/shared/external-data-source-gate/agents/openai.yaml +0 -0
  299. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/shared/forecasting-discipline/SKILL.md +0 -0
  300. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/shared/forecasting-discipline/agents/openai.yaml +0 -0
  301. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/shared/numeric-data-qc/SKILL.md +0 -0
  302. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/shared/numeric-data-qc/agents/openai.yaml +0 -0
  303. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/shared/thesis-scenario-tree/SKILL.md +0 -0
  304. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/shared/thesis-scenario-tree/agents/openai.yaml +0 -0
  305. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/technical-analyst/technical-analysis/SKILL.md +0 -0
  306. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/technical-analyst/technical-analysis/agents/openai.yaml +0 -0
  307. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/valuation-analyst/valuation-review/SKILL.md +0 -0
  308. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/valuation-analyst/valuation-review/agents/openai.yaml +0 -0
  309. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/workspace_templates/modules/repo-skills/module.json +0 -0
  310. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/workspace_templates/modules/stub-execution/module.json +0 -0
  311. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/workspace_templates/modules/tradingcodex-mcp/files/.tradingcodex/mcp/enforcer/README.md +0 -0
  312. {tradingcodex-0.3.5 → tradingcodex-0.3.6}/workspace_templates/modules/tradingcodex-mcp/files/.tradingcodex/mcp/gateway/README.md +0 -0
  313. {tradingcodex-0.3.5 → 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.5
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.5` | 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. |
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.5` | 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. |
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.5
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
@@ -253,7 +253,9 @@ Use PEP 440 versions:
253
253
  - `0.3.5` for safe built-in TradingCodex MCP auto-approval, execution-tool
254
254
  hiding outside `execution-operator`, and service-gated execution UX after
255
255
  `0.3.4`
256
- - later patch releases for compatible fixes after `0.3.5`
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`
257
259
  - pre-releases such as `0.4.0a1`, `0.4.0b1`, or `0.4.0rc1` when preparing
258
260
  the next minor contract
259
261
 
@@ -448,7 +448,6 @@ enforcement.
448
448
  route to the `connector_build` lane and `$tcx-build`, not investment
449
449
  thesis review; their workflow packages use workflow lifecycle and boundary
450
450
  sections rather than thesis lifecycle or portfolio/risk sections
451
- dispatch
452
451
  - secret-only routing: credential, token, password, broker-key, or `.env`
453
452
  storage/read/rotation prompts create warning context without activating
454
453
  investment subagent dispatch unless a separate investment or execution
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "tradingcodex"
7
- version = "0.3.5"
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
  )
@@ -2342,9 +2342,44 @@ def test_dynamic_workflow_plan_validation_and_recording(tmp_path: Path) -> None:
2342
2342
  loop_state = json.loads((workspace / result["loop_state_path"]).read_text(encoding="utf-8"))
2343
2343
  assert loop_state["state_mode"] == "validated_dynamic_workflow_plan"
2344
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"] == []
2345
2347
  latest_loop_state = json.loads((workspace / ".tradingcodex/mainagent/workflow-loop-state.json").read_text(encoding="utf-8"))
2346
2348
  assert latest_loop_state["selected_team"] == loop_state["selected_team"]
2347
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
+
2348
2383
  dict_role_plan = {
2349
2384
  **preview,
2350
2385
  "workflow_run_id": preview["workflow_run_id"] + "-dict-role",
@@ -2927,7 +2962,18 @@ improvements:
2927
2962
  assert listed_improvements["index_path"] == ".tradingcodex/mainagent/improve-index.json"
2928
2963
  assert listed_improvements["index_status"] == "current"
2929
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
+ ]
2930
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
2931
2977
  listed_again = json.loads(run(["./tcx", "workflow", "improve"], workspace).stdout)
2932
2978
  assert listed_again["improvement_count"] == listed_improvements["improvement_count"]
2933
2979
  improve_index.unlink()
@@ -2988,6 +3034,50 @@ improvements:
2988
3034
  assert revise_loop["pending_tasks"][0]["planner_action"] == "revise_same_role"
2989
3035
  assert revise_loop["pending_tasks"][0]["role"] == "news-analyst"
2990
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
+
2991
3081
  bad_artifact = workspace / "trading" / "reports" / "news" / "bad-followup.md"
2992
3082
  bad_artifact.write_text(
2993
3083
  artifact.read_text(encoding="utf-8").replace(
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: tradingcodex
3
- Version: 0.3.5
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.5` | 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. |
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,
@@ -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
 
@@ -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,
@@ -21,9 +21,9 @@ if SOURCE_ROOT not in sys.path:
21
21
 
22
22
  os.environ.setdefault("TRADINGCODEX_WORKSPACE_ROOT", "{{PROJECT_DIR}}")
23
23
 
24
- from tradingcodex_service.application.agents import EXPECTED_SUBAGENTS
25
- from tradingcodex_service.application.workflow_planner import build_workflow_intake, record_workflow_intake
26
- from tradingcodex_cli.startup_status import build_server_status, fallback_server_status
24
+ from tradingcodex_service.application.agents import EXPECTED_SUBAGENTS # noqa: E402
25
+ from tradingcodex_service.application.workflow_planner import build_workflow_intake, compact_workflow_loop_state, record_workflow_intake # noqa: E402
26
+ from tradingcodex_cli.startup_status import build_server_status, fallback_server_status # noqa: E402
27
27
 
28
28
  ROOT = Path("{{PROJECT_DIR}}")
29
29
  MAX_SESSION_EVENTS = 12
@@ -221,10 +221,22 @@ def update_loop_state_for_subagent_event(event: str, role: str, record: dict) ->
221
221
  pending = state.get("pending_tasks") if isinstance(state.get("pending_tasks"), list) else []
222
222
  for task in pending:
223
223
  task_roles = task.get("roles") if isinstance(task.get("roles"), list) else [task.get("role")]
224
- if role in task_roles and task.get("status") in {"pending", "active"}:
225
- task["status"] = "active" if event == "subagent-start" else "completed"
226
- task["updated_at"] = record["ts"]
227
- break
224
+ if role not in task_roles or task.get("status") not in {"pending", "active"}:
225
+ continue
226
+ active_roles = task.get("active_roles") if isinstance(task.get("active_roles"), list) else []
227
+ completed_roles = task.get("completed_roles") if isinstance(task.get("completed_roles"), list) else []
228
+ if event == "subagent-start":
229
+ active_roles = unique([*active_roles, role])
230
+ task["status"] = "active"
231
+ else:
232
+ active_roles = [item for item in active_roles if item != role]
233
+ completed_roles = unique([*completed_roles, role])
234
+ task["status"] = "completed" if set(task_roles).issubset(set(completed_roles)) else "active"
235
+ task["active_roles"] = active_roles
236
+ task["completed_roles"] = completed_roles
237
+ task["updated_at"] = record["ts"]
238
+ break
239
+ release_unblocked_tasks(pending, record["ts"])
228
240
  if event == "subagent-stop":
229
241
  state.setdefault("completed_artifacts", []).append({
230
242
  "role": role,
@@ -242,6 +254,25 @@ def update_loop_state_for_subagent_event(event: str, role: str, record: dict) ->
242
254
  write_loop_state(state, update_latest=(not latest or latest.get("workflow_run_id") == state.get("workflow_run_id")))
243
255
 
244
256
 
257
+ def release_unblocked_tasks(tasks: list, ts: str) -> None:
258
+ completed_stage_ids = {task.get("stage_id") for task in tasks if task.get("status") == "completed"}
259
+ for task in tasks:
260
+ if task.get("status") != "blocked_by_dependency":
261
+ continue
262
+ dependencies = task.get("depends_on") if isinstance(task.get("depends_on"), list) else []
263
+ if set(dependencies).issubset(completed_stage_ids):
264
+ task["status"] = "pending"
265
+ task["updated_at"] = ts
266
+
267
+
268
+ def unique(items: list) -> list:
269
+ result = []
270
+ for item in items:
271
+ if item and item not in result:
272
+ result.append(item)
273
+ return result
274
+
275
+
245
276
  def safe_id(value) -> str:
246
277
  text = str(value or "")
247
278
  cleaned = "".join(ch if ch.isalnum() or ch in "._-" else "-" for ch in text).strip("-")
@@ -256,34 +287,12 @@ def loop_state_path(run_id) -> Path:
256
287
  return ROOT / ".tradingcodex" / "mainagent" / "workflows" / safe_id(run_id) / "loop-state.json"
257
288
 
258
289
 
259
- def compact_loop_summary(state: dict) -> dict:
260
- pending = state.get("pending_tasks") if isinstance(state.get("pending_tasks"), list) else []
261
- completed = state.get("completed_artifacts") if isinstance(state.get("completed_artifacts"), list) else []
262
- decisions = state.get("loop_decisions") if isinstance(state.get("loop_decisions"), list) else []
263
- return {
264
- "workflow_run_id": state.get("workflow_run_id", ""),
265
- "lane": state.get("lane", ""),
266
- "state_path": state.get("state_path") or loop_state_relpath(state.get("workflow_run_id")),
267
- "iteration": state.get("iteration", 0),
268
- "pending_tasks": pending,
269
- "completed_artifacts": completed[-12:],
270
- "loop_decisions": decisions[-12:],
271
- "escalation_proposals": state.get("escalation_proposals", []) if isinstance(state.get("escalation_proposals"), list) else [],
272
- "blocked_actions": state.get("blocked_actions", []) if isinstance(state.get("blocked_actions"), list) else [],
273
- "stop_reason": state.get("stop_reason", ""),
274
- "state_mode": state.get("state_mode", "inspectable_assisted_loop"),
275
- "auto_spawn": False,
276
- "recursive_hook_dispatch": False,
277
- "updated_at": state.get("updated_at", ""),
278
- }
279
-
280
-
281
290
  def write_loop_state(state: dict, *, update_latest: bool = True) -> None:
282
291
  path = loop_state_path(state.get("workflow_run_id"))
283
292
  state["state_path"] = loop_state_relpath(state.get("workflow_run_id"))
284
293
  write_json(path, state)
285
294
  if update_latest:
286
- write_json(LOOP_STATE_PATH, compact_loop_summary(state))
295
+ write_json(LOOP_STATE_PATH, compact_workflow_loop_state(state))
287
296
 
288
297
 
289
298
  def event_session_key(payload: dict) -> str:
@@ -9,7 +9,7 @@ if SOURCE_ROOT not in sys.path:
9
9
  os.environ.setdefault("TRADINGCODEX_WORKSPACE_ROOT", "{{PROJECT_DIR}}")
10
10
  os.environ.setdefault("DJANGO_SETTINGS_MODULE", "tradingcodex_service.settings")
11
11
 
12
- from tradingcodex_cli.__main__ import main
12
+ from tradingcodex_cli.__main__ import main # noqa: E402
13
13
 
14
14
 
15
15
  if __name__ == "__main__":
@@ -15,10 +15,10 @@ if SOURCE_ROOT not in sys.path:
15
15
  os.environ.setdefault("TRADINGCODEX_WORKSPACE_ROOT", "{{PROJECT_DIR}}")
16
16
  os.environ.setdefault("DJANGO_SETTINGS_MODULE", "tradingcodex_service.settings")
17
17
 
18
- from pathlib import Path
18
+ from pathlib import Path # noqa: E402
19
19
 
20
- from tradingcodex_cli.mcp_stdio import run_stdio
21
- from tradingcodex_cli.service_autostart import maybe_autostart_service
20
+ from tradingcodex_cli.mcp_stdio import run_stdio # noqa: E402
21
+ from tradingcodex_cli.service_autostart import maybe_autostart_service # noqa: E402
22
22
 
23
23
 
24
24
  if __name__ == "__main__":
File without changes
File without changes
File without changes
File without changes