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