tradingcodex 1.0.1__tar.gz → 1.0.2__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-1.0.1 → tradingcodex-1.0.2}/CHANGELOG.md +15 -0
- {tradingcodex-1.0.1/tradingcodex.egg-info → tradingcodex-1.0.2}/PKG-INFO +1 -1
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/docs/deployment.md +24 -15
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/docs/generated-workspaces.md +9 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/docs/release-readiness.md +40 -32
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/installation.md +8 -0
- tradingcodex-1.0.2/tests/test_guidebook_contract.py +71 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tests/test_platform_runtime.py +60 -5
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tests/test_release_contract.py +22 -11
- {tradingcodex-1.0.1 → tradingcodex-1.0.2/tradingcodex.egg-info}/PKG-INFO +1 -1
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex.egg-info/SOURCES.txt +1 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex_cli/commands/bootstrap.py +46 -1
- tradingcodex-1.0.2/tradingcodex_service/version.py +1 -0
- tradingcodex-1.0.1/tradingcodex_service/version.py +0 -1
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/CONTRIBUTING.md +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/LICENSE +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/MANIFEST.in +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/NOTICE +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/README.md +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/TRADEMARKS.md +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/apps/__init__.py +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/apps/audit/__init__.py +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/apps/audit/admin.py +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/apps/audit/apps.py +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/apps/audit/migrations/0001_v1_initial.py +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/apps/audit/migrations/__init__.py +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/apps/audit/models.py +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/apps/harness/__init__.py +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/apps/harness/admin.py +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/apps/harness/apps.py +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/apps/harness/migrations/0001_v1_initial.py +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/apps/harness/migrations/__init__.py +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/apps/harness/models.py +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/apps/harness/templatetags/__init__.py +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/apps/integrations/__init__.py +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/apps/integrations/admin.py +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/apps/integrations/apps.py +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/apps/integrations/migrations/0001_v1_initial.py +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/apps/integrations/migrations/__init__.py +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/apps/integrations/models.py +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/apps/mcp/__init__.py +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/apps/mcp/admin.py +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/apps/mcp/apps.py +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/apps/mcp/migrations/0001_v1_initial.py +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/apps/mcp/migrations/__init__.py +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/apps/mcp/models.py +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/apps/mcp/services.py +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/apps/orders/__init__.py +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/apps/orders/admin.py +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/apps/orders/apps.py +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/apps/orders/migrations/0001_v1_initial.py +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/apps/orders/migrations/__init__.py +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/apps/orders/models.py +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/apps/orders/services.py +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/apps/policy/__init__.py +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/apps/policy/admin.py +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/apps/policy/apps.py +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/apps/policy/migrations/0001_v1_initial.py +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/apps/policy/migrations/__init__.py +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/apps/policy/models.py +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/apps/policy/services.py +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/apps/portfolio/__init__.py +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/apps/portfolio/admin.py +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/apps/portfolio/apps.py +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/apps/portfolio/migrations/0001_v1_initial.py +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/apps/portfolio/migrations/__init__.py +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/apps/portfolio/models.py +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/assets/tradingcodex-banner.svg +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/docs/README.md +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/docs/codex-native-orchestration.md +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/docs/components.md +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/docs/core-concepts-and-rules.md +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/docs/decision-memory.md +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/docs/execution-without-subagent-plan.md +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/docs/financial-workflow-references.md +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/docs/guardrails.md +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/docs/harness.md +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/docs/improvement-loop.md +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/docs/interfaces-and-surfaces.md +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/docs/investment-brain-plugins.md +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/docs/licensing-and-commercialization.md +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/docs/product-direction.md +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/docs/research-memory-and-artifacts.md +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/docs/roles-skills-and-workflows.md +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/docs/safety-policy-and-execution.md +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/docs/system-architecture.md +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/docs/user-facing-skills.md +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/docs/validation-and-test-plan.md +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/frontend/index.html +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/frontend/package-lock.json +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/frontend/package.json +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/frontend/src/App.tsx +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/frontend/src/api.ts +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/frontend/src/domain.ts +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/frontend/src/features/LibraryPage.tsx +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/frontend/src/features/SkillsPage.tsx +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/frontend/src/features/SystemPage.tsx +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/frontend/src/main.tsx +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/frontend/src/navigation.js +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/frontend/src/navigation.test.js +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/frontend/src/styles.css +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/frontend/src/ui.tsx +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/frontend/src/viewer-data.js +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/frontend/tsconfig.json +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/frontend/vite.config.ts +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/install.sh +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/pyproject.toml +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/setup.cfg +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tests/test_artifact_authentication.py +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tests/test_brain_skill.py +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tests/test_broker_center_prd.py +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tests/test_build_contract_metadata.py +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tests/test_build_hook.py +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tests/test_build_turn_grant.py +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tests/test_clean_v1_cli_audit.py +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tests/test_codex_cli_compat.py +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tests/test_codex_cli_contract.py +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tests/test_codex_native_orchestration.py +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tests/test_dashboard_skill.py +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tests/test_decision_memory_core.py +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tests/test_dev_bootstrap.py +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tests/test_dynamic_artifact_quality.py +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tests/test_e2e_user_scenarios.py +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tests/test_evaluation_lab_hardening.py +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tests/test_evaluation_profiles.py +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tests/test_investment_analysis.py +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tests/test_investment_brain_cli.py +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tests/test_investment_brain_prompt_layers.py +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tests/test_investment_brain_provenance.py +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tests/test_investment_brain_registry.py +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tests/test_investor_context.py +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tests/test_mcp_broker_release_health.py +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tests/test_mcp_operator_authority.py +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tests/test_native_execution_gateway.py +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tests/test_order_turn_grant.py +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tests/test_provider_source_approval.py +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tests/test_research_forecast_surfaces.py +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tests/test_research_spec_profiles.py +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tests/test_runtime_paths.py +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tests/test_runtime_profile.py +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tests/test_security_invariants.py +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tests/test_skill_runtime_boundaries.py +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tests/test_source_snapshot_agent_contract.py +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tests/test_v1_migrations.py +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tests/test_v1_state_integrity.py +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tests/test_viewer.py +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tests/test_workspace_git_contract.py +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex.egg-info/dependency_links.txt +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex.egg-info/entry_points.txt +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex.egg-info/requires.txt +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex.egg-info/top_level.txt +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex_cli/__init__.py +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex_cli/__main__.py +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex_cli/commands/__init__.py +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex_cli/commands/build.py +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex_cli/commands/connectors.py +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex_cli/commands/db.py +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex_cli/commands/decision.py +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex_cli/commands/doctor.py +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex_cli/commands/evaluation.py +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex_cli/commands/forecast.py +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex_cli/commands/home.py +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex_cli/commands/investment_brains.py +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex_cli/commands/investor_context.py +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex_cli/commands/mcp.py +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex_cli/commands/mode.py +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex_cli/commands/orders.py +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex_cli/commands/policy.py +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex_cli/commands/profile.py +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex_cli/commands/research.py +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex_cli/commands/skills.py +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex_cli/commands/strategies.py +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex_cli/commands/subagents.py +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex_cli/commands/utils.py +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex_cli/commands/workflow.py +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex_cli/commands/workspaces.py +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex_cli/generator.py +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex_cli/mcp_stdio.py +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex_cli/package_source.py +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex_cli/service_autostart.py +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex_cli/startup_status.py +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex_cli/versioning.py +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex_service/__init__.py +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex_service/admin.py +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex_service/api.py +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex_service/application/__init__.py +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex_service/application/agents.py +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex_service/application/analysis_runs.py +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex_service/application/artifact_bindings.py +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex_service/application/artifact_quality.py +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex_service/application/audit.py +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex_service/application/brokers.py +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex_service/application/build_gateway.py +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex_service/application/common.py +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex_service/application/components.py +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex_service/application/context_budget.py +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex_service/application/customization.py +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex_service/application/decision_packages.py +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex_service/application/evaluation_lab.py +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex_service/application/execution_gateway.py +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex_service/application/forecasting.py +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex_service/application/git_subprocess.py +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex_service/application/harness.py +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex_service/application/health.py +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex_service/application/investment_analysis.py +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex_service/application/investment_brains.py +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex_service/application/investor_context.py +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex_service/application/markdown_preview.py +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex_service/application/operator_authority.py +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex_service/application/orders.py +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex_service/application/policy.py +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex_service/application/portfolio.py +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex_service/application/postmortems.py +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex_service/application/research.py +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex_service/application/research_specs.py +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex_service/application/runtime.py +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex_service/application/runtime_mode.py +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex_service/application/source_snapshots.py +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex_service/application/viewer.py +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex_service/application/workspace_git.py +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex_service/application/workspaces.py +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex_service/asgi.py +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex_service/log_safety.py +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex_service/mcp_runtime.py +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex_service/runtime_profile.py +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex_service/settings.py +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex_service/static/tradingcodex_admin/favicon.svg +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex_service/static/tradingcodex_web/assets/index-CFoXYUtq.js +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex_service/static/tradingcodex_web/assets/index-DYzj_xRR.css +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex_service/static/tradingcodex_web/index.html +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex_service/urls.py +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex_service/viewer_api.py +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex_service/web.py +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex_service/wsgi.py +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/__init__.py +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/audit/files/.tradingcodex/audit/README.md +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/audit/files/trading/audit/.gitkeep +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/audit/module.json +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/codex-base/files/.codex/config.toml +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/codex-base/files/.codex/hooks/tradingcodex_hook.py +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/codex-base/files/.codex/hooks.json +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/codex-base/files/.codex/prompts/base_instructions/head-manager.md +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/codex-base/files/.codex/rules/tradingcodex.rules +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/codex-base/files/.tradingcodex/cli.py +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/codex-base/files/.tradingcodex/config.yaml +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/codex-base/files/AGENTS.md +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/codex-base/files/pyproject.toml +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/codex-base/files/tcx +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/codex-base/files/tcx.cmd +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/codex-base/module.json +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/policies/restricted-list.yaml +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/schemas/approval_receipt.schema.json +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/schemas/audit_event.schema.json +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/schemas/evidence_pack.schema.json +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/schemas/execution_result.schema.json +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/schemas/fundamental_report.schema.json +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/schemas/news_report.schema.json +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/schemas/order_ticket.schema.json +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/schemas/portfolio_review.schema.json +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/schemas/postmortem_report.schema.json +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/schemas/research_artifact.schema.json +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/schemas/risk_report.schema.json +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/schemas/technical_report.schema.json +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/schemas/thesis.schema.json +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/schemas/valuation.schema.json +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/enforcement-guardrails/module.json +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/fixed-subagents/files/.codex/agents/fundamental-analyst.toml +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/fixed-subagents/files/.codex/agents/instrument-analyst.toml +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/fixed-subagents/files/.codex/agents/judgment-reviewer.toml +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/fixed-subagents/files/.codex/agents/macro-analyst.toml +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/fixed-subagents/files/.codex/agents/news-analyst.toml +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/fixed-subagents/files/.codex/agents/portfolio-manager.toml +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/fixed-subagents/files/.codex/agents/risk-manager.toml +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/fixed-subagents/files/.codex/agents/technical-analyst.toml +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/fixed-subagents/files/.codex/agents/valuation-analyst.toml +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/fixed-subagents/files/.tradingcodex/mainagent/skill-change-proposals/.gitkeep +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/fixed-subagents/module.json +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/guidance-guardrails/files/.tradingcodex/guidance/guardrails.md +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/guidance-guardrails/files/.tradingcodex/guidance/task-quality-checklist.md +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/guidance-guardrails/module.json +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/information-barriers/files/.tradingcodex/secrets.md +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/information-barriers/files/trading/forecasts/.gitkeep +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/information-barriers/files/trading/market-data/.gitkeep +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/information-barriers/files/trading/portfolio/.gitkeep +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/information-barriers/files/trading/reports/fundamental/.gitkeep +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/information-barriers/files/trading/reports/instrument/.gitkeep +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/information-barriers/files/trading/reports/macro/.gitkeep +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/information-barriers/files/trading/reports/news/.gitkeep +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/information-barriers/files/trading/reports/policy/.gitkeep +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/information-barriers/files/trading/reports/portfolio/.gitkeep +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/information-barriers/files/trading/reports/postmortem/.gitkeep +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/information-barriers/files/trading/reports/risk/.gitkeep +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/information-barriers/files/trading/reports/technical/.gitkeep +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/information-barriers/files/trading/reports/valuation/.gitkeep +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/information-barriers/files/trading/research/.gitkeep +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/information-barriers/module.json +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/paper-trading/module.json +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/repo-skills/files/.agents/skills/tcx-automate/SKILL.md +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/repo-skills/files/.agents/skills/tcx-automate/agents/openai.yaml +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/repo-skills/files/.agents/skills/tcx-brain/SKILL.md +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/repo-skills/files/.agents/skills/tcx-brain/agents/openai.yaml +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/repo-skills/files/.agents/skills/tcx-brain/references/bundle-contract.md +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/repo-skills/files/.agents/skills/tcx-build/SKILL.md +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/repo-skills/files/.agents/skills/tcx-build/agents/openai.yaml +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/repo-skills/files/.agents/skills/tcx-dashboard/SKILL.md +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/repo-skills/files/.agents/skills/tcx-dashboard/agents/openai.yaml +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/repo-skills/files/.agents/skills/tcx-investor-context/SKILL.md +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/repo-skills/files/.agents/skills/tcx-investor-context/agents/openai.yaml +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/repo-skills/files/.agents/skills/tcx-memory/SKILL.md +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/repo-skills/files/.agents/skills/tcx-memory/agents/openai.yaml +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/repo-skills/files/.agents/skills/tcx-order-allow/SKILL.md +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/repo-skills/files/.agents/skills/tcx-order-allow/agents/openai.yaml +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/repo-skills/files/.agents/skills/tcx-order-cancel/SKILL.md +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/repo-skills/files/.agents/skills/tcx-order-cancel/agents/openai.yaml +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/repo-skills/files/.agents/skills/tcx-order-submit/SKILL.md +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/repo-skills/files/.agents/skills/tcx-order-submit/agents/openai.yaml +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/repo-skills/files/.agents/skills/tcx-plan/SKILL.md +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/repo-skills/files/.agents/skills/tcx-plan/agents/openai.yaml +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/repo-skills/files/.agents/skills/tcx-server/SKILL.md +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/repo-skills/files/.agents/skills/tcx-server/agents/openai.yaml +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/repo-skills/files/.agents/skills/tcx-strategy/SKILL.md +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/repo-skills/files/.agents/skills/tcx-strategy/agents/openai.yaml +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/repo-skills/files/.agents/skills/tcx-workflow/SKILL.md +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/repo-skills/files/.agents/skills/tcx-workflow/agents/openai.yaml +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/repo-skills/files/.agents/skills/tcx-workflow/references/context-and-override.md +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/repo-skills/files/.agents/skills/tcx-workflow/references/decision-quality-spine.md +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/fundamental-analyst/tcx-fundamental/SKILL.md +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/fundamental-analyst/tcx-fundamental/agents/openai.yaml +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/instrument-analyst/tcx-instrument/SKILL.md +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/instrument-analyst/tcx-instrument/agents/openai.yaml +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/judgment-reviewer/tcx-judgment/SKILL.md +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/judgment-reviewer/tcx-judgment/agents/openai.yaml +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/macro-analyst/tcx-macro/SKILL.md +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/macro-analyst/tcx-macro/agents/openai.yaml +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/news-analyst/tcx-news/SKILL.md +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/news-analyst/tcx-news/agents/openai.yaml +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/portfolio-manager/tcx-order-draft/SKILL.md +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/portfolio-manager/tcx-order-draft/agents/openai.yaml +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/portfolio-manager/tcx-portfolio/SKILL.md +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/portfolio-manager/tcx-portfolio/agents/openai.yaml +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/risk-manager/tcx-order-approve/SKILL.md +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/risk-manager/tcx-order-approve/agents/openai.yaml +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/risk-manager/tcx-policy/SKILL.md +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/risk-manager/tcx-policy/agents/openai.yaml +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/risk-manager/tcx-risk/SKILL.md +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/risk-manager/tcx-risk/agents/openai.yaml +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/shared/tcx-anti-overfit/SKILL.md +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/shared/tcx-anti-overfit/agents/openai.yaml +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/shared/tcx-artifact/SKILL.md +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/shared/tcx-artifact/agents/openai.yaml +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/shared/tcx-data-qc/SKILL.md +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/shared/tcx-data-qc/agents/openai.yaml +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/shared/tcx-evidence/SKILL.md +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/shared/tcx-evidence/agents/openai.yaml +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/shared/tcx-forecast/SKILL.md +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/shared/tcx-forecast/agents/openai.yaml +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/shared/tcx-scenarios/SKILL.md +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/shared/tcx-scenarios/agents/openai.yaml +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/shared/tcx-source-gate/SKILL.md +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/shared/tcx-source-gate/agents/openai.yaml +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/technical-analyst/tcx-technical/SKILL.md +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/technical-analyst/tcx-technical/agents/openai.yaml +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/valuation-analyst/tcx-valuation/SKILL.md +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/valuation-analyst/tcx-valuation/agents/openai.yaml +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/repo-skills/module.json +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/tradingcodex-mcp/files/.tradingcodex/mcp/enforcer/README.md +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/tradingcodex-mcp/files/.tradingcodex/mcp/gateway/README.md +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/tradingcodex-mcp/files/.tradingcodex/mcp/server.py +0 -0
- {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/tradingcodex-mcp/module.json +0 -0
|
@@ -2,6 +2,21 @@
|
|
|
2
2
|
|
|
3
3
|
## Unreleased
|
|
4
4
|
|
|
5
|
+
## 1.0.2 - 2026-07-15
|
|
6
|
+
|
|
7
|
+
- Preserve an attached release workspace's explicit `TRADINGCODEX_HOME`,
|
|
8
|
+
explicit database override, and projected service address when an update is
|
|
9
|
+
launched through `uvx` instead of the generated wrapper. This prevents a
|
|
10
|
+
custom or isolated v1.0.0 workspace from silently switching to the platform
|
|
11
|
+
default ledger during a package refresh.
|
|
12
|
+
- Fix the public guide's full-width desktop grid so viewport gutters no longer
|
|
13
|
+
collapse the reading column, and align the provider-to-order header with the
|
|
14
|
+
primary Guide/Reference/GitHub navigation. Add route, fragment, mobile-menu,
|
|
15
|
+
and desktop-layout contract tests.
|
|
16
|
+
- Reduce hosted automation usage: normal CI, GitHub Pages deployment, and
|
|
17
|
+
release verification now use one job each; PyPI publication adds only its
|
|
18
|
+
protected upload job. Guide-only pushes skip the source CI workflow.
|
|
19
|
+
|
|
5
20
|
## 1.0.1 - 2026-07-15
|
|
6
21
|
|
|
7
22
|
- Add the shared `tcx-artifact` skill to all nine producing fixed roles so
|
|
@@ -109,8 +109,12 @@ files are never replaced.
|
|
|
109
109
|
|
|
110
110
|
## Maintainer Prerequisites
|
|
111
111
|
|
|
112
|
-
Release verification uses Python 3.11 and Node 22
|
|
113
|
-
|
|
112
|
+
Release verification uses Python 3.11 and Node 22. The hosted CI budget runs
|
|
113
|
+
the complete source, frontend, and package gates once on Python 3.11 instead
|
|
114
|
+
of multiplying every push across the supported Python range and native
|
|
115
|
+
platforms. Maintainers run additional supported-version or native-platform
|
|
116
|
+
checks locally or through an explicit temporary/manual workflow when a change
|
|
117
|
+
touches compatibility-sensitive code. Node is a maintainer-only build
|
|
114
118
|
dependency.
|
|
115
119
|
|
|
116
120
|
Configure PyPI Trusted Publishing for:
|
|
@@ -159,9 +163,11 @@ also require the disposable-workspace and Codex-native checks documented in
|
|
|
159
163
|
|
|
160
164
|
## CI And Release Automation
|
|
161
165
|
|
|
162
|
-
`.github/workflows/ci.yml` is test-only.
|
|
163
|
-
|
|
164
|
-
|
|
166
|
+
`.github/workflows/ci.yml` is test-only. One Ubuntu/Python 3.11 job runs the
|
|
167
|
+
frontend build, complete Python suite and framework gates, clean package
|
|
168
|
+
construction, and the wheel smoke. Guide-only pushes skip this workflow because
|
|
169
|
+
the Pages workflow validates and deploys only static guide files. CI never
|
|
170
|
+
publishes.
|
|
165
171
|
|
|
166
172
|
`.github/workflows/release.yml` is manual-only. Every run requires an explicit
|
|
167
173
|
`release_version`. A dry run may build from any selected ref with
|
|
@@ -174,11 +180,13 @@ macOS and Windows wheel smokes. It never publishes.
|
|
|
174
180
|
- the tagged commit is on `origin/main`
|
|
175
181
|
- the wheel and source-distribution filenames carry the same version
|
|
176
182
|
- the built wheel passes the Ubuntu smoke
|
|
177
|
-
- the exact uploaded artifact passes native macOS and Windows smokes
|
|
178
183
|
- the protected `pypi` environment approves Trusted Publishing
|
|
179
184
|
|
|
180
|
-
The
|
|
181
|
-
|
|
185
|
+
The release workflow has one build/verification job. When publication is
|
|
186
|
+
requested, one protected PyPI job downloads that exact artifact and uploads it;
|
|
187
|
+
no job rebuilds the distribution after verification. Native macOS and Windows
|
|
188
|
+
release smokes are local or explicitly scheduled maintainer gates rather than
|
|
189
|
+
automatic jobs on every release.
|
|
182
190
|
|
|
183
191
|
## User Guide Pages
|
|
184
192
|
|
|
@@ -189,10 +197,10 @@ prompts, workspace viewing, reusable skills, and everyday recovery. The detailed
|
|
|
189
197
|
product rules remain canonical in `README.md`, `installation.md`, and `docs/`;
|
|
190
198
|
the guide links back to those sources rather than replacing them.
|
|
191
199
|
|
|
192
|
-
`.github/workflows/deploy-user-guide.yml`
|
|
193
|
-
|
|
194
|
-
It can also be run manually. It does not build or
|
|
195
|
-
the Django service, or a production Node runtime.
|
|
200
|
+
`.github/workflows/deploy-user-guide.yml` uses one job to configure, upload,
|
|
201
|
+
and deploy only `guidebook/` to GitHub Pages after a push to `main` that changes
|
|
202
|
+
the guide or its workflow. It can also be run manually. It does not build or
|
|
203
|
+
deploy the Python package, the Django service, or a production Node runtime.
|
|
196
204
|
|
|
197
205
|
GitHub Pages is configured to use **GitHub Actions** as its publishing source.
|
|
198
206
|
The guide for this repository is published at
|
|
@@ -214,8 +222,9 @@ The guide for this repository is published at
|
|
|
214
222
|
```
|
|
215
223
|
|
|
216
224
|
5. In GitHub Actions, run `Manual Release` from that tag with the exact
|
|
217
|
-
`release_version`. Use `publish_pypi=
|
|
218
|
-
`publish_pypi=
|
|
225
|
+
`release_version`. Use `publish_pypi=true` for an approved publication; use
|
|
226
|
+
the optional `publish_pypi=false` rehearsal when release risk warrants an
|
|
227
|
+
additional hosted build.
|
|
219
228
|
|
|
220
229
|
Pushing a branch or tag does not publish by itself.
|
|
221
230
|
|
|
@@ -252,7 +261,7 @@ sh "$SOURCE_ROOT/install.sh" \
|
|
|
252
261
|
On native Windows PowerShell:
|
|
253
262
|
|
|
254
263
|
```powershell
|
|
255
|
-
$ReleaseVersion = "1.0.
|
|
264
|
+
$ReleaseVersion = "1.0.2"
|
|
256
265
|
$Workspace = Join-Path $env:TEMP "tcx-pypi-$ReleaseVersion"
|
|
257
266
|
New-Item -ItemType Directory -Force $Workspace | Out-Null
|
|
258
267
|
Set-Location $Workspace
|
|
@@ -1212,6 +1212,15 @@ service address projected by the launcher. Explicit process environment values s
|
|
|
1212
1212
|
doctor then validates both home and DB projection and requires update when the
|
|
1213
1213
|
generated ledger contract is stale.
|
|
1214
1214
|
|
|
1215
|
+
An index/package-runner update such as `uvx --refresh --from tradingcodex tcx
|
|
1216
|
+
update . --from tradingcodex` does not pass through the generated wrapper.
|
|
1217
|
+
Before regeneration, update therefore restores a validated workspace's
|
|
1218
|
+
recorded explicit home and DB override plus the service address from its
|
|
1219
|
+
generated project MCP configuration. It does not pin a recorded
|
|
1220
|
+
`platform_default` absolute path, so a copied workspace can resolve the native
|
|
1221
|
+
default on its destination platform. A new explicit process value remains the
|
|
1222
|
+
only implicit-free way to select a different runtime identity.
|
|
1223
|
+
|
|
1215
1224
|
TOML, YAML, JSON, POSIX shell, CMD, and Python values are serialized with
|
|
1216
1225
|
format-specific literals. This is required for macOS paths with spaces and
|
|
1217
1226
|
Windows drive-letter/backslash paths. Generated code/config uses LF line
|
|
@@ -1,15 +1,14 @@
|
|
|
1
|
-
# TradingCodex 1.0.
|
|
1
|
+
# TradingCodex 1.0.2 Release Status
|
|
2
2
|
|
|
3
3
|
Status: local source, frontend, disposable native workflow, and exact
|
|
4
|
-
distribution gates complete; candidate CI, tag
|
|
5
|
-
publication remain pending
|
|
4
|
+
distribution gates complete; candidate CI, tag, and publication remain pending
|
|
6
5
|
Updated: 2026-07-15
|
|
7
6
|
|
|
8
|
-
This page records the current `1.0.
|
|
7
|
+
This page records the current `1.0.2` release state. It is not an implementation
|
|
9
8
|
roadmap and does not treat source changes as proof that an exact distribution
|
|
10
9
|
artifact or public release has passed its gates.
|
|
11
10
|
|
|
12
|
-
## v1.0.
|
|
11
|
+
## v1.0.2 Contract
|
|
13
12
|
|
|
14
13
|
- `tradingcodex_service/version.py` is the single version source for package
|
|
15
14
|
metadata, `tcx --version`, generated workspaces, release input, and tags.
|
|
@@ -26,37 +25,44 @@ artifact or public release has passed its gates.
|
|
|
26
25
|
requires an installed provider plus every documented safety gate.
|
|
27
26
|
- The React viewer is a committed static build served by Django and
|
|
28
27
|
WhiteNoise; Node remains a maintainer-only build dependency.
|
|
29
|
-
-
|
|
30
|
-
|
|
28
|
+
- Package-runner updates preserve validated explicit home, database, and
|
|
29
|
+
service-address identity unless the operator supplies a replacement.
|
|
30
|
+
- PyPI publication is manual and tag-bound. Hosted automation uses one full CI
|
|
31
|
+
job, one Pages job, and one release build job; publication adds only the
|
|
32
|
+
protected artifact-upload job.
|
|
31
33
|
|
|
32
34
|
## Current Readiness
|
|
33
35
|
|
|
34
36
|
| Area | Current state | Evidence or remaining gate |
|
|
35
37
|
| --- | --- | --- |
|
|
36
|
-
| Version identity | Verified in the working tree | `TRADINGCODEX_VERSION` is `1.0.
|
|
38
|
+
| Version identity | Verified in the working tree | `TRADINGCODEX_VERSION` is `1.0.2`; `pyproject.toml` reads it dynamically; `tcx --version` uses the same source. |
|
|
37
39
|
| Schema baseline | Verified in the working tree | Project apps contain only `0001_v1_initial`; migration-graph and model-state checks live in `tests/test_v1_migrations.py`. |
|
|
38
|
-
| Workspace baseline | Exact candidate
|
|
40
|
+
| Workspace baseline | Exact candidate update acceptance passes locally | A disposable explicit-home/explicit-DB workspace updated through a package-runner-style process with those paths and its custom service address preserved. Prior v1.0.1 native role/artifact acceptance remains the unchanged harness baseline. |
|
|
39
41
|
| Interfaces and safety | Full local candidate suite passes | MCP schema, lifecycle-error, skill-projection, resource-template discovery, Codex-version, forecast receipt-time, Django, migration, compile, and full test gates pass. |
|
|
40
|
-
| Frontend | Viewer
|
|
41
|
-
| Release automation | Structurally verified |
|
|
42
|
-
| Distribution artifacts | Exact local candidate passes | Fresh `1.0.
|
|
43
|
-
| Git tag and PyPI | Not performed by this status |
|
|
42
|
+
| Frontend and guidebook | Viewer and guide browser acceptance pass | Ten viewer tests and deterministic build pass. The guide passes local route/fragment checks, 1920px layout with a 768px reading column, consistent provider navigation, and real 390px mobile menu routing without horizontal overflow. |
|
|
43
|
+
| Release automation | Structurally verified | Contract tests enforce one normal CI job, one Pages deploy job, and one release build plus optional protected publication job. A dry-run rehearsal remains available when release risk warrants the extra hosted run. |
|
|
44
|
+
| Distribution artifacts | Exact local candidate passes | Fresh `1.0.2` sdist/wheel, `twine check`, and isolated packaged-wheel smoke passed on macOS. |
|
|
45
|
+
| Git tag and PyPI | Not performed by this status | Main CI, annotated `v1.0.2` tag, protected-environment approval, and manual publication remain release-operator actions. |
|
|
44
46
|
| Post-publish verification | Blocked on publication | Exact-version POSIX and native Windows attach/doctor smokes run only after PyPI contains the immutable artifacts. |
|
|
45
47
|
|
|
46
48
|
Release-branch status describes candidate source shape, not release sign-off.
|
|
47
49
|
The merged commit and exact uploaded artifacts remain authoritative.
|
|
48
50
|
|
|
49
|
-
The local v1.0.
|
|
51
|
+
The local v1.0.2 candidate evidence recorded on 2026-07-15 is:
|
|
50
52
|
|
|
51
|
-
-
|
|
52
|
-
|
|
53
|
+
- The first full suite found six stale next-version fixtures after the version
|
|
54
|
+
bump; after correcting those fixtures, the final full-suite rerun reported
|
|
55
|
+
**624 passed** with three existing Pydantic deprecation warnings.
|
|
53
56
|
- `python3.11 manage.py check`, migration dry-run, compile pass, skill
|
|
54
57
|
validation, JSON-schema validation, and diff checks: passed.
|
|
55
58
|
- `npm ci --prefix frontend`, the ten-test frontend suite, typecheck/build, and
|
|
56
59
|
deterministic committed-asset comparison: passed.
|
|
57
|
-
- A
|
|
58
|
-
|
|
59
|
-
|
|
60
|
+
- A package-runner-style update smoke preserved an explicit home, explicit DB,
|
|
61
|
+
and custom loopback service address while moving the workspace runtime to
|
|
62
|
+
`1.0.2`.
|
|
63
|
+
- Fresh `1.0.2` source and wheel distributions passed `twine check`; an
|
|
64
|
+
isolated macOS wheel install reported runtime version `1.0.2` and completed
|
|
65
|
+
the native platform smoke with a user-home path containing spaces.
|
|
60
66
|
- A fresh generated development workspace passed `tcx doctor` and the strict
|
|
61
67
|
current-reference Codex CLI contract, including all eight trusted hooks.
|
|
62
68
|
- Native artifact persistence completed with one exact
|
|
@@ -74,8 +80,8 @@ The local v1.0.1 candidate evidence recorded on 2026-07-15 is:
|
|
|
74
80
|
deferred MCP proof path.
|
|
75
81
|
|
|
76
82
|
The v1.0.0 baseline evidence recorded on 2026-07-15 is listed below. It does
|
|
77
|
-
not substitute for v1.0.
|
|
78
|
-
tag-bound
|
|
83
|
+
not substitute for v1.0.2 validation, CI on the candidate commit, or the
|
|
84
|
+
tag-bound verification of the immutable patch artifacts:
|
|
79
85
|
|
|
80
86
|
- GitHub Actions [CI run 29403737708](https://github.com/monarchjuno/tradingcodex/actions/runs/29403737708)
|
|
81
87
|
passed on release-branch commit `12649b0`: the safety and financial invariant
|
|
@@ -195,8 +201,9 @@ and created no child event, role artifact, or synthesis.
|
|
|
195
201
|
|
|
196
202
|
This is release-branch evidence. The candidate is ready to merge, but the
|
|
197
203
|
release remains not ready to tag until the merged commit passes GitHub CI. The
|
|
198
|
-
|
|
199
|
-
|
|
204
|
+
tag-bound release build must verify the immutable artifacts before its optional
|
|
205
|
+
protected publication job can run. Use the separate `publish_pypi=false`
|
|
206
|
+
rehearsal when release risk warrants another hosted run.
|
|
200
207
|
|
|
201
208
|
### Workspace viewer browser acceptance
|
|
202
209
|
|
|
@@ -243,22 +250,23 @@ python3.11 -m twine check dist/*
|
|
|
243
250
|
python3.11 tests/platform_wheel_smoke.py --wheel-dir dist
|
|
244
251
|
```
|
|
245
252
|
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
253
|
+
The hosted release build validates the exact uploaded artifact on Ubuntu.
|
|
254
|
+
Compatibility-sensitive native macOS, Windows, or alternate-Python checks are
|
|
255
|
+
local or explicitly scheduled maintainer gates instead of default jobs. The
|
|
256
|
+
protected `pypi` environment and Trusted Publisher configuration must be
|
|
257
|
+
reviewed before publication.
|
|
249
258
|
|
|
250
259
|
## Tag And Publication State
|
|
251
260
|
|
|
252
261
|
This document does not assert that the final commit is on `main`, CI is green,
|
|
253
|
-
the tag exists, or PyPI contains `1.0.
|
|
262
|
+
the tag exists, or PyPI contains `1.0.2`. After every final-commit and artifact
|
|
254
263
|
gate passes:
|
|
255
264
|
|
|
256
265
|
1. Merge the release commit to `main` and wait for CI.
|
|
257
|
-
2. Create and push the annotated tag `v1.0.
|
|
258
|
-
3.
|
|
259
|
-
`release_version=1.0.
|
|
260
|
-
4. With protected-environment approval, run the
|
|
261
|
-
`publish_pypi=true`.
|
|
266
|
+
2. Create and push the annotated tag `v1.0.2` at that commit.
|
|
267
|
+
3. When release risk warrants the extra hosted run, rehearse with
|
|
268
|
+
`publish_pypi=false` and `release_version=1.0.2`.
|
|
269
|
+
4. With protected-environment approval, run the tag with `publish_pypi=true`.
|
|
262
270
|
5. Verify the immutable PyPI files, release notes, and exact-version POSIX and
|
|
263
271
|
native Windows attach/doctor flows.
|
|
264
272
|
|
|
@@ -227,6 +227,14 @@ uvx --refresh --from tradingcodex tcx update . --from tradingcodex
|
|
|
227
227
|
refreshes generated indexes, applies central DB migrations, records workspace
|
|
228
228
|
provenance, and runs `./tcx doctor` unless `--no-doctor` is passed.
|
|
229
229
|
|
|
230
|
+
When the package refresh is launched directly through `uvx`, the updater also
|
|
231
|
+
restores an existing explicit `TRADINGCODEX_HOME`, explicit
|
|
232
|
+
`TRADINGCODEX_DB_NAME`, and projected loopback service address from the
|
|
233
|
+
validated workspace before regeneration. Explicit environment values on the
|
|
234
|
+
new update command still win, so a deliberate runtime move remains possible.
|
|
235
|
+
Platform-default homes are resolved again on the destination platform rather
|
|
236
|
+
than pinning an absolute path from a copied workspace.
|
|
237
|
+
|
|
230
238
|
Inside a generated Codex workspace, the default `trading-research` profile and
|
|
231
239
|
Plan mode cannot run workspace updates because update rewrites protected `.codex`
|
|
232
240
|
prompt/config/hook surfaces. Research may still create and edit ordinary
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import re
|
|
4
|
+
from pathlib import Path
|
|
5
|
+
from urllib.parse import unquote, urlsplit
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
ROOT = Path(__file__).resolve().parents[1]
|
|
9
|
+
GUIDEBOOK = ROOT / "guidebook"
|
|
10
|
+
HREF_RE = re.compile(r'href="([^"]+)"')
|
|
11
|
+
ID_RE = re.compile(r'id="([^"]+)"')
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
def _html(path: Path) -> str:
|
|
15
|
+
return path.read_text(encoding="utf-8")
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def test_guidebook_local_routes_and_fragments_resolve() -> None:
|
|
19
|
+
pages = sorted(GUIDEBOOK.glob("*.html"))
|
|
20
|
+
known_fragments = {
|
|
21
|
+
page.resolve(): set(ID_RE.findall(_html(page)))
|
|
22
|
+
for page in pages
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
for page in pages:
|
|
26
|
+
for raw_href in HREF_RE.findall(_html(page)):
|
|
27
|
+
parsed = urlsplit(raw_href)
|
|
28
|
+
if parsed.scheme or parsed.netloc or raw_href.startswith(("mailto:", "tel:")):
|
|
29
|
+
continue
|
|
30
|
+
target = page if not parsed.path else (page.parent / unquote(parsed.path)).resolve()
|
|
31
|
+
assert target.exists(), f"{page.name}: missing route {raw_href}"
|
|
32
|
+
if parsed.fragment and target.suffix == ".html":
|
|
33
|
+
assert parsed.fragment in known_fragments[target], (
|
|
34
|
+
f"{page.name}: missing fragment {raw_href}"
|
|
35
|
+
)
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
def test_provider_onboarding_uses_the_primary_guide_navigation() -> None:
|
|
39
|
+
page = _html(GUIDEBOOK / "provider-to-order.html")
|
|
40
|
+
header = page.split('<header class="global-header">', 1)[1].split("</header>", 1)[0]
|
|
41
|
+
assert re.findall(r">([^<>]+)</a>", header)[-3:] == ["Guide", "Reference", "GitHub"]
|
|
42
|
+
assert 'href="index.html" aria-current="page">Guide</a>' in header
|
|
43
|
+
assert 'href="https://github.com/monarchjuno/tradingcodex/tree/main/docs">Reference</a>' in header
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
def test_provider_mobile_menu_reaches_every_guide_section() -> None:
|
|
47
|
+
page = _html(GUIDEBOOK / "provider-to-order.html")
|
|
48
|
+
mobile = page.split('<details class="mobile-nav">', 1)[1].split("</details>", 1)[0]
|
|
49
|
+
assert HREF_RE.findall(mobile) == [
|
|
50
|
+
"index.html",
|
|
51
|
+
"dynamic-workflow.html",
|
|
52
|
+
"harness.html",
|
|
53
|
+
"decision-memory.html",
|
|
54
|
+
"reusable-context.html",
|
|
55
|
+
"execution-boundary.html",
|
|
56
|
+
"provider-to-order.html",
|
|
57
|
+
"skills.html",
|
|
58
|
+
"research.html",
|
|
59
|
+
"order.html",
|
|
60
|
+
"improve.html",
|
|
61
|
+
"customize.html",
|
|
62
|
+
"help-status.html",
|
|
63
|
+
]
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
def test_full_desktop_shell_does_not_double_count_viewport_gutters() -> None:
|
|
67
|
+
css = (GUIDEBOOK / "assets" / "site.css").read_text(encoding="utf-8")
|
|
68
|
+
shell_rule = css.split(".docs-shell {", 1)[1].split("}", 1)[0]
|
|
69
|
+
assert "max-width: 1460px" in shell_rule
|
|
70
|
+
assert "padding: 2.75rem 1.5rem" in shell_rule
|
|
71
|
+
assert "calc((100vw - 1460px) / 2)" not in shell_rule
|
|
@@ -786,7 +786,7 @@ def test_service_version_mismatch_never_exposes_explicit_local_source(
|
|
|
786
786
|
monkeypatch.setenv("TRADINGCODEX_MCP_PACKAGE_SPEC", str(local_source))
|
|
787
787
|
monkeypatch.setenv(PACKAGE_SOURCE_KIND_ENV, "local-explicit")
|
|
788
788
|
|
|
789
|
-
action = _version_mismatch_next_action("1.0.
|
|
789
|
+
action = _version_mismatch_next_action("1.0.3", "127.0.0.1:48267")
|
|
790
790
|
|
|
791
791
|
assert str(local_source) not in action
|
|
792
792
|
assert "<package-spec>" in action
|
|
@@ -859,7 +859,7 @@ def test_real_custom_source_attach_patch_update_and_same_version_refresh(
|
|
|
859
859
|
assert first_python.is_file()
|
|
860
860
|
|
|
861
861
|
version_path = source / "tradingcodex_service/version.py"
|
|
862
|
-
version_path.write_text('TRADINGCODEX_VERSION = "1.0.
|
|
862
|
+
version_path.write_text('TRADINGCODEX_VERSION = "1.0.3"\n', encoding="utf-8")
|
|
863
863
|
before_explicit_override = {
|
|
864
864
|
path: path.read_bytes()
|
|
865
865
|
for path in (
|
|
@@ -914,7 +914,7 @@ def test_real_custom_source_attach_patch_update_and_same_version_refresh(
|
|
|
914
914
|
lock = json.loads(
|
|
915
915
|
(workspace / ".tradingcodex/generated/module-lock.json").read_text(encoding="utf-8")
|
|
916
916
|
)
|
|
917
|
-
assert lock["tradingcodex_version"] == "1.0.
|
|
917
|
+
assert lock["tradingcodex_version"] == "1.0.3"
|
|
918
918
|
assert lock["tradingcodex_package_spec"] == LOCAL_EXECUTABLE_SOURCE_PROVENANCE
|
|
919
919
|
|
|
920
920
|
main_path = source / "tradingcodex_cli/__main__.py"
|
|
@@ -957,7 +957,7 @@ def test_real_custom_source_attach_patch_update_and_same_version_refresh(
|
|
|
957
957
|
timeout=60,
|
|
958
958
|
check=True,
|
|
959
959
|
)
|
|
960
|
-
assert version.stdout.strip() == f"{marker}:1.0.
|
|
960
|
+
assert version.stdout.strip() == f"{marker}:1.0.3"
|
|
961
961
|
|
|
962
962
|
request = '{"jsonrpc":"2.0","id":1,"method":"tools/list"}\n'
|
|
963
963
|
config_paths = [
|
|
@@ -1446,7 +1446,7 @@ def test_update_rejects_workspace_downgrade_before_writing(
|
|
|
1446
1446
|
bootstrap_workspace(workspace)
|
|
1447
1447
|
lock_path = workspace / ".tradingcodex/generated/module-lock.json"
|
|
1448
1448
|
lock = json.loads(lock_path.read_text(encoding="utf-8"))
|
|
1449
|
-
lock["tradingcodex_version"] = "1.0.
|
|
1449
|
+
lock["tradingcodex_version"] = "1.0.3"
|
|
1450
1450
|
lock_path.write_text(json.dumps(lock, indent=2) + "\n", encoding="utf-8")
|
|
1451
1451
|
before = {path.relative_to(workspace).as_posix(): path.read_bytes() for path in workspace.rglob("*") if path.is_file()}
|
|
1452
1452
|
|
|
@@ -1475,6 +1475,61 @@ def test_v1_update_keeps_an_explicit_home_override(
|
|
|
1475
1475
|
assert updated["home_source"] == "environment_override"
|
|
1476
1476
|
|
|
1477
1477
|
|
|
1478
|
+
def test_package_runner_update_restores_recorded_explicit_runtime_identity(
|
|
1479
|
+
monkeypatch: pytest.MonkeyPatch,
|
|
1480
|
+
tmp_path: Path,
|
|
1481
|
+
) -> None:
|
|
1482
|
+
from tradingcodex_cli.commands.bootstrap import _configure_recorded_update_runtime
|
|
1483
|
+
|
|
1484
|
+
workspace = tmp_path / "workspace"
|
|
1485
|
+
selected_home = tmp_path / "custom-home"
|
|
1486
|
+
selected_db = tmp_path / "custom-ledger" / "tradingcodex.sqlite3"
|
|
1487
|
+
selected_addr = "127.0.0.1:49123"
|
|
1488
|
+
monkeypatch.setenv("TRADINGCODEX_HOME", str(selected_home))
|
|
1489
|
+
monkeypatch.setenv("TRADINGCODEX_DB_NAME", str(selected_db))
|
|
1490
|
+
monkeypatch.setenv("TRADINGCODEX_SERVICE_ADDR", selected_addr)
|
|
1491
|
+
bootstrap_workspace(workspace)
|
|
1492
|
+
lock = read_module_lock(workspace)
|
|
1493
|
+
|
|
1494
|
+
for name in (
|
|
1495
|
+
"TRADINGCODEX_HOME",
|
|
1496
|
+
"TRADINGCODEX_HOME_SOURCE",
|
|
1497
|
+
"TRADINGCODEX_DB_NAME",
|
|
1498
|
+
"TRADINGCODEX_SERVICE_ADDR",
|
|
1499
|
+
):
|
|
1500
|
+
monkeypatch.delenv(name, raising=False)
|
|
1501
|
+
|
|
1502
|
+
_configure_recorded_update_runtime(workspace, lock)
|
|
1503
|
+
|
|
1504
|
+
assert os.environ["TRADINGCODEX_HOME"] == str(selected_home.resolve())
|
|
1505
|
+
assert os.environ["TRADINGCODEX_HOME_SOURCE"] == "environment_override"
|
|
1506
|
+
assert os.environ["TRADINGCODEX_DB_NAME"] == str(selected_db.resolve())
|
|
1507
|
+
assert os.environ["TRADINGCODEX_SERVICE_ADDR"] == selected_addr
|
|
1508
|
+
|
|
1509
|
+
|
|
1510
|
+
def test_package_runner_update_does_not_pin_a_platform_default_home(
|
|
1511
|
+
monkeypatch: pytest.MonkeyPatch,
|
|
1512
|
+
tmp_path: Path,
|
|
1513
|
+
) -> None:
|
|
1514
|
+
from tradingcodex_cli.commands.bootstrap import _configure_recorded_update_runtime
|
|
1515
|
+
|
|
1516
|
+
workspace = tmp_path / "workspace"
|
|
1517
|
+
workspace.mkdir()
|
|
1518
|
+
lock = {
|
|
1519
|
+
"home_source": "platform_default",
|
|
1520
|
+
"tradingcodex_home": str(tmp_path / "recorded-platform-home"),
|
|
1521
|
+
"db_source": "home_default",
|
|
1522
|
+
"tradingcodex_db_path": str(tmp_path / "recorded-platform-home" / "state" / "tradingcodex.sqlite3"),
|
|
1523
|
+
}
|
|
1524
|
+
monkeypatch.delenv("TRADINGCODEX_HOME", raising=False)
|
|
1525
|
+
monkeypatch.delenv("TRADINGCODEX_HOME_SOURCE", raising=False)
|
|
1526
|
+
|
|
1527
|
+
_configure_recorded_update_runtime(workspace, lock)
|
|
1528
|
+
|
|
1529
|
+
assert "TRADINGCODEX_HOME" not in os.environ
|
|
1530
|
+
assert "TRADINGCODEX_HOME_SOURCE" not in os.environ
|
|
1531
|
+
|
|
1532
|
+
|
|
1478
1533
|
def test_native_process_kwargs_and_external_mcp_pipe_reader() -> None:
|
|
1479
1534
|
assert _detached_process_kwargs("posix") == {"start_new_session": True}
|
|
1480
1535
|
assert "creationflags" in _detached_process_kwargs("nt")
|
|
@@ -80,7 +80,7 @@ def test_cli_hook_dispatch_preserves_standard_input_and_output(
|
|
|
80
80
|
def test_v1_package_metadata_has_one_stable_version_source() -> None:
|
|
81
81
|
project = tomllib.loads((ROOT / "pyproject.toml").read_text(encoding="utf-8"))
|
|
82
82
|
|
|
83
|
-
assert TRADINGCODEX_VERSION == "1.0.
|
|
83
|
+
assert TRADINGCODEX_VERSION == "1.0.2"
|
|
84
84
|
assert str(Version(TRADINGCODEX_VERSION)) == TRADINGCODEX_VERSION
|
|
85
85
|
assert project["project"]["dynamic"] == ["version"]
|
|
86
86
|
assert "version" not in project["project"]
|
|
@@ -145,7 +145,7 @@ def test_v1_release_checklist_does_not_preapprove_gates() -> None:
|
|
|
145
145
|
assert re.search(r"(?<![\d.])v?0\.\d+\.\d+\b", deployment) is None
|
|
146
146
|
assert re.search(r"(?<![\d.])v?0\.\d+\.\d+\b", checklist) is None
|
|
147
147
|
assert "- [x]" not in checklist.lower()
|
|
148
|
-
assert "release_version=1.0.
|
|
148
|
+
assert "release_version=1.0.2" in checklist
|
|
149
149
|
|
|
150
150
|
|
|
151
151
|
def test_attach_contract_has_no_overwrite_or_init_compatibility() -> None:
|
|
@@ -374,7 +374,7 @@ def test_update_status_requires_package_refresh_for_newer_workspace(monkeypatch,
|
|
|
374
374
|
"schema_version": 1,
|
|
375
375
|
"generated_at": "2026-07-11T00:00:00Z",
|
|
376
376
|
"workspace_id": "tcxw_" + "a" * 32,
|
|
377
|
-
"tradingcodex_version": "1.0.
|
|
377
|
+
"tradingcodex_version": "1.0.3",
|
|
378
378
|
"tradingcodex_package_spec": "tradingcodex",
|
|
379
379
|
"tradingcodex_home": str((tmp_path / "home").resolve()),
|
|
380
380
|
"home_source": "environment_override",
|
|
@@ -534,7 +534,7 @@ def test_update_status_never_treats_local_provenance_as_an_executable_spec(
|
|
|
534
534
|
"schema_version": 1,
|
|
535
535
|
"generated_at": "2026-07-11T00:00:00Z",
|
|
536
536
|
"workspace_id": "tcxw_" + "a" * 32,
|
|
537
|
-
"tradingcodex_version": "1.0.
|
|
537
|
+
"tradingcodex_version": "1.0.3",
|
|
538
538
|
"tradingcodex_package_spec": "local-explicit",
|
|
539
539
|
"tradingcodex_home": str((tmp_path / "home").resolve()),
|
|
540
540
|
"home_source": "environment_override",
|
|
@@ -721,7 +721,7 @@ def test_external_mcp_operator_actions_reject_noninteractive_callers(
|
|
|
721
721
|
assert issued == []
|
|
722
722
|
|
|
723
723
|
|
|
724
|
-
def
|
|
724
|
+
def test_release_publish_is_tag_bound_and_reuses_one_verified_build() -> None:
|
|
725
725
|
workflow = yaml.safe_load((ROOT / ".github/workflows/release.yml").read_text(encoding="utf-8"))
|
|
726
726
|
trigger = workflow.get("on") or workflow.get(True)
|
|
727
727
|
assert trigger["workflow_dispatch"]["inputs"]["release_version"]["required"] is True
|
|
@@ -742,12 +742,23 @@ def test_release_publish_is_tag_bound_and_waits_for_native_wheel_smokes() -> Non
|
|
|
742
742
|
if step["name"] == "Validate distribution metadata and filenames"
|
|
743
743
|
)
|
|
744
744
|
assert "parse_wheel_filename" in distribution["run"]
|
|
745
|
-
|
|
746
|
-
assert
|
|
747
|
-
assert
|
|
748
|
-
|
|
749
|
-
|
|
750
|
-
|
|
745
|
+
assert set(jobs) == {"build", "publish-pypi"}
|
|
746
|
+
assert jobs["publish-pypi"]["needs"] == "build"
|
|
747
|
+
assert any(
|
|
748
|
+
"platform_wheel_smoke.py" in step.get("run", "")
|
|
749
|
+
for step in jobs["build"]["steps"]
|
|
750
|
+
)
|
|
751
751
|
assert (ROOT / ".github/workflows/release.yml").read_text(encoding="utf-8").count("python -m build") == 1
|
|
752
752
|
assert any("download-artifact" in step.get("uses", "") for step in jobs["publish-pypi"]["steps"])
|
|
753
753
|
assert not any("python -m build" in step.get("run", "") for step in jobs["publish-pypi"]["steps"])
|
|
754
|
+
|
|
755
|
+
|
|
756
|
+
def test_github_actions_keep_the_normal_and_pages_paths_to_one_job_each() -> None:
|
|
757
|
+
ci = yaml.safe_load((ROOT / ".github/workflows/ci.yml").read_text(encoding="utf-8"))
|
|
758
|
+
pages = yaml.safe_load(
|
|
759
|
+
(ROOT / ".github/workflows/deploy-user-guide.yml").read_text(encoding="utf-8")
|
|
760
|
+
)
|
|
761
|
+
assert set(ci["jobs"]) == {"quality"}
|
|
762
|
+
assert set(pages["jobs"]) == {"deploy"}
|
|
763
|
+
assert len(ci["jobs"]["quality"]["steps"]) <= 7
|
|
764
|
+
assert len(pages["jobs"]["deploy"]["steps"]) == 4
|
|
@@ -113,6 +113,7 @@ tests/test_dynamic_artifact_quality.py
|
|
|
113
113
|
tests/test_e2e_user_scenarios.py
|
|
114
114
|
tests/test_evaluation_lab_hardening.py
|
|
115
115
|
tests/test_evaluation_profiles.py
|
|
116
|
+
tests/test_guidebook_contract.py
|
|
116
117
|
tests/test_investment_analysis.py
|
|
117
118
|
tests/test_investment_brain_cli.py
|
|
118
119
|
tests/test_investment_brain_prompt_layers.py
|
|
@@ -3,6 +3,7 @@ from __future__ import annotations
|
|
|
3
3
|
import argparse
|
|
4
4
|
import hashlib
|
|
5
5
|
import os
|
|
6
|
+
import tomllib
|
|
6
7
|
from pathlib import Path
|
|
7
8
|
|
|
8
9
|
from tradingcodex_cli.commands.doctor import doctor
|
|
@@ -85,14 +86,16 @@ def update(argv: list[str]) -> None:
|
|
|
85
86
|
args = parser.parse_args(argv)
|
|
86
87
|
target = Path(args.project_dir).resolve()
|
|
87
88
|
validated_workspace = validate_generated_workspace(target)
|
|
89
|
+
existing_lock = validated_workspace["module_lock"]
|
|
88
90
|
if args.dev:
|
|
89
91
|
development_source = _development_source_root()
|
|
90
92
|
_configure_development_runtime(
|
|
91
93
|
development_source,
|
|
92
|
-
existing_lock=
|
|
94
|
+
existing_lock=existing_lock,
|
|
93
95
|
)
|
|
94
96
|
explicit_source = development_source
|
|
95
97
|
else:
|
|
98
|
+
_configure_recorded_update_runtime(target, existing_lock)
|
|
96
99
|
explicit_source = args.package_spec
|
|
97
100
|
_configure_bootstrap_source(
|
|
98
101
|
explicit_source,
|
|
@@ -221,6 +224,48 @@ def _configure_development_runtime(
|
|
|
221
224
|
os.environ["TRADINGCODEX_SERVICE_ADDR"] = _development_service_addr(resolution.home)
|
|
222
225
|
|
|
223
226
|
|
|
227
|
+
def _configure_recorded_update_runtime(
|
|
228
|
+
target: Path,
|
|
229
|
+
existing_lock: dict[str, object],
|
|
230
|
+
) -> None:
|
|
231
|
+
"""Restore explicit release-workspace runtime identity for package-runner updates.
|
|
232
|
+
|
|
233
|
+
``uvx ... tcx update`` does not execute the generated workspace wrapper, so
|
|
234
|
+
custom home, database, and service-address values would otherwise fall back
|
|
235
|
+
to platform defaults. Explicit process values remain authoritative so users
|
|
236
|
+
can deliberately move a workspace to a new runtime identity.
|
|
237
|
+
"""
|
|
238
|
+
|
|
239
|
+
if (
|
|
240
|
+
existing_lock.get("home_source") == "environment_override"
|
|
241
|
+
and not str(os.environ.get("TRADINGCODEX_HOME") or "").strip()
|
|
242
|
+
):
|
|
243
|
+
os.environ["TRADINGCODEX_HOME"] = str(existing_lock["tradingcodex_home"])
|
|
244
|
+
os.environ["TRADINGCODEX_HOME_SOURCE"] = "environment_override"
|
|
245
|
+
if (
|
|
246
|
+
existing_lock.get("db_source") == "environment_override"
|
|
247
|
+
and not str(os.environ.get("TRADINGCODEX_DB_NAME") or "").strip()
|
|
248
|
+
):
|
|
249
|
+
os.environ["TRADINGCODEX_DB_NAME"] = str(existing_lock["tradingcodex_db_path"])
|
|
250
|
+
if not str(os.environ.get("TRADINGCODEX_SERVICE_ADDR") or "").strip():
|
|
251
|
+
recorded_addr = _recorded_service_addr(target)
|
|
252
|
+
if recorded_addr:
|
|
253
|
+
os.environ["TRADINGCODEX_SERVICE_ADDR"] = recorded_addr
|
|
254
|
+
|
|
255
|
+
|
|
256
|
+
def _recorded_service_addr(target: Path) -> str:
|
|
257
|
+
config_path = target / ".codex" / "config.toml"
|
|
258
|
+
try:
|
|
259
|
+
config = tomllib.loads(config_path.read_text(encoding="utf-8"))
|
|
260
|
+
except (OSError, tomllib.TOMLDecodeError):
|
|
261
|
+
return ""
|
|
262
|
+
servers = config.get("mcp_servers")
|
|
263
|
+
tradingcodex = servers.get("tradingcodex") if isinstance(servers, dict) else None
|
|
264
|
+
environment = tradingcodex.get("env") if isinstance(tradingcodex, dict) else None
|
|
265
|
+
value = environment.get("TRADINGCODEX_SERVICE_ADDR") if isinstance(environment, dict) else None
|
|
266
|
+
return str(value or "").strip()
|
|
267
|
+
|
|
268
|
+
|
|
224
269
|
def _development_service_addr(home: Path | str) -> str:
|
|
225
270
|
identity = os.path.normcase(str(Path(home).expanduser().resolve(strict=False)))
|
|
226
271
|
offset = int(hashlib.sha256(identity.encode("utf-8")).hexdigest()[:8], 16)
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
TRADINGCODEX_VERSION = "1.0.2"
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
TRADINGCODEX_VERSION = "1.0.1"
|
|
File without changes
|