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.
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/PKG-INFO +2 -2
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/README.md +1 -1
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/docs/deployment.md +7 -2
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/docs/generated-workspaces.md +10 -1
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/docs/safety-policy-and-execution.md +6 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/pyproject.toml +1 -1
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tests/test_python_migration.py +107 -6
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tradingcodex.egg-info/PKG-INFO +2 -2
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tradingcodex_cli/commands/doctor.py +23 -1
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tradingcodex_cli/commands/mcp.py +0 -1
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tradingcodex_service/application/agents.py +0 -1
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tradingcodex_service/application/customization.py +0 -1
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tradingcodex_service/application/decision_packages.py +0 -1
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tradingcodex_service/application/harness.py +32 -30
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tradingcodex_service/application/workflow_planner.py +4 -3
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tradingcodex_service/urls.py +0 -1
- tradingcodex-0.3.6/tradingcodex_service/version.py +1 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tradingcodex_service/web.py +0 -3
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/codex-base/files/.codex/config.toml +1 -1
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/codex-base/files/.codex/hooks/tradingcodex_hook.py +39 -30
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/codex-base/files/.tradingcodex/cli.py +1 -1
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/fixed-subagents/files/.codex/agents/execution-operator.toml +1 -4
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/fixed-subagents/files/.codex/agents/fundamental-analyst.toml +1 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/fixed-subagents/files/.codex/agents/instrument-analyst.toml +1 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/fixed-subagents/files/.codex/agents/judgment-reviewer.toml +1 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/fixed-subagents/files/.codex/agents/macro-analyst.toml +1 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/fixed-subagents/files/.codex/agents/news-analyst.toml +1 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/fixed-subagents/files/.codex/agents/portfolio-manager.toml +1 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/fixed-subagents/files/.codex/agents/risk-manager.toml +1 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/fixed-subagents/files/.codex/agents/technical-analyst.toml +1 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/fixed-subagents/files/.codex/agents/valuation-analyst.toml +1 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/tradingcodex-mcp/files/.tradingcodex/mcp/server.py +3 -3
- tradingcodex-0.3.4/tradingcodex_service/version.py +0 -1
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/CONTRIBUTING.md +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/LICENSE +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/MANIFEST.in +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/NOTICE +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/TRADEMARKS.md +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/apps/__init__.py +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/apps/audit/__init__.py +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/apps/audit/admin.py +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/apps/audit/apps.py +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/apps/audit/migrations/0001_initial.py +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/apps/audit/migrations/__init__.py +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/apps/audit/models.py +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/apps/harness/__init__.py +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/apps/harness/admin.py +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/apps/harness/apps.py +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/apps/harness/migrations/0001_initial.py +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/apps/harness/migrations/__init__.py +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/apps/harness/models.py +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/apps/harness/templatetags/__init__.py +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/apps/integrations/__init__.py +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/apps/integrations/admin.py +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/apps/integrations/apps.py +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/apps/integrations/migrations/0001_initial.py +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/apps/integrations/migrations/0002_brokerconnection_brokeraccount_instrumentmap.py +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/apps/integrations/migrations/__init__.py +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/apps/integrations/models.py +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/apps/mcp/__init__.py +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/apps/mcp/admin.py +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/apps/mcp/apps.py +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/apps/mcp/migrations/0001_initial.py +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/apps/mcp/migrations/0002_mcpexternalpermissionrequest.py +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/apps/mcp/migrations/__init__.py +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/apps/mcp/models.py +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/apps/mcp/services.py +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/apps/orders/__init__.py +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/apps/orders/admin.py +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/apps/orders/apps.py +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/apps/orders/migrations/0001_initial.py +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/apps/orders/migrations/0002_approvalreceipt_approved_order_type_and_more.py +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/apps/orders/migrations/0003_migrate_orderintent_to_orderticket.py +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/apps/orders/migrations/0004_remove_order_intent_compat_fields.py +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/apps/orders/migrations/__init__.py +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/apps/orders/models.py +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/apps/orders/services.py +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/apps/policy/__init__.py +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/apps/policy/admin.py +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/apps/policy/apps.py +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/apps/policy/migrations/0001_initial.py +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/apps/policy/migrations/__init__.py +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/apps/policy/models.py +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/apps/policy/services.py +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/apps/portfolio/__init__.py +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/apps/portfolio/admin.py +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/apps/portfolio/apps.py +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/apps/portfolio/migrations/0001_initial.py +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/apps/portfolio/migrations/0002_brokersyncrun_portfolioledgerevent_reconciliationrun.py +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/apps/portfolio/migrations/__init__.py +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/apps/portfolio/models.py +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/apps/workflows/__init__.py +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/apps/workflows/admin.py +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/apps/workflows/apps.py +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/apps/workflows/migrations/0001_initial.py +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/apps/workflows/migrations/__init__.py +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/apps/workflows/models.py +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/assets/tradingcodex-banner.svg +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/docs/README.md +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/docs/artifact-supervisor-loop-prd.md +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/docs/components.md +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/docs/core-concepts-and-rules.md +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/docs/financial-workflow-references.md +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/docs/guardrails.md +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/docs/harness.md +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/docs/improvement-loop.md +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/docs/interfaces-and-surfaces.md +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/docs/licensing-and-commercialization.md +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/docs/product-direction.md +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/docs/research-memory-and-artifacts.md +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/docs/roles-skills-and-workflows.md +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/docs/system-architecture.md +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/docs/user-facing-skills.md +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/docs/validation-and-test-plan.md +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/install.sh +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/installation.md +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/setup.cfg +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tests/test_broker_center_prd.py +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tests/test_e2e_user_scenarios.py +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tradingcodex.egg-info/SOURCES.txt +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tradingcodex.egg-info/dependency_links.txt +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tradingcodex.egg-info/entry_points.txt +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tradingcodex.egg-info/requires.txt +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tradingcodex.egg-info/top_level.txt +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tradingcodex_cli/__init__.py +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tradingcodex_cli/__main__.py +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tradingcodex_cli/commands/__init__.py +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tradingcodex_cli/commands/bootstrap.py +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tradingcodex_cli/commands/build.py +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tradingcodex_cli/commands/connectors.py +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tradingcodex_cli/commands/db.py +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tradingcodex_cli/commands/decision.py +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tradingcodex_cli/commands/mode.py +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tradingcodex_cli/commands/orders.py +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tradingcodex_cli/commands/policy.py +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tradingcodex_cli/commands/profile.py +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tradingcodex_cli/commands/research.py +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tradingcodex_cli/commands/skills.py +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tradingcodex_cli/commands/strategies.py +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tradingcodex_cli/commands/subagents.py +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tradingcodex_cli/commands/utils.py +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tradingcodex_cli/commands/workflow.py +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tradingcodex_cli/commands/workspaces.py +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tradingcodex_cli/generator.py +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tradingcodex_cli/mcp_stdio.py +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tradingcodex_cli/service_autostart.py +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tradingcodex_cli/startup_status.py +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tradingcodex_service/__init__.py +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tradingcodex_service/admin.py +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tradingcodex_service/api.py +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tradingcodex_service/application/__init__.py +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tradingcodex_service/application/artifact_quality.py +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tradingcodex_service/application/audit.py +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tradingcodex_service/application/brokers.py +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tradingcodex_service/application/common.py +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tradingcodex_service/application/components.py +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tradingcodex_service/application/context_budget.py +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tradingcodex_service/application/markdown_preview.py +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tradingcodex_service/application/orders.py +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tradingcodex_service/application/policy.py +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tradingcodex_service/application/portfolio.py +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tradingcodex_service/application/research.py +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tradingcodex_service/application/runtime.py +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tradingcodex_service/application/runtime_mode.py +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tradingcodex_service/application/workflow_routing.py +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tradingcodex_service/asgi.py +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tradingcodex_service/mcp_runtime.py +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tradingcodex_service/settings.py +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tradingcodex_service/static/tradingcodex_admin/favicon.svg +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tradingcodex_service/static/tradingcodex_web/app.css +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tradingcodex_service/static/tradingcodex_web/app.js +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tradingcodex_service/static/vendor/htmx/htmx.min.js +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tradingcodex_service/templates/web/activity.html +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tradingcodex_service/templates/web/agent_skills.html +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tradingcodex_service/templates/web/agents.html +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tradingcodex_service/templates/web/base.html +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tradingcodex_service/templates/web/brokers.html +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tradingcodex_service/templates/web/build_center.html +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tradingcodex_service/templates/web/dashboard.html +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tradingcodex_service/templates/web/decisions.html +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tradingcodex_service/templates/web/fragments/role_inspector.html +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tradingcodex_service/templates/web/fragments/starter_prompt.html +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tradingcodex_service/templates/web/fragments/topology_canvas.html +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tradingcodex_service/templates/web/fragments/workspace_card.html +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tradingcodex_service/templates/web/harness.html +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tradingcodex_service/templates/web/mcp_router.html +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tradingcodex_service/templates/web/orders.html +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tradingcodex_service/templates/web/policy.html +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tradingcodex_service/templates/web/portfolio.html +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tradingcodex_service/templates/web/research.html +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tradingcodex_service/templates/web/starter_prompt.html +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tradingcodex_service/templates/web/strategies.html +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/tradingcodex_service/wsgi.py +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/__init__.py +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/audit/files/.tradingcodex/audit/README.md +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/audit/files/trading/audit/.gitkeep +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/audit/module.json +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/codex-base/files/.codex/hooks.json +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/codex-base/files/.codex/prompts/base_instructions/head-manager.md +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/codex-base/files/.codex/rules/tradingcodex.rules +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/codex-base/files/.tradingcodex/capabilities.yaml +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/codex-base/files/.tradingcodex/config.yaml +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/codex-base/files/.tradingcodex/policies/policy-bindings.yaml +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/codex-base/files/.tradingcodex/policies/principals.yaml +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/codex-base/files/.tradingcodex/policies/roles.yaml +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/codex-base/files/AGENTS.md +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/codex-base/files/pyproject.toml +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/codex-base/files/tcx +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/codex-base/module.json +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/policies/access-policies.yaml +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/policies/restricted-list.yaml +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/schemas/approval_receipt.schema.json +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/schemas/audit_event.schema.json +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/schemas/evidence_pack.schema.json +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/schemas/execution_result.schema.json +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/schemas/fundamental_report.schema.json +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/schemas/news_report.schema.json +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/schemas/order_ticket.schema.json +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/schemas/portfolio_review.schema.json +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/schemas/postmortem_report.schema.json +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/schemas/research_artifact.schema.json +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/schemas/risk_report.schema.json +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/schemas/technical_report.schema.json +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/schemas/thesis.schema.json +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/schemas/valuation.schema.json +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/enforcement-guardrails/module.json +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/fixed-subagents/files/.tradingcodex/mainagent/skill-change-proposals/.gitkeep +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/fixed-subagents/module.json +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/guidance-guardrails/files/.tradingcodex/guidance/guardrails.md +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/guidance-guardrails/files/.tradingcodex/guidance/task-quality-checklist.md +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/guidance-guardrails/module.json +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/information-barriers/files/.tradingcodex/policies/information-barriers.yaml +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/information-barriers/files/.tradingcodex/secrets.md +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/information-barriers/files/trading/approvals/.gitkeep +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/information-barriers/files/trading/forecasts/.gitkeep +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/information-barriers/files/trading/market-data/.gitkeep +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/information-barriers/files/trading/orders/approved/.gitkeep +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/information-barriers/files/trading/orders/draft/.gitkeep +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/information-barriers/files/trading/orders/executed/.gitkeep +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/information-barriers/files/trading/orders/rejected/.gitkeep +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/information-barriers/files/trading/portfolio/.gitkeep +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/information-barriers/files/trading/reports/fundamental/.gitkeep +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/information-barriers/files/trading/reports/instrument/.gitkeep +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/information-barriers/files/trading/reports/macro/.gitkeep +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/information-barriers/files/trading/reports/news/.gitkeep +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/information-barriers/files/trading/reports/policy/.gitkeep +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/information-barriers/files/trading/reports/portfolio/.gitkeep +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/information-barriers/files/trading/reports/postmortem/.gitkeep +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/information-barriers/files/trading/reports/risk/.gitkeep +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/information-barriers/files/trading/reports/technical/.gitkeep +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/information-barriers/files/trading/reports/valuation/.gitkeep +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/information-barriers/files/trading/research/.gitkeep +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/information-barriers/module.json +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/paper-trading/module.json +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/postmortem/files/.tradingcodex/workflows/postmortem.yaml +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/postmortem/module.json +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/repo-skills/files/.agents/skills/automate-workflow/SKILL.md +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/repo-skills/files/.agents/skills/automate-workflow/agents/openai.yaml +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/repo-skills/files/.agents/skills/plan-workflow/SKILL.md +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/repo-skills/files/.agents/skills/plan-workflow/agents/openai.yaml +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/repo-skills/files/.agents/skills/postmortem/SKILL.md +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/repo-skills/files/.agents/skills/postmortem/agents/openai.yaml +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/repo-skills/files/.agents/skills/strategy-creator/SKILL.md +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/repo-skills/files/.agents/skills/strategy-creator/agents/openai.yaml +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/repo-skills/files/.agents/skills/tcx-build/SKILL.md +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/repo-skills/files/.agents/skills/tcx-build/agents/openai.yaml +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/repo-skills/files/.agents/skills/tcx-server/SKILL.md +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/repo-skills/files/.agents/skills/tcx-server/agents/openai.yaml +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/repo-skills/files/.agents/skills/tcx-workflow/SKILL.md +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/repo-skills/files/.agents/skills/tcx-workflow/agents/openai.yaml +0 -0
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/shared/collect-evidence/SKILL.md +0 -0
- {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
- {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
- {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
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/shared/forecasting-discipline/SKILL.md +0 -0
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/repo-skills/module.json +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/stub-execution/module.json +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/tradingcodex-mcp/files/.tradingcodex/mcp/enforcer/README.md +0 -0
- {tradingcodex-0.3.4 → tradingcodex-0.3.6}/workspace_templates/modules/tradingcodex-mcp/files/.tradingcodex/mcp/gateway/README.md +0 -0
- {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.
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
-
-
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
|
{tradingcodex-0.3.4 → tradingcodex-0.3.6}/tradingcodex_service/application/decision_packages.py
RENAMED
|
@@ -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("
|
|
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
|
|
252
|
-
|
|
253
|
-
|
|
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"}
|
|
280
|
-
|
|
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":
|
|
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),
|
{tradingcodex-0.3.4 → tradingcodex-0.3.6}/tradingcodex_service/application/workflow_planner.py
RENAMED
|
@@ -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,
|
|
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
|
|
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", ""),
|
|
@@ -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,
|