tradingcodex 0.3.1__tar.gz → 0.3.3__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/PKG-INFO +2 -2
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/README.md +1 -1
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/docs/README.md +1 -1
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/docs/core-concepts-and-rules.md +3 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/docs/deployment.md +15 -45
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/docs/generated-workspaces.md +8 -4
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/docs/research-memory-and-artifacts.md +2 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/docs/roles-skills-and-workflows.md +11 -3
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/docs/validation-and-test-plan.md +3 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/pyproject.toml +1 -1
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/tests/test_python_migration.py +266 -5
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/tradingcodex.egg-info/PKG-INFO +2 -2
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/tradingcodex_cli/commands/bootstrap.py +1 -1
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/tradingcodex_cli/service_autostart.py +28 -4
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/tradingcodex_cli/startup_status.py +39 -7
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/tradingcodex_service/application/harness.py +9 -3
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/tradingcodex_service/mcp_runtime.py +1 -1
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/tradingcodex_service/static/tradingcodex_web/app.css +2 -2
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/tradingcodex_service/templates/web/agents.html +15 -12
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/tradingcodex_service/templates/web/fragments/starter_prompt.html +53 -59
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/tradingcodex_service/templates/web/research.html +15 -12
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/tradingcodex_service/templates/web/strategies.html +15 -12
- tradingcodex-0.3.3/tradingcodex_service/version.py +1 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/workspace_templates/modules/codex-base/files/.codex/prompts/base_instructions/head-manager.md +10 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/workspace_templates/modules/codex-base/files/tcx +0 -3
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/workspace_templates/modules/repo-skills/files/.agents/skills/tcx-workflow/SKILL.md +1 -1
- tradingcodex-0.3.1/tradingcodex_service/version.py +0 -1
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/CONTRIBUTING.md +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/LICENSE +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/MANIFEST.in +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/NOTICE +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/TRADEMARKS.md +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/apps/__init__.py +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/apps/audit/__init__.py +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/apps/audit/admin.py +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/apps/audit/apps.py +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/apps/audit/migrations/0001_initial.py +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/apps/audit/migrations/__init__.py +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/apps/audit/models.py +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/apps/harness/__init__.py +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/apps/harness/admin.py +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/apps/harness/apps.py +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/apps/harness/migrations/0001_initial.py +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/apps/harness/migrations/__init__.py +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/apps/harness/models.py +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/apps/harness/templatetags/__init__.py +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/apps/integrations/__init__.py +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/apps/integrations/admin.py +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/apps/integrations/apps.py +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/apps/integrations/migrations/0001_initial.py +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/apps/integrations/migrations/0002_brokerconnection_brokeraccount_instrumentmap.py +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/apps/integrations/migrations/__init__.py +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/apps/integrations/models.py +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/apps/mcp/__init__.py +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/apps/mcp/admin.py +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/apps/mcp/apps.py +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/apps/mcp/migrations/0001_initial.py +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/apps/mcp/migrations/__init__.py +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/apps/mcp/models.py +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/apps/mcp/services.py +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/apps/orders/__init__.py +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/apps/orders/admin.py +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/apps/orders/apps.py +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/apps/orders/migrations/0001_initial.py +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/apps/orders/migrations/0002_approvalreceipt_approved_order_type_and_more.py +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/apps/orders/migrations/0003_migrate_orderintent_to_orderticket.py +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/apps/orders/migrations/0004_remove_order_intent_compat_fields.py +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/apps/orders/migrations/__init__.py +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/apps/orders/models.py +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/apps/orders/services.py +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/apps/policy/__init__.py +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/apps/policy/admin.py +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/apps/policy/apps.py +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/apps/policy/migrations/0001_initial.py +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/apps/policy/migrations/__init__.py +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/apps/policy/models.py +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/apps/policy/services.py +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/apps/portfolio/__init__.py +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/apps/portfolio/admin.py +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/apps/portfolio/apps.py +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/apps/portfolio/migrations/0001_initial.py +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/apps/portfolio/migrations/0002_brokersyncrun_portfolioledgerevent_reconciliationrun.py +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/apps/portfolio/migrations/__init__.py +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/apps/portfolio/models.py +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/apps/workflows/__init__.py +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/apps/workflows/admin.py +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/apps/workflows/apps.py +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/apps/workflows/migrations/0001_initial.py +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/apps/workflows/migrations/__init__.py +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/apps/workflows/models.py +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/assets/tradingcodex-banner.svg +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/docs/artifact-supervisor-loop-prd.md +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/docs/components.md +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/docs/financial-workflow-references.md +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/docs/guardrails.md +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/docs/harness.md +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/docs/improvement-loop.md +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/docs/interfaces-and-surfaces.md +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/docs/licensing-and-commercialization.md +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/docs/product-direction.md +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/docs/safety-policy-and-execution.md +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/docs/system-architecture.md +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/docs/user-facing-skills.md +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/install.sh +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/installation.md +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/setup.cfg +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/tests/test_broker_center_prd.py +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/tests/test_e2e_user_scenarios.py +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/tradingcodex.egg-info/SOURCES.txt +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/tradingcodex.egg-info/dependency_links.txt +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/tradingcodex.egg-info/entry_points.txt +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/tradingcodex.egg-info/requires.txt +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/tradingcodex.egg-info/top_level.txt +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/tradingcodex_cli/__init__.py +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/tradingcodex_cli/__main__.py +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/tradingcodex_cli/commands/__init__.py +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/tradingcodex_cli/commands/connectors.py +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/tradingcodex_cli/commands/db.py +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/tradingcodex_cli/commands/decision.py +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/tradingcodex_cli/commands/doctor.py +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/tradingcodex_cli/commands/mcp.py +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/tradingcodex_cli/commands/mode.py +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/tradingcodex_cli/commands/orders.py +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/tradingcodex_cli/commands/policy.py +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/tradingcodex_cli/commands/profile.py +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/tradingcodex_cli/commands/research.py +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/tradingcodex_cli/commands/skills.py +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/tradingcodex_cli/commands/strategies.py +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/tradingcodex_cli/commands/subagents.py +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/tradingcodex_cli/commands/utils.py +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/tradingcodex_cli/commands/workflow.py +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/tradingcodex_cli/commands/workspaces.py +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/tradingcodex_cli/generator.py +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/tradingcodex_cli/mcp_stdio.py +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/tradingcodex_service/__init__.py +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/tradingcodex_service/admin.py +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/tradingcodex_service/api.py +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/tradingcodex_service/application/__init__.py +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/tradingcodex_service/application/agents.py +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/tradingcodex_service/application/artifact_quality.py +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/tradingcodex_service/application/audit.py +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/tradingcodex_service/application/brokers.py +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/tradingcodex_service/application/common.py +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/tradingcodex_service/application/components.py +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/tradingcodex_service/application/context_budget.py +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/tradingcodex_service/application/decision_packages.py +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/tradingcodex_service/application/markdown_preview.py +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/tradingcodex_service/application/orders.py +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/tradingcodex_service/application/policy.py +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/tradingcodex_service/application/portfolio.py +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/tradingcodex_service/application/research.py +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/tradingcodex_service/application/runtime.py +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/tradingcodex_service/application/runtime_mode.py +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/tradingcodex_service/application/workflow_planner.py +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/tradingcodex_service/application/workflow_routing.py +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/tradingcodex_service/asgi.py +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/tradingcodex_service/settings.py +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/tradingcodex_service/static/tradingcodex_admin/favicon.svg +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/tradingcodex_service/static/tradingcodex_web/app.js +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/tradingcodex_service/static/vendor/htmx/htmx.min.js +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/tradingcodex_service/templates/web/activity.html +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/tradingcodex_service/templates/web/agent_skills.html +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/tradingcodex_service/templates/web/base.html +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/tradingcodex_service/templates/web/brokers.html +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/tradingcodex_service/templates/web/dashboard.html +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/tradingcodex_service/templates/web/decisions.html +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/tradingcodex_service/templates/web/fragments/role_inspector.html +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/tradingcodex_service/templates/web/fragments/topology_canvas.html +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/tradingcodex_service/templates/web/fragments/workspace_card.html +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/tradingcodex_service/templates/web/harness.html +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/tradingcodex_service/templates/web/mcp_router.html +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/tradingcodex_service/templates/web/orders.html +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/tradingcodex_service/templates/web/policy.html +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/tradingcodex_service/templates/web/portfolio.html +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/tradingcodex_service/templates/web/starter_prompt.html +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/tradingcodex_service/urls.py +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/tradingcodex_service/web.py +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/tradingcodex_service/wsgi.py +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/workspace_templates/__init__.py +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/workspace_templates/modules/audit/files/.tradingcodex/audit/README.md +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/workspace_templates/modules/audit/files/trading/audit/.gitkeep +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/workspace_templates/modules/audit/module.json +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/workspace_templates/modules/codex-base/files/.codex/config.toml +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/workspace_templates/modules/codex-base/files/.codex/hooks/tradingcodex_hook.py +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/workspace_templates/modules/codex-base/files/.codex/hooks.json +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/workspace_templates/modules/codex-base/files/.codex/rules/tradingcodex.rules +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/workspace_templates/modules/codex-base/files/.tradingcodex/capabilities.yaml +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/workspace_templates/modules/codex-base/files/.tradingcodex/cli.py +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/workspace_templates/modules/codex-base/files/.tradingcodex/config.yaml +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/workspace_templates/modules/codex-base/files/.tradingcodex/policies/policy-bindings.yaml +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/workspace_templates/modules/codex-base/files/.tradingcodex/policies/principals.yaml +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/workspace_templates/modules/codex-base/files/.tradingcodex/policies/roles.yaml +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/workspace_templates/modules/codex-base/files/AGENTS.md +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/workspace_templates/modules/codex-base/files/pyproject.toml +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/workspace_templates/modules/codex-base/module.json +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/policies/access-policies.yaml +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/policies/restricted-list.yaml +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/schemas/approval_receipt.schema.json +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/schemas/audit_event.schema.json +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/schemas/evidence_pack.schema.json +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/schemas/execution_result.schema.json +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/schemas/fundamental_report.schema.json +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/schemas/news_report.schema.json +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/schemas/order_ticket.schema.json +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/schemas/portfolio_review.schema.json +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/schemas/postmortem_report.schema.json +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/schemas/research_artifact.schema.json +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/schemas/risk_report.schema.json +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/schemas/technical_report.schema.json +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/schemas/thesis.schema.json +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/schemas/valuation.schema.json +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/workspace_templates/modules/enforcement-guardrails/module.json +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/workspace_templates/modules/fixed-subagents/files/.codex/agents/execution-operator.toml +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/workspace_templates/modules/fixed-subagents/files/.codex/agents/fundamental-analyst.toml +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/workspace_templates/modules/fixed-subagents/files/.codex/agents/instrument-analyst.toml +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/workspace_templates/modules/fixed-subagents/files/.codex/agents/judgment-reviewer.toml +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/workspace_templates/modules/fixed-subagents/files/.codex/agents/macro-analyst.toml +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/workspace_templates/modules/fixed-subagents/files/.codex/agents/news-analyst.toml +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/workspace_templates/modules/fixed-subagents/files/.codex/agents/portfolio-manager.toml +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/workspace_templates/modules/fixed-subagents/files/.codex/agents/risk-manager.toml +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/workspace_templates/modules/fixed-subagents/files/.codex/agents/technical-analyst.toml +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/workspace_templates/modules/fixed-subagents/files/.codex/agents/valuation-analyst.toml +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/workspace_templates/modules/fixed-subagents/files/.tradingcodex/mainagent/skill-change-proposals/.gitkeep +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/workspace_templates/modules/fixed-subagents/module.json +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/workspace_templates/modules/guidance-guardrails/files/.tradingcodex/guidance/guardrails.md +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/workspace_templates/modules/guidance-guardrails/files/.tradingcodex/guidance/task-quality-checklist.md +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/workspace_templates/modules/guidance-guardrails/module.json +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/workspace_templates/modules/information-barriers/files/.tradingcodex/policies/information-barriers.yaml +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/workspace_templates/modules/information-barriers/files/.tradingcodex/secrets.md +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/workspace_templates/modules/information-barriers/files/trading/approvals/.gitkeep +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/workspace_templates/modules/information-barriers/files/trading/forecasts/.gitkeep +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/workspace_templates/modules/information-barriers/files/trading/market-data/.gitkeep +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/workspace_templates/modules/information-barriers/files/trading/orders/approved/.gitkeep +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/workspace_templates/modules/information-barriers/files/trading/orders/draft/.gitkeep +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/workspace_templates/modules/information-barriers/files/trading/orders/executed/.gitkeep +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/workspace_templates/modules/information-barriers/files/trading/orders/rejected/.gitkeep +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/workspace_templates/modules/information-barriers/files/trading/portfolio/.gitkeep +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/workspace_templates/modules/information-barriers/files/trading/reports/fundamental/.gitkeep +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/workspace_templates/modules/information-barriers/files/trading/reports/instrument/.gitkeep +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/workspace_templates/modules/information-barriers/files/trading/reports/macro/.gitkeep +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/workspace_templates/modules/information-barriers/files/trading/reports/news/.gitkeep +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/workspace_templates/modules/information-barriers/files/trading/reports/policy/.gitkeep +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/workspace_templates/modules/information-barriers/files/trading/reports/portfolio/.gitkeep +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/workspace_templates/modules/information-barriers/files/trading/reports/postmortem/.gitkeep +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/workspace_templates/modules/information-barriers/files/trading/reports/risk/.gitkeep +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/workspace_templates/modules/information-barriers/files/trading/reports/technical/.gitkeep +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/workspace_templates/modules/information-barriers/files/trading/reports/valuation/.gitkeep +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/workspace_templates/modules/information-barriers/files/trading/research/.gitkeep +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/workspace_templates/modules/information-barriers/module.json +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/workspace_templates/modules/paper-trading/module.json +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/workspace_templates/modules/postmortem/files/.tradingcodex/workflows/postmortem.yaml +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/workspace_templates/modules/postmortem/module.json +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/workspace_templates/modules/repo-skills/files/.agents/skills/automate-workflow/SKILL.md +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/workspace_templates/modules/repo-skills/files/.agents/skills/automate-workflow/agents/openai.yaml +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/workspace_templates/modules/repo-skills/files/.agents/skills/plan-workflow/SKILL.md +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/workspace_templates/modules/repo-skills/files/.agents/skills/plan-workflow/agents/openai.yaml +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/workspace_templates/modules/repo-skills/files/.agents/skills/postmortem/SKILL.md +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/workspace_templates/modules/repo-skills/files/.agents/skills/postmortem/agents/openai.yaml +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/workspace_templates/modules/repo-skills/files/.agents/skills/strategy-creator/SKILL.md +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/workspace_templates/modules/repo-skills/files/.agents/skills/strategy-creator/agents/openai.yaml +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/workspace_templates/modules/repo-skills/files/.agents/skills/tcx-build/SKILL.md +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/workspace_templates/modules/repo-skills/files/.agents/skills/tcx-build/agents/openai.yaml +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/workspace_templates/modules/repo-skills/files/.agents/skills/tcx-server/SKILL.md +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/workspace_templates/modules/repo-skills/files/.agents/skills/tcx-server/agents/openai.yaml +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/workspace_templates/modules/repo-skills/files/.agents/skills/tcx-workflow/agents/openai.yaml +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/workspace_templates/modules/repo-skills/files/.agents/skills/tcx-workflow/references/decision-quality-spine.md +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/execution-operator/execute-paper-order/SKILL.md +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/execution-operator/execute-paper-order/agents/openai.yaml +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/fundamental-analyst/fundamental-analysis/SKILL.md +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/fundamental-analyst/fundamental-analysis/agents/openai.yaml +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/instrument-analyst/instrument-analysis/SKILL.md +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/instrument-analyst/instrument-analysis/agents/openai.yaml +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/judgment-reviewer/agent-judgment-review/SKILL.md +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/judgment-reviewer/agent-judgment-review/agents/openai.yaml +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/macro-analyst/macro-analysis/SKILL.md +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/macro-analyst/macro-analysis/agents/openai.yaml +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/news-analyst/news-analysis/SKILL.md +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/news-analyst/news-analysis/agents/openai.yaml +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/portfolio-manager/create-order-ticket/SKILL.md +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/portfolio-manager/create-order-ticket/agents/openai.yaml +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/portfolio-manager/portfolio-review/SKILL.md +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/portfolio-manager/portfolio-review/agents/openai.yaml +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/risk-manager/approve-order/SKILL.md +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/risk-manager/approve-order/agents/openai.yaml +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/risk-manager/policy-review/SKILL.md +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/risk-manager/policy-review/agents/openai.yaml +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/risk-manager/review-risk/SKILL.md +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/risk-manager/review-risk/agents/openai.yaml +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/shared/anti-overfit-validation/SKILL.md +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/shared/anti-overfit-validation/agents/openai.yaml +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/shared/collect-evidence/SKILL.md +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/shared/collect-evidence/agents/openai.yaml +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/shared/external-data-source-gate/SKILL.md +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/shared/external-data-source-gate/agents/openai.yaml +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/shared/forecasting-discipline/SKILL.md +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/shared/forecasting-discipline/agents/openai.yaml +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/shared/numeric-data-qc/SKILL.md +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/shared/numeric-data-qc/agents/openai.yaml +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/shared/thesis-scenario-tree/SKILL.md +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/shared/thesis-scenario-tree/agents/openai.yaml +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/technical-analyst/technical-analysis/SKILL.md +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/technical-analyst/technical-analysis/agents/openai.yaml +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/valuation-analyst/valuation-review/SKILL.md +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/valuation-analyst/valuation-review/agents/openai.yaml +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/workspace_templates/modules/repo-skills/module.json +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/workspace_templates/modules/stub-execution/module.json +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/workspace_templates/modules/tradingcodex-mcp/files/.tradingcodex/mcp/enforcer/README.md +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/workspace_templates/modules/tradingcodex-mcp/files/.tradingcodex/mcp/gateway/README.md +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/workspace_templates/modules/tradingcodex-mcp/files/.tradingcodex/mcp/server.py +0 -0
- {tradingcodex-0.3.1 → tradingcodex-0.3.3}/workspace_templates/modules/tradingcodex-mcp/module.json +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: tradingcodex
|
|
3
|
-
Version: 0.3.
|
|
3
|
+
Version: 0.3.3
|
|
4
4
|
Summary: Agentic investment workflow harness for Codex-native research and service-gated execution checks.
|
|
5
5
|
Author: TradingCodex Authors
|
|
6
6
|
License-Expression: Apache-2.0
|
|
@@ -229,7 +229,7 @@ provide investment recommendations or guarantee returns.
|
|
|
229
229
|
| Status | Milestone |
|
|
230
230
|
| --- | --- |
|
|
231
231
|
| Shipped | Generated Codex workspace, fixed role roster, project MCP config, Django service plane, local web dashboard, Admin, Ninja API, file-native research memory, component registry, policy/audit primitives. |
|
|
232
|
-
| Current `0.3.
|
|
232
|
+
| Current `0.3.3` | Flexible package/workspace update status, skipped-version Django migration smoke coverage, brief research chat replies with saved head-manager synthesis reports, Codex-native Decision Packages, independent judgment-review gate, staged workflow planning, artifact-supervisor loop closure state, Evidence Run/Validation Cards, provider capability profiles, and Python `>=3.11,<3.15` support. |
|
|
233
233
|
| Next | Deeper validation scenarios, richer provider capability profiles, stronger generated-workspace smoke coverage, and improved artifact quality tooling. |
|
|
234
234
|
| Future | Separately governed verified adapters, hosted/managed services, enterprise policy/compliance packs, and broker-specific live providers only after explicit product, policy, adapter, and validation work. |
|
|
235
235
|
|
|
@@ -198,7 +198,7 @@ provide investment recommendations or guarantee returns.
|
|
|
198
198
|
| Status | Milestone |
|
|
199
199
|
| --- | --- |
|
|
200
200
|
| Shipped | Generated Codex workspace, fixed role roster, project MCP config, Django service plane, local web dashboard, Admin, Ninja API, file-native research memory, component registry, policy/audit primitives. |
|
|
201
|
-
| Current `0.3.
|
|
201
|
+
| Current `0.3.3` | Flexible package/workspace update status, skipped-version Django migration smoke coverage, brief research chat replies with saved head-manager synthesis reports, Codex-native Decision Packages, independent judgment-review gate, staged workflow planning, artifact-supervisor loop closure state, Evidence Run/Validation Cards, provider capability profiles, and Python `>=3.11,<3.15` support. |
|
|
202
202
|
| Next | Deeper validation scenarios, richer provider capability profiles, stronger generated-workspace smoke coverage, and improved artifact quality tooling. |
|
|
203
203
|
| Future | Separately governed verified adapters, hosted/managed services, enterprise policy/compliance packs, and broker-specific live providers only after explicit product, policy, adapter, and validation work. |
|
|
204
204
|
|
|
@@ -64,7 +64,7 @@ If these layers disagree, treat `docs/` as the durable product intent and fix th
|
|
|
64
64
|
| [interfaces-and-surfaces.md](./interfaces-and-surfaces.md) | Product web, Django Admin, Django Ninja API, MCP boundary, CLI, generated wrapper behavior, and external MCP surface. |
|
|
65
65
|
| [generated-workspaces.md](./generated-workspaces.md) | `tcx attach`, `tcx init`, `tcx update`, generated files, project-scoped MCP config, hooks, workspace provenance, profile scope, and template rules. |
|
|
66
66
|
| [validation-and-test-plan.md](./validation-and-test-plan.md) | Required validation commands, unit/API/generator/smoke coverage, MCP smokes, broker provider smokes, routing scenarios, and release-sensitive checks. |
|
|
67
|
-
| [deployment.md](./deployment.md) | PyPI
|
|
67
|
+
| [deployment.md](./deployment.md) | PyPI release process, CI/CD, Trusted Publishing, installer/update policy, versioning, and what is not deployed. |
|
|
68
68
|
| [licensing-and-commercialization.md](./licensing-and-commercialization.md) | Apache-2.0 open-core boundary, generated workspace ownership, contributions, trademark posture, and legal review needs. |
|
|
69
69
|
|
|
70
70
|
## Change-To-Docs Map
|
|
@@ -96,6 +96,9 @@ subagents. Detailed responsibilities live in
|
|
|
96
96
|
Handoff states are `accepted`, `revise`, `blocked`, or `waiting`. Only accepted
|
|
97
97
|
artifacts move downstream. `head-manager` may synthesize accepted outputs and
|
|
98
98
|
conflicts, but must not repair missing specialist work with direct analysis.
|
|
99
|
+
When synthesis is allowed, the full user-facing synthesis should be saved as a
|
|
100
|
+
workspace Markdown report; the chat reply should stay brief and point to that
|
|
101
|
+
report.
|
|
99
102
|
|
|
100
103
|
## Execution Lifecycle Snapshot
|
|
101
104
|
|
|
@@ -34,9 +34,6 @@ Use Python 3.11 for release build verification and keep CI green across the
|
|
|
34
34
|
supported range. The package metadata requires `>=3.11,<3.15`, and CI runs on
|
|
35
35
|
Python 3.11, 3.12, 3.13, and 3.14.
|
|
36
36
|
|
|
37
|
-
Create separate PyPI and TestPyPI accounts. TestPyPI is a separate service and
|
|
38
|
-
does not share login state with PyPI.
|
|
39
|
-
|
|
40
37
|
Configure Trusted Publishing before the first upload. Do not store long-lived
|
|
41
38
|
PyPI API tokens in GitHub repository secrets unless Trusted Publishing is not
|
|
42
39
|
available.
|
|
@@ -46,12 +43,9 @@ Trusted Publisher settings:
|
|
|
46
43
|
| Index | Project | Owner | Repository | Workflow | Environment |
|
|
47
44
|
| --- | --- | --- | --- | --- | --- |
|
|
48
45
|
| PyPI | `tradingcodex` | repository owner/org | repository name | `release.yml` | `pypi` |
|
|
49
|
-
| TestPyPI | `tradingcodex` | repository owner/org | repository name | `release.yml` | `testpypi` |
|
|
50
|
-
|
|
51
|
-
On GitHub, create both environments:
|
|
52
46
|
|
|
53
|
-
|
|
54
|
-
|
|
47
|
+
On GitHub, create the `pypi` environment and require manual approval before
|
|
48
|
+
deployment.
|
|
55
49
|
|
|
56
50
|
## Local Build Verification
|
|
57
51
|
|
|
@@ -101,27 +95,25 @@ It runs on pull requests and pushes to `main` or `develop`:
|
|
|
101
95
|
- builds the package for validation only
|
|
102
96
|
- validates distribution metadata with `twine check`
|
|
103
97
|
|
|
104
|
-
The CI workflow never uploads to
|
|
105
|
-
|
|
98
|
+
The CI workflow never uploads to PyPI. Pushes to `main` or `develop` run tests
|
|
99
|
+
and packaging checks only.
|
|
106
100
|
|
|
107
101
|
Release automation is defined in `.github/workflows/release.yml` and appears as
|
|
108
102
|
`Manual Release` in GitHub Actions.
|
|
109
103
|
|
|
110
104
|
The release workflow is manual-only. Branch pushes and tag pushes must not
|
|
111
|
-
publish package artifacts to
|
|
105
|
+
publish package artifacts to PyPI.
|
|
112
106
|
|
|
113
107
|
The release workflow has additional guardrails:
|
|
114
108
|
|
|
115
109
|
- publication requires `workflow_dispatch`
|
|
116
110
|
- PyPI publication is allowed only from the `main` branch
|
|
117
|
-
- TestPyPI and PyPI publication must be run as separate manual workflow runs
|
|
118
111
|
- concurrent release runs on the same ref are serialized instead of cancelled
|
|
119
112
|
|
|
120
|
-
Manual `workflow_dispatch` can publish to
|
|
121
|
-
`publish_testpypi=true`, and to PyPI when `publish_pypi=true`.
|
|
113
|
+
Manual `workflow_dispatch` can publish to PyPI when `publish_pypi=true`.
|
|
122
114
|
|
|
123
|
-
Keep
|
|
124
|
-
|
|
115
|
+
Keep `publish_pypi=false` when the run should only build and verify
|
|
116
|
+
distributions.
|
|
125
117
|
|
|
126
118
|
The workflow uses PyPI Trusted Publishing. The publish jobs request only an
|
|
127
119
|
OIDC token through `id-token: write`; they do not require API-token secrets.
|
|
@@ -134,32 +126,6 @@ and download do not depend on the deprecated Node.js 20 action runtime.
|
|
|
134
126
|
`tcx update` applies central DB migrations before the updated workspace is used.
|
|
135
127
|
Product flows create, check, approve, and submit `OrderTicket` records directly.
|
|
136
128
|
|
|
137
|
-
## TestPyPI Release
|
|
138
|
-
|
|
139
|
-
Use TestPyPI before the first public PyPI release and after packaging changes.
|
|
140
|
-
|
|
141
|
-
1. Confirm the local build verification steps pass.
|
|
142
|
-
2. Run the `Manual Release` workflow manually with `publish_testpypi=true`.
|
|
143
|
-
3. Install from TestPyPI in a clean environment.
|
|
144
|
-
|
|
145
|
-
Example:
|
|
146
|
-
|
|
147
|
-
```bash
|
|
148
|
-
python3.11 -m venv /tmp/tcx-testpypi
|
|
149
|
-
/tmp/tcx-testpypi/bin/pip install \
|
|
150
|
-
--index-url https://test.pypi.org/simple/ \
|
|
151
|
-
--extra-index-url https://pypi.org/simple/ \
|
|
152
|
-
tradingcodex==0.3.1
|
|
153
|
-
rm -rf /tmp/tcx-testpypi-smoke
|
|
154
|
-
mkdir -p /tmp/tcx-testpypi-smoke
|
|
155
|
-
cd /tmp/tcx-testpypi-smoke
|
|
156
|
-
/tmp/tcx-testpypi/bin/tcx attach .
|
|
157
|
-
./tcx doctor
|
|
158
|
-
```
|
|
159
|
-
|
|
160
|
-
`--extra-index-url` is used because dependencies such as Django may not be
|
|
161
|
-
available on TestPyPI.
|
|
162
|
-
|
|
163
129
|
## PyPI Release
|
|
164
130
|
|
|
165
131
|
Before pushing the release tag:
|
|
@@ -168,7 +134,6 @@ Before pushing the release tag:
|
|
|
168
134
|
- verify `README.md` describes execution as service-gated
|
|
169
135
|
- verify docs mention that live broker execution requires installed providers and explicit gates
|
|
170
136
|
- run local build verification
|
|
171
|
-
- run a TestPyPI release when packaging changed
|
|
172
137
|
|
|
173
138
|
Then create or update the GitHub release/tag as needed, and run the
|
|
174
139
|
`Manual Release` workflow manually with `publish_pypi=true`. Do not rely on tag push for
|
|
@@ -178,7 +143,7 @@ After the PyPI workflow completes:
|
|
|
178
143
|
|
|
179
144
|
```bash
|
|
180
145
|
python3.11 -m venv /tmp/tcx-pypi
|
|
181
|
-
/tmp/tcx-pypi/bin/pip install tradingcodex==0.3.
|
|
146
|
+
/tmp/tcx-pypi/bin/pip install tradingcodex==0.3.3
|
|
182
147
|
rm -rf /tmp/tcx-pypi-smoke
|
|
183
148
|
mkdir -p /tmp/tcx-pypi-smoke
|
|
184
149
|
cd /tmp/tcx-pypi-smoke
|
|
@@ -277,7 +242,12 @@ Use PEP 440 versions:
|
|
|
277
242
|
updates after `0.2.10`
|
|
278
243
|
- `0.3.1` for compatible evidence-card validation and persisted loop closure
|
|
279
244
|
state fixes after `0.3.0`
|
|
280
|
-
-
|
|
245
|
+
- `0.3.2` for brief research chat replies with saved head-manager synthesis
|
|
246
|
+
reports after `0.3.1`
|
|
247
|
+
- `0.3.3` for flexible update status across package/workspace drift,
|
|
248
|
+
skipped-version Django migration smoke coverage, and PyPI-only release flow
|
|
249
|
+
after `0.3.2`
|
|
250
|
+
- later patch releases for compatible fixes after `0.3.3`
|
|
281
251
|
- pre-releases such as `0.4.0a1`, `0.4.0b1`, or `0.4.0rc1` when preparing
|
|
282
252
|
the next minor contract
|
|
283
253
|
|
|
@@ -101,7 +101,7 @@ Generated workspaces contain:
|
|
|
101
101
|
- an immutable workspace manifest at `.tradingcodex/workspace.json`
|
|
102
102
|
- root `head-manager` identity loaded from `.codex/prompts/base_instructions/head-manager.md` through `.codex/config.toml` `model_instructions_file`
|
|
103
103
|
- sectioned Markdown base-instruction format for `head-manager`, including `# How you work`, TradingCodex guardrails, and tool guidelines
|
|
104
|
-
- Codex-style operating style in the root `head-manager` prompt: scoped `AGENTS.md` handling, concise preambles, selective planning, `rg`-first search, `apply_patch` edits, focused validation, dirty-worktree respect, and
|
|
104
|
+
- Codex-style operating style in the root `head-manager` prompt: scoped `AGENTS.md` handling, concise preambles, selective planning, `rg`-first search, `apply_patch` edits, focused validation, dirty-worktree respect, concise maintenance handoffs, and brief chat replies that point to saved head-manager synthesis reports once accepted artifacts exist
|
|
105
105
|
- instruction/skill separation: root `head-manager` instructions own identity, durable safety boundaries, fail-closed dispatch, role boundaries, skill routing, optional-skill management, and approved action boundaries; fixed subagent TOML files own standing role identity, MCP/tool config, artifact walls, and always-on prohibitions; repo skills are dependency-light capability procedures for workflow maps, compact assignment-envelope templates, optional skill file management, quality gates, synthesis, and postmortems, without declaring role ownership or direct inter-skill call chains
|
|
106
106
|
- no-overlap handoff contract: each role owns its specialist question, downstream roles consume accepted artifacts, and missing/stale/weak upstream work returns `revise`, `blocked`, or `waiting` instead of being silently redone by another role
|
|
107
107
|
- validated staged workflow plan: hook intake hints are not binding; `$tcx-workflow`
|
|
@@ -250,8 +250,9 @@ user-terminal workspace-only path:
|
|
|
250
250
|
step. If startup health reports `update_status.workspace_update_allowed=true`,
|
|
251
251
|
`head-manager` should tell the user to run
|
|
252
252
|
`update_status.workspace_update_command` from their terminal. If startup health
|
|
253
|
-
reports `update_status.package_update_required_first=true`,
|
|
254
|
-
|
|
253
|
+
reports `update_status.package_update_required_first=true`, including when the
|
|
254
|
+
generated workspace and installed wrapper both match an older release, package
|
|
255
|
+
refresh is also a user-terminal action, normally:
|
|
255
256
|
|
|
256
257
|
```bash
|
|
257
258
|
uvx --refresh --from tradingcodex tcx update .
|
|
@@ -366,7 +367,10 @@ must explain the two supported paths: switch Codex to full access and enable
|
|
|
366
367
|
TradingCodex build mode, or run the recommended `update_status.command` from a
|
|
367
368
|
terminal. Self-update is allowed only when Codex full access and explicit
|
|
368
369
|
workspace build mode are both active and the user asks for the update. After
|
|
369
|
-
self-update, `head-manager` stops and tells the user to restart Codex.
|
|
370
|
+
self-update, `head-manager` stops and tells the user to restart Codex. If a
|
|
371
|
+
same-DB service is already running with a newer TradingCodex version than the
|
|
372
|
+
current wrapper, startup health treats that service version as an update hint
|
|
373
|
+
and should recommend package/workspace refresh before service stop.
|
|
370
374
|
|
|
371
375
|
Build mode is per workspace and explicit:
|
|
372
376
|
|
|
@@ -266,5 +266,7 @@ Research file writes should be deterministic enough for review:
|
|
|
266
266
|
- include content hash
|
|
267
267
|
- avoid raw secrets
|
|
268
268
|
- use stable paths for role-owned reports
|
|
269
|
+
- save head-manager final synthesis reports as
|
|
270
|
+
`trading/reports/head-manager/synthesis-<workflow_run_id>.md`
|
|
269
271
|
- make stale/missing source warnings visible
|
|
270
272
|
- keep file content readable by Codex without a DB lookup
|
|
@@ -156,7 +156,11 @@ For repository, CLI, Django, MCP, template, docs, test, and harness maintenance
|
|
|
156
156
|
work, `head-manager` follows the default Codex coding-agent style: concise
|
|
157
157
|
preambles before grouped tool work, plans only for meaningful multi-step tasks,
|
|
158
158
|
`rg`-first search, `apply_patch` for manual edits, focused validation before
|
|
159
|
-
broader checks, respect for dirty worktrees, and concise
|
|
159
|
+
broader checks, respect for dirty worktrees, and concise maintenance handoffs.
|
|
160
|
+
Investment synthesis stores depth in a workspace Markdown report: after
|
|
161
|
+
accepted artifacts exist, `head-manager` should save the full synthesis under
|
|
162
|
+
`trading/reports/head-manager/` and keep the chat reply brief with the report
|
|
163
|
+
path, 1-3 key takeaways, and next allowed action.
|
|
160
164
|
|
|
161
165
|
This operating style is a working discipline, not an investment permission.
|
|
162
166
|
It does not weaken the dispatch gate, role-owned skill boundary, approved action
|
|
@@ -166,8 +170,8 @@ boundary, approval requirements, or information barriers.
|
|
|
166
170
|
|
|
167
171
|
| Situation | Allowed response | Forbidden response |
|
|
168
172
|
| --- | --- | --- |
|
|
169
|
-
| Broad analysis such as "Analyze Apple stock" | auto-dispatch or reuse selected subagents, then wait for outputs before synthesis | Direct business/price/news/recommendation analysis |
|
|
170
|
-
| Explicit workflow request such as "$tcx-workflow analyze Apple" | Spawn selected team or reuse active/completed roles, wait for outputs, then
|
|
173
|
+
| Broad analysis such as "Analyze Apple stock" | auto-dispatch or reuse selected subagents, then wait for outputs before saving a head-manager synthesis report and returning a brief chat summary | Direct business/price/news/recommendation analysis |
|
|
174
|
+
| Explicit workflow request such as "$tcx-workflow analyze Apple" | Spawn selected team or reuse active/completed roles, wait for outputs, then save a synthesis report and return its path with a brief summary | Analyze without dispatch |
|
|
171
175
|
| Broker/provider build request | Check full-access plus TCX build mode, connect/scaffold/register/validate provider metadata through `$tcx-build`, and keep live submission inside service gates | Dispatch investment subagents, ask for raw secrets, or expose raw broker SDK tools |
|
|
172
176
|
| Decision support such as "Should I buy?" | Dispatch analyst/valuation/portfolio/risk team and explain required artifacts/gates | Offer buy/sell opinion without subagent output |
|
|
173
177
|
| Dispatch unavailable, role routing unverified, or dispatch failed | Provide `waiting_for_subagent_dispatch` state and task briefs only | Switch to "I will analyze it myself" |
|
|
@@ -388,6 +392,10 @@ posture, or core skill behavior.
|
|
|
388
392
|
- Downstream roles start from artifact path plus `context_summary`; they open
|
|
389
393
|
full markdown only for disputed, stale, missing, or load-bearing evidence.
|
|
390
394
|
- The head-manager should tell subagents to write reader-facing research artifacts in the user's language from the original request unless the user explicitly requests another artifact language. File paths, frontmatter keys, symbols, tickers, source names, and quoted source text stay in their natural/original form.
|
|
395
|
+
- Once accepted artifacts exist, head-manager final synthesis should be saved
|
|
396
|
+
as `trading/reports/head-manager/synthesis-<workflow_run_id>.md` through the
|
|
397
|
+
research artifact path. The chat reply should stay brief and point to that
|
|
398
|
+
report instead of pasting the full synthesis.
|
|
391
399
|
- `plan-workflow` mandates and `automate-workflow` automation summaries follow the same user-language rule.
|
|
392
400
|
- When selecting an exact fixed role with Codex `spawn_agent`, do not combine `agent_type` with full-history forking. Use a compact assignment envelope on the first attempt and no model/reasoning overrides.
|
|
393
401
|
- Workflow consent stays separate from explicit user constraints. Consent to orchestrate or use subagents allows dispatch, but it is not itself an analytical constraint.
|
|
@@ -251,6 +251,9 @@ Scenarios should include:
|
|
|
251
251
|
- starter prompts and generated guidance expose the no-overlap handoff contract
|
|
252
252
|
- starter prompts and generated guidance tell subagents to write reader-facing
|
|
253
253
|
research artifacts in the user's language unless explicitly overridden
|
|
254
|
+
- starter prompts and generated guidance tell `head-manager` to keep final chat
|
|
255
|
+
brief while saving full accepted-artifact synthesis as a Markdown report under
|
|
256
|
+
`trading/reports/head-manager/`
|
|
254
257
|
- `tcx quality-check <artifact> --strict` fails research markdown that lacks
|
|
255
258
|
source/as-of posture, `context_summary`, material claim tags, handoff state,
|
|
256
259
|
confidence, missing-evidence fields, next-recipient routing, blocked actions,
|
|
@@ -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.3"
|
|
8
8
|
description = "Agentic investment workflow harness for Codex-native research and service-gated execution checks."
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.11,<3.15"
|
|
@@ -150,7 +150,7 @@ def test_service_autostart_rejects_version_and_db_mismatch(monkeypatch) -> None:
|
|
|
150
150
|
)
|
|
151
151
|
with pytest.raises(RuntimeError, match="version mismatch") as version_mismatch:
|
|
152
152
|
service_autostart._assert_compatible_service("127.0.0.1", 48267)
|
|
153
|
-
assert "tcx
|
|
153
|
+
assert "uvx --refresh --from tradingcodex tcx update ." in str(version_mismatch.value)
|
|
154
154
|
|
|
155
155
|
monkeypatch.setattr(service_autostart, "tradingcodex_db_path", lambda: Path("/tmp/current.sqlite3"))
|
|
156
156
|
monkeypatch.setattr(
|
|
@@ -195,6 +195,24 @@ def test_service_autostart_replaces_stale_same_db_service(monkeypatch, tmp_path:
|
|
|
195
195
|
assert state["started"] is True
|
|
196
196
|
|
|
197
197
|
|
|
198
|
+
def test_service_autostart_does_not_replace_newer_same_db_service(monkeypatch, tmp_path: Path) -> None:
|
|
199
|
+
from tradingcodex_cli import service_autostart
|
|
200
|
+
|
|
201
|
+
current_db = tmp_path / "current.sqlite3"
|
|
202
|
+
monkeypatch.setattr(service_autostart, "tradingcodex_db_path", lambda: current_db)
|
|
203
|
+
monkeypatch.setattr(service_autostart, "_tcp_open", lambda host, port: True)
|
|
204
|
+
monkeypatch.setattr(
|
|
205
|
+
service_autostart,
|
|
206
|
+
"_service_health",
|
|
207
|
+
lambda host, port: {"service": "tradingcodex", "version": "999.0.0", "db_path": str(current_db)},
|
|
208
|
+
)
|
|
209
|
+
monkeypatch.setattr(service_autostart, "stop_service", lambda *args, **kwargs: (_ for _ in ()).throw(AssertionError("stopped newer service")))
|
|
210
|
+
monkeypatch.setattr(service_autostart, "_start_service", lambda *args: (_ for _ in ()).throw(AssertionError("started over newer service")))
|
|
211
|
+
|
|
212
|
+
with pytest.raises(RuntimeError, match="uvx --refresh --from tradingcodex tcx update"):
|
|
213
|
+
service_autostart.ensure_service_up(tmp_path, timeout=0.01)
|
|
214
|
+
|
|
215
|
+
|
|
198
216
|
def test_service_status_reports_actionable_state(monkeypatch) -> None:
|
|
199
217
|
from tradingcodex_cli import service_autostart
|
|
200
218
|
|
|
@@ -218,6 +236,15 @@ def test_service_status_reports_actionable_state(monkeypatch) -> None:
|
|
|
218
236
|
assert mismatch["package_version"] == TRADINGCODEX_VERSION
|
|
219
237
|
assert "tcx service stop 127.0.0.1:48267" in mismatch["next_action"]
|
|
220
238
|
|
|
239
|
+
monkeypatch.setattr(
|
|
240
|
+
service_autostart,
|
|
241
|
+
"_service_health",
|
|
242
|
+
lambda host, port: {"service": "tradingcodex", "version": "999.0.0", "db_path": str(Path("/tmp/current.sqlite3"))},
|
|
243
|
+
)
|
|
244
|
+
newer_service = service_autostart.service_status("127.0.0.1:48267")
|
|
245
|
+
assert newer_service["issue"] == "version_mismatch"
|
|
246
|
+
assert "uvx --refresh --from tradingcodex tcx update ." in newer_service["next_action"]
|
|
247
|
+
|
|
221
248
|
monkeypatch.setattr(service_autostart, "tradingcodex_db_path", lambda: Path("/tmp/current.sqlite3"))
|
|
222
249
|
monkeypatch.setattr(
|
|
223
250
|
service_autostart,
|
|
@@ -230,6 +257,67 @@ def test_service_status_reports_actionable_state(monkeypatch) -> None:
|
|
|
230
257
|
assert compatible["next_action"] == "No action needed."
|
|
231
258
|
|
|
232
259
|
|
|
260
|
+
def test_db_migrate_applies_skipped_django_migrations_and_legacy_order_data(tmp_path: Path) -> None:
|
|
261
|
+
workspace = tmp_path / "skip-migration-workspace"
|
|
262
|
+
workspace.mkdir()
|
|
263
|
+
home = tmp_path / "tc-home-skip-migration"
|
|
264
|
+
env_extra = {"TRADINGCODEX_HOME": str(home), "TRADINGCODEX_DB_NAME": None}
|
|
265
|
+
|
|
266
|
+
run([sys.executable, "manage.py", "migrate", "orders", "0001", "--noinput"], ROOT, env_extra=env_extra)
|
|
267
|
+
db_path = home / "state" / "tradingcodex.sqlite3"
|
|
268
|
+
with sqlite3.connect(db_path) as connection:
|
|
269
|
+
connection.execute(
|
|
270
|
+
"""
|
|
271
|
+
INSERT INTO orders_orderintent (
|
|
272
|
+
intent_id, symbol, side, quantity, limit_price, currency, broker,
|
|
273
|
+
estimated_notional_krw, created_by, created_at, portfolio_id,
|
|
274
|
+
account_id, strategy_id, workspace_context, payload
|
|
275
|
+
)
|
|
276
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
277
|
+
""",
|
|
278
|
+
(
|
|
279
|
+
"legacy-intent-1",
|
|
280
|
+
"NVDA",
|
|
281
|
+
"buy",
|
|
282
|
+
"1",
|
|
283
|
+
"100",
|
|
284
|
+
"USD",
|
|
285
|
+
"paper",
|
|
286
|
+
"100",
|
|
287
|
+
"portfolio-manager",
|
|
288
|
+
"2026-01-01 00:00:00",
|
|
289
|
+
"default-paper",
|
|
290
|
+
"local-paper",
|
|
291
|
+
"default-strategy",
|
|
292
|
+
"{}",
|
|
293
|
+
json.dumps({"order_intent": {"order_ticket_id": "legacy-ticket-1", "symbol": "NVDA", "side": "buy", "quantity": "1"}}),
|
|
294
|
+
),
|
|
295
|
+
)
|
|
296
|
+
|
|
297
|
+
migrated = json.loads(run([sys.executable, "-m", "tradingcodex_cli", "db", "migrate"], workspace, env_extra=env_extra).stdout)
|
|
298
|
+
assert migrated["status"] == "migrated"
|
|
299
|
+
with sqlite3.connect(db_path) as connection:
|
|
300
|
+
applied = {
|
|
301
|
+
(row[0], row[1])
|
|
302
|
+
for row in connection.execute("SELECT app, name FROM django_migrations")
|
|
303
|
+
}
|
|
304
|
+
tables = {
|
|
305
|
+
row[0]
|
|
306
|
+
for row in connection.execute("SELECT name FROM sqlite_master WHERE type='table'")
|
|
307
|
+
}
|
|
308
|
+
ticket = connection.execute(
|
|
309
|
+
"SELECT ticket_id, symbol, side, payload_hash FROM orders_orderticket WHERE ticket_id = ?",
|
|
310
|
+
("legacy-ticket-1",),
|
|
311
|
+
).fetchone()
|
|
312
|
+
|
|
313
|
+
assert ("orders", "0004_remove_order_intent_compat_fields") in applied
|
|
314
|
+
assert ("integrations", "0002_brokerconnection_brokeraccount_instrumentmap") in applied
|
|
315
|
+
assert "orders_orderintent" not in tables
|
|
316
|
+
assert ticket is not None
|
|
317
|
+
assert ticket[:3] == ("legacy-ticket-1", "NVDA", "buy")
|
|
318
|
+
assert ticket[3]
|
|
319
|
+
|
|
320
|
+
|
|
233
321
|
def test_service_runserver_uses_fixed_port_and_skips_duplicate(monkeypatch, tmp_path: Path, capsys) -> None:
|
|
234
322
|
from django.core import management
|
|
235
323
|
from tradingcodex_cli import __main__ as cli_main
|
|
@@ -351,6 +439,49 @@ def test_startup_status_preserves_service_mismatch_details(monkeypatch, tmp_path
|
|
|
351
439
|
assert status["allowed_next_actions"][0] == service_detail["next_action"]
|
|
352
440
|
|
|
353
441
|
|
|
442
|
+
def test_startup_status_uses_same_db_newer_service_as_update_hint(monkeypatch, tmp_path: Path) -> None:
|
|
443
|
+
from tradingcodex_cli import startup_status
|
|
444
|
+
|
|
445
|
+
workspace = make_workspace(tmp_path)
|
|
446
|
+
module_lock_path = workspace / ".tradingcodex" / "generated" / "module-lock.json"
|
|
447
|
+
module_lock = json.loads(module_lock_path.read_text(encoding="utf-8"))
|
|
448
|
+
module_lock["tradingcodex_version"] = "0.3.1"
|
|
449
|
+
module_lock_path.write_text(json.dumps(module_lock, indent=2) + "\n", encoding="utf-8")
|
|
450
|
+
db_path = "/tmp/current.sqlite3"
|
|
451
|
+
monkeypatch.setattr(startup_status, "TRADINGCODEX_VERSION", "0.3.1")
|
|
452
|
+
monkeypatch.setattr(
|
|
453
|
+
startup_status,
|
|
454
|
+
"latest_release_info",
|
|
455
|
+
lambda: (_ for _ in ()).throw(AssertionError("latest release check should use service hint")),
|
|
456
|
+
)
|
|
457
|
+
monkeypatch.setattr(
|
|
458
|
+
startup_status,
|
|
459
|
+
"inspect_service_status",
|
|
460
|
+
lambda addr: {
|
|
461
|
+
"addr": addr,
|
|
462
|
+
"url": f"http://{addr}/",
|
|
463
|
+
"reachable": True,
|
|
464
|
+
"compatible": False,
|
|
465
|
+
"service": "tradingcodex",
|
|
466
|
+
"version": "0.3.2",
|
|
467
|
+
"package_version": "0.3.1",
|
|
468
|
+
"db_path": db_path,
|
|
469
|
+
"expected_db_path": db_path,
|
|
470
|
+
"issue": "version_mismatch",
|
|
471
|
+
"next_action": "Run package refresh.",
|
|
472
|
+
},
|
|
473
|
+
)
|
|
474
|
+
monkeypatch.setattr(startup_status, "_read_health", lambda url: {"service": "tradingcodex", "version": "0.3.2", "db_path": db_path})
|
|
475
|
+
|
|
476
|
+
status = startup_status.build_server_status(workspace)
|
|
477
|
+
|
|
478
|
+
update_status = status["update_status"]
|
|
479
|
+
assert update_status["versions_match"] is True
|
|
480
|
+
assert update_status["latest_release_source"] == "service_status"
|
|
481
|
+
assert update_status["package_update_required"] is True
|
|
482
|
+
assert update_status["command"] == "uvx --refresh --from tradingcodex tcx update ."
|
|
483
|
+
|
|
484
|
+
|
|
354
485
|
def test_manage_runserver_uses_fixed_port_and_skips_duplicate(monkeypatch, capsys) -> None:
|
|
355
486
|
from tradingcodex_cli import service_autostart
|
|
356
487
|
|
|
@@ -898,6 +1029,55 @@ def test_session_start_update_recommendation_respects_home_preference(tmp_path:
|
|
|
898
1029
|
assert run_user_prompt_hook(workspace, "Create a quality income strategy for dividend stocks") is None
|
|
899
1030
|
|
|
900
1031
|
|
|
1032
|
+
def test_update_status_detects_stale_package_when_workspace_matches_installed(monkeypatch, tmp_path: Path) -> None:
|
|
1033
|
+
from tradingcodex_cli import startup_status
|
|
1034
|
+
|
|
1035
|
+
workspace = make_workspace(tmp_path)
|
|
1036
|
+
module_lock_path = workspace / ".tradingcodex" / "generated" / "module-lock.json"
|
|
1037
|
+
module_lock = json.loads(module_lock_path.read_text(encoding="utf-8"))
|
|
1038
|
+
module_lock["tradingcodex_version"] = "0.3.1"
|
|
1039
|
+
module_lock_path.write_text(json.dumps(module_lock, indent=2) + "\n", encoding="utf-8")
|
|
1040
|
+
monkeypatch.setattr(startup_status, "TRADINGCODEX_VERSION", "0.3.1")
|
|
1041
|
+
monkeypatch.setattr(
|
|
1042
|
+
startup_status,
|
|
1043
|
+
"latest_release_info",
|
|
1044
|
+
lambda: {"latest_release_version": "0.3.2", "latest_release_status": "ok", "latest_release_source": "test"},
|
|
1045
|
+
)
|
|
1046
|
+
|
|
1047
|
+
update_status = startup_status.build_update_status(workspace, check_latest_release=True)
|
|
1048
|
+
|
|
1049
|
+
assert update_status["versions_match"] is True
|
|
1050
|
+
assert update_status["workspace_update_available"] is False
|
|
1051
|
+
assert update_status["package_update_required"] is True
|
|
1052
|
+
assert update_status["package_update_required_first"] is True
|
|
1053
|
+
assert update_status["update_available"] is True
|
|
1054
|
+
assert update_status["command"] == "uvx --refresh --from tradingcodex tcx update ."
|
|
1055
|
+
|
|
1056
|
+
|
|
1057
|
+
def test_update_status_uses_service_hint_when_latest_check_unavailable(monkeypatch, tmp_path: Path) -> None:
|
|
1058
|
+
from tradingcodex_cli import startup_status
|
|
1059
|
+
|
|
1060
|
+
workspace = make_workspace(tmp_path)
|
|
1061
|
+
module_lock_path = workspace / ".tradingcodex" / "generated" / "module-lock.json"
|
|
1062
|
+
module_lock = json.loads(module_lock_path.read_text(encoding="utf-8"))
|
|
1063
|
+
module_lock["tradingcodex_version"] = "0.3.0"
|
|
1064
|
+
module_lock_path.write_text(json.dumps(module_lock, indent=2) + "\n", encoding="utf-8")
|
|
1065
|
+
monkeypatch.setattr(startup_status, "TRADINGCODEX_VERSION", "0.3.1")
|
|
1066
|
+
monkeypatch.setattr(
|
|
1067
|
+
startup_status,
|
|
1068
|
+
"latest_release_info",
|
|
1069
|
+
lambda: {"latest_release_version": "unknown", "latest_release_status": "unavailable", "latest_release_source": "test"},
|
|
1070
|
+
)
|
|
1071
|
+
|
|
1072
|
+
update_status = startup_status.build_update_status(workspace, latest_version_hint="0.3.2")
|
|
1073
|
+
|
|
1074
|
+
assert update_status["workspace_update_available"] is True
|
|
1075
|
+
assert update_status["latest_release_source"] == "service_status"
|
|
1076
|
+
assert update_status["package_update_required"] is True
|
|
1077
|
+
assert update_status["workspace_update_allowed"] is False
|
|
1078
|
+
assert update_status["command"] == "uvx --refresh --from tradingcodex tcx update ."
|
|
1079
|
+
|
|
1080
|
+
|
|
901
1081
|
def test_repo_skill_templates_keep_instruction_boundary() -> None:
|
|
902
1082
|
skill_root = ROOT / "workspace_templates" / "modules" / "repo-skills" / "files" / ".agents" / "skills"
|
|
903
1083
|
subagent_skill_root = ROOT / "workspace_templates" / "modules" / "repo-skills" / "files" / ".tradingcodex" / "subagents" / "skills"
|
|
@@ -1393,7 +1573,7 @@ def test_runtime_mode_update_and_connector_build_cli(tmp_path: Path) -> None:
|
|
|
1393
1573
|
module_lock_path.write_text(json.dumps(module_lock, indent=2) + "\n", encoding="utf-8")
|
|
1394
1574
|
update_status = json.loads(
|
|
1395
1575
|
run(
|
|
1396
|
-
["./tcx", "update", "status", "--json"],
|
|
1576
|
+
["./tcx", "update", "status", "--json", "--skip-refresh"],
|
|
1397
1577
|
workspace,
|
|
1398
1578
|
env_extra={"TRADINGCODEX_CODEX_PERMISSION": "danger-full-access", "TRADINGCODEX_LATEST_RELEASE_VERSION": TRADINGCODEX_VERSION},
|
|
1399
1579
|
).stdout
|
|
@@ -1693,6 +1873,7 @@ def test_update_refreshes_workspace_contract_and_preserves_identity(tmp_path: Pa
|
|
|
1693
1873
|
assert module_lock["tradingcodex_version"] == TRADINGCODEX_VERSION
|
|
1694
1874
|
assert module_lock["tradingcodex_package_spec"] == "tradingcodex"
|
|
1695
1875
|
assert 'TRADINGCODEX_UPDATE_SKIP_REFRESH="${TRADINGCODEX_UPDATE_SKIP_REFRESH:-0}"' in wrapper
|
|
1876
|
+
assert 'if [ "${1:-}" = "update" ] && [ "${2:-}" = "status" ]; then' not in wrapper
|
|
1696
1877
|
assert 'if [ "${1:-}" = "update" ] && [ "$TRADINGCODEX_UPDATE_SKIP_REFRESH" != "1" ] && command -v uvx >/dev/null 2>&1; then' in wrapper
|
|
1697
1878
|
assert '"--skip-refresh"' in wrapper
|
|
1698
1879
|
assert " ./tcx doctor" in updated.stdout
|
|
@@ -1749,7 +1930,9 @@ def test_starter_prompt_keeps_negated_actions_out_of_execution() -> None:
|
|
|
1749
1930
|
assert "Context budget:" in macro
|
|
1750
1931
|
assert "context_summary" in macro
|
|
1751
1932
|
assert "reader_summary, next_action" in macro
|
|
1752
|
-
assert "Reader mode:
|
|
1933
|
+
assert "Reader mode: keep final chat brief" in macro
|
|
1934
|
+
assert "create_research_artifact at `trading/reports/head-manager/synthesis-<workflow_run_id>.md`" in macro
|
|
1935
|
+
assert "final user-facing synthesis should be deep enough" not in macro
|
|
1753
1936
|
assert "Artifact memory:" in macro
|
|
1754
1937
|
assert "improvements for future judgment" in macro
|
|
1755
1938
|
assert "Do not let downstream roles redo missing upstream work" in macro
|
|
@@ -2381,7 +2564,8 @@ def test_subagents_prompt_cli_and_api_expose_intake_summary(tmp_path: Path, monk
|
|
|
2381
2564
|
for agent in cli_json["intake_summary"]["subagents"]
|
|
2382
2565
|
if agent["role"] == "valuation-analyst"
|
|
2383
2566
|
)
|
|
2384
|
-
assert "Reader mode:
|
|
2567
|
+
assert "Reader mode: keep final chat brief" in cli_json["starter_prompt"]
|
|
2568
|
+
assert "synthesis-<workflow_run_id>" in cli_json["starter_prompt"]
|
|
2385
2569
|
assert "Investor profile questions to ask if unanswered" in cli_json["starter_prompt"]
|
|
2386
2570
|
assert "Method lenses for this lane" in cli_json["starter_prompt"]
|
|
2387
2571
|
|
|
@@ -4598,7 +4782,7 @@ def test_product_web_does_not_create_approvals_or_executions(monkeypatch) -> Non
|
|
|
4598
4782
|
assert "Idea translated" in decision_body
|
|
4599
4783
|
assert "candidate thesis" in decision_body
|
|
4600
4784
|
assert "Portfolio fit" in decision_body
|
|
4601
|
-
assert "Reviews the business, financial drivers" in decision_body
|
|
4785
|
+
assert "Reviews the business, financial drivers" not in decision_body
|
|
4602
4786
|
assert "workflow reaches portfolio/order readiness" in decision_body
|
|
4603
4787
|
assert "Next allowed actions" in decision_body
|
|
4604
4788
|
assert "Answer missing profile questions" in decision_body
|
|
@@ -4705,6 +4889,83 @@ def test_file_native_research_artifacts_via_mcp_api_and_cli(tmp_path: Path) -> N
|
|
|
4705
4889
|
assert strict_quality["frontmatter"]["reader_summary"].startswith("Plain-English first read")
|
|
4706
4890
|
assert strict_quality["frontmatter"]["next_action"] == "Wait for valuation before any portfolio fit discussion."
|
|
4707
4891
|
assert not any("non-expert first-read UX" in warning for warning in strict_quality["warnings"])
|
|
4892
|
+
synthesis = call_mcp_tool(workspace, "create_research_artifact", {
|
|
4893
|
+
"principal_id": "head-manager",
|
|
4894
|
+
"artifact_id": "synthesis-workflow-unit",
|
|
4895
|
+
"artifact_type": "synthesis_report",
|
|
4896
|
+
"universe": "public_equity",
|
|
4897
|
+
"workflow_type": "thesis_review",
|
|
4898
|
+
"symbol": "NVDA",
|
|
4899
|
+
"role": "head-manager",
|
|
4900
|
+
"title": "NVDA Head-Manager Synthesis",
|
|
4901
|
+
"markdown": """---
|
|
4902
|
+
workflow_lane: thesis_review
|
|
4903
|
+
forecast_allowed: false
|
|
4904
|
+
scenario_cases:
|
|
4905
|
+
- base case remains unmodeled in this synthesis smoke
|
|
4906
|
+
contrary_evidence:
|
|
4907
|
+
- accepted artifacts still have one unresolved source freshness gap
|
|
4908
|
+
source_trust_notes:
|
|
4909
|
+
- source posture comes from accepted role artifacts
|
|
4910
|
+
update_triggers:
|
|
4911
|
+
- new accepted role artifact changes the thesis
|
|
4912
|
+
invalidation_conditions:
|
|
4913
|
+
- accepted role artifact contradicts the synthesis
|
|
4914
|
+
---
|
|
4915
|
+
|
|
4916
|
+
# NVDA Head-Manager Synthesis
|
|
4917
|
+
|
|
4918
|
+
## Direct Answer
|
|
4919
|
+
|
|
4920
|
+
[inference] Accepted artifacts are sufficient for a research synthesis smoke, not for an order.
|
|
4921
|
+
|
|
4922
|
+
## Accepted Artifact Inputs
|
|
4923
|
+
|
|
4924
|
+
[factual] Input artifacts are referenced by path in frontmatter and body.
|
|
4925
|
+
|
|
4926
|
+
## Synthesis
|
|
4927
|
+
|
|
4928
|
+
[inference] The combined read remains research-only.
|
|
4929
|
+
|
|
4930
|
+
## Disagreements/Conflicts
|
|
4931
|
+
|
|
4932
|
+
[factual] One freshness gap remains visible.
|
|
4933
|
+
|
|
4934
|
+
## Source/As-Of Posture
|
|
4935
|
+
|
|
4936
|
+
[factual] Source posture is inherited from accepted role artifacts.
|
|
4937
|
+
|
|
4938
|
+
## Missing Evidence
|
|
4939
|
+
|
|
4940
|
+
[factual] Updated filing snapshot remains missing.
|
|
4941
|
+
|
|
4942
|
+
## Caveats
|
|
4943
|
+
|
|
4944
|
+
[assumption] No valuation, order, approval, or execution is implied.
|
|
4945
|
+
|
|
4946
|
+
## Next Allowed Action
|
|
4947
|
+
|
|
4948
|
+
[factual] User can inspect the saved synthesis report.
|
|
4949
|
+
""",
|
|
4950
|
+
"source_as_of": "2026-06-01",
|
|
4951
|
+
"readiness_label": "not-decision-ready",
|
|
4952
|
+
"context_summary": "Head-manager synthesis report saved for user inspection.",
|
|
4953
|
+
"reader_summary": "Brief chat should point to this saved synthesis report.",
|
|
4954
|
+
"handoff_state": "accepted",
|
|
4955
|
+
"confidence": "medium",
|
|
4956
|
+
"missing_evidence": ["updated filing snapshot"],
|
|
4957
|
+
"next_recipient": "user",
|
|
4958
|
+
"next_action": "Inspect the saved synthesis report.",
|
|
4959
|
+
"blocked_actions": ["order_drafting", "approval", "execution"],
|
|
4960
|
+
"source_snapshot_ids": ["unit-test-filing"],
|
|
4961
|
+
"created_by": "head-manager",
|
|
4962
|
+
"export_path": "trading/reports/head-manager/synthesis-workflow-unit.md",
|
|
4963
|
+
})
|
|
4964
|
+
assert synthesis["export_path"] == "trading/reports/head-manager/synthesis-workflow-unit.md"
|
|
4965
|
+
synthesis_quality = json.loads(run(["./tcx", "quality-check", synthesis["export_path"], "--strict"], workspace).stdout)
|
|
4966
|
+
assert synthesis_quality["status"] == "pass"
|
|
4967
|
+
assert synthesis_quality["frontmatter"]["artifact_type"] == "synthesis_report"
|
|
4968
|
+
assert synthesis_quality["frontmatter"]["role"] == "head-manager"
|
|
4708
4969
|
run_card = create_evidence_run_card(workspace, {
|
|
4709
4970
|
"related_artifact_path": stored["export_path"],
|
|
4710
4971
|
"config_hash": "unit-config-hash",
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: tradingcodex
|
|
3
|
-
Version: 0.3.
|
|
3
|
+
Version: 0.3.3
|
|
4
4
|
Summary: Agentic investment workflow harness for Codex-native research and service-gated execution checks.
|
|
5
5
|
Author: TradingCodex Authors
|
|
6
6
|
License-Expression: Apache-2.0
|
|
@@ -229,7 +229,7 @@ provide investment recommendations or guarantee returns.
|
|
|
229
229
|
| Status | Milestone |
|
|
230
230
|
| --- | --- |
|
|
231
231
|
| Shipped | Generated Codex workspace, fixed role roster, project MCP config, Django service plane, local web dashboard, Admin, Ninja API, file-native research memory, component registry, policy/audit primitives. |
|
|
232
|
-
| Current `0.3.
|
|
232
|
+
| Current `0.3.3` | Flexible package/workspace update status, skipped-version Django migration smoke coverage, brief research chat replies with saved head-manager synthesis reports, Codex-native Decision Packages, independent judgment-review gate, staged workflow planning, artifact-supervisor loop closure state, Evidence Run/Validation Cards, provider capability profiles, and Python `>=3.11,<3.15` support. |
|
|
233
233
|
| Next | Deeper validation scenarios, richer provider capability profiles, stronger generated-workspace smoke coverage, and improved artifact quality tooling. |
|
|
234
234
|
| Future | Separately governed verified adapters, hosted/managed services, enterprise policy/compliance packs, and broker-specific live providers only after explicit product, policy, adapter, and validation work. |
|
|
235
235
|
|