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.
Files changed (369) hide show
  1. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/CHANGELOG.md +15 -0
  2. {tradingcodex-1.0.1/tradingcodex.egg-info → tradingcodex-1.0.2}/PKG-INFO +1 -1
  3. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/docs/deployment.md +24 -15
  4. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/docs/generated-workspaces.md +9 -0
  5. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/docs/release-readiness.md +40 -32
  6. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/installation.md +8 -0
  7. tradingcodex-1.0.2/tests/test_guidebook_contract.py +71 -0
  8. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tests/test_platform_runtime.py +60 -5
  9. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tests/test_release_contract.py +22 -11
  10. {tradingcodex-1.0.1 → tradingcodex-1.0.2/tradingcodex.egg-info}/PKG-INFO +1 -1
  11. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex.egg-info/SOURCES.txt +1 -0
  12. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex_cli/commands/bootstrap.py +46 -1
  13. tradingcodex-1.0.2/tradingcodex_service/version.py +1 -0
  14. tradingcodex-1.0.1/tradingcodex_service/version.py +0 -1
  15. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/CONTRIBUTING.md +0 -0
  16. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/LICENSE +0 -0
  17. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/MANIFEST.in +0 -0
  18. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/NOTICE +0 -0
  19. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/README.md +0 -0
  20. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/TRADEMARKS.md +0 -0
  21. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/apps/__init__.py +0 -0
  22. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/apps/audit/__init__.py +0 -0
  23. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/apps/audit/admin.py +0 -0
  24. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/apps/audit/apps.py +0 -0
  25. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/apps/audit/migrations/0001_v1_initial.py +0 -0
  26. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/apps/audit/migrations/__init__.py +0 -0
  27. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/apps/audit/models.py +0 -0
  28. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/apps/harness/__init__.py +0 -0
  29. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/apps/harness/admin.py +0 -0
  30. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/apps/harness/apps.py +0 -0
  31. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/apps/harness/migrations/0001_v1_initial.py +0 -0
  32. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/apps/harness/migrations/__init__.py +0 -0
  33. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/apps/harness/models.py +0 -0
  34. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/apps/harness/templatetags/__init__.py +0 -0
  35. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/apps/integrations/__init__.py +0 -0
  36. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/apps/integrations/admin.py +0 -0
  37. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/apps/integrations/apps.py +0 -0
  38. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/apps/integrations/migrations/0001_v1_initial.py +0 -0
  39. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/apps/integrations/migrations/__init__.py +0 -0
  40. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/apps/integrations/models.py +0 -0
  41. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/apps/mcp/__init__.py +0 -0
  42. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/apps/mcp/admin.py +0 -0
  43. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/apps/mcp/apps.py +0 -0
  44. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/apps/mcp/migrations/0001_v1_initial.py +0 -0
  45. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/apps/mcp/migrations/__init__.py +0 -0
  46. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/apps/mcp/models.py +0 -0
  47. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/apps/mcp/services.py +0 -0
  48. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/apps/orders/__init__.py +0 -0
  49. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/apps/orders/admin.py +0 -0
  50. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/apps/orders/apps.py +0 -0
  51. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/apps/orders/migrations/0001_v1_initial.py +0 -0
  52. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/apps/orders/migrations/__init__.py +0 -0
  53. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/apps/orders/models.py +0 -0
  54. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/apps/orders/services.py +0 -0
  55. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/apps/policy/__init__.py +0 -0
  56. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/apps/policy/admin.py +0 -0
  57. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/apps/policy/apps.py +0 -0
  58. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/apps/policy/migrations/0001_v1_initial.py +0 -0
  59. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/apps/policy/migrations/__init__.py +0 -0
  60. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/apps/policy/models.py +0 -0
  61. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/apps/policy/services.py +0 -0
  62. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/apps/portfolio/__init__.py +0 -0
  63. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/apps/portfolio/admin.py +0 -0
  64. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/apps/portfolio/apps.py +0 -0
  65. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/apps/portfolio/migrations/0001_v1_initial.py +0 -0
  66. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/apps/portfolio/migrations/__init__.py +0 -0
  67. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/apps/portfolio/models.py +0 -0
  68. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/assets/tradingcodex-banner.svg +0 -0
  69. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/docs/README.md +0 -0
  70. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/docs/codex-native-orchestration.md +0 -0
  71. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/docs/components.md +0 -0
  72. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/docs/core-concepts-and-rules.md +0 -0
  73. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/docs/decision-memory.md +0 -0
  74. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/docs/execution-without-subagent-plan.md +0 -0
  75. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/docs/financial-workflow-references.md +0 -0
  76. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/docs/guardrails.md +0 -0
  77. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/docs/harness.md +0 -0
  78. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/docs/improvement-loop.md +0 -0
  79. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/docs/interfaces-and-surfaces.md +0 -0
  80. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/docs/investment-brain-plugins.md +0 -0
  81. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/docs/licensing-and-commercialization.md +0 -0
  82. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/docs/product-direction.md +0 -0
  83. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/docs/research-memory-and-artifacts.md +0 -0
  84. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/docs/roles-skills-and-workflows.md +0 -0
  85. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/docs/safety-policy-and-execution.md +0 -0
  86. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/docs/system-architecture.md +0 -0
  87. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/docs/user-facing-skills.md +0 -0
  88. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/docs/validation-and-test-plan.md +0 -0
  89. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/frontend/index.html +0 -0
  90. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/frontend/package-lock.json +0 -0
  91. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/frontend/package.json +0 -0
  92. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/frontend/src/App.tsx +0 -0
  93. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/frontend/src/api.ts +0 -0
  94. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/frontend/src/domain.ts +0 -0
  95. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/frontend/src/features/LibraryPage.tsx +0 -0
  96. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/frontend/src/features/SkillsPage.tsx +0 -0
  97. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/frontend/src/features/SystemPage.tsx +0 -0
  98. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/frontend/src/main.tsx +0 -0
  99. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/frontend/src/navigation.js +0 -0
  100. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/frontend/src/navigation.test.js +0 -0
  101. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/frontend/src/styles.css +0 -0
  102. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/frontend/src/ui.tsx +0 -0
  103. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/frontend/src/viewer-data.js +0 -0
  104. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/frontend/tsconfig.json +0 -0
  105. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/frontend/vite.config.ts +0 -0
  106. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/install.sh +0 -0
  107. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/pyproject.toml +0 -0
  108. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/setup.cfg +0 -0
  109. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tests/test_artifact_authentication.py +0 -0
  110. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tests/test_brain_skill.py +0 -0
  111. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tests/test_broker_center_prd.py +0 -0
  112. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tests/test_build_contract_metadata.py +0 -0
  113. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tests/test_build_hook.py +0 -0
  114. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tests/test_build_turn_grant.py +0 -0
  115. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tests/test_clean_v1_cli_audit.py +0 -0
  116. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tests/test_codex_cli_compat.py +0 -0
  117. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tests/test_codex_cli_contract.py +0 -0
  118. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tests/test_codex_native_orchestration.py +0 -0
  119. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tests/test_dashboard_skill.py +0 -0
  120. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tests/test_decision_memory_core.py +0 -0
  121. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tests/test_dev_bootstrap.py +0 -0
  122. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tests/test_dynamic_artifact_quality.py +0 -0
  123. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tests/test_e2e_user_scenarios.py +0 -0
  124. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tests/test_evaluation_lab_hardening.py +0 -0
  125. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tests/test_evaluation_profiles.py +0 -0
  126. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tests/test_investment_analysis.py +0 -0
  127. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tests/test_investment_brain_cli.py +0 -0
  128. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tests/test_investment_brain_prompt_layers.py +0 -0
  129. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tests/test_investment_brain_provenance.py +0 -0
  130. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tests/test_investment_brain_registry.py +0 -0
  131. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tests/test_investor_context.py +0 -0
  132. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tests/test_mcp_broker_release_health.py +0 -0
  133. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tests/test_mcp_operator_authority.py +0 -0
  134. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tests/test_native_execution_gateway.py +0 -0
  135. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tests/test_order_turn_grant.py +0 -0
  136. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tests/test_provider_source_approval.py +0 -0
  137. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tests/test_research_forecast_surfaces.py +0 -0
  138. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tests/test_research_spec_profiles.py +0 -0
  139. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tests/test_runtime_paths.py +0 -0
  140. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tests/test_runtime_profile.py +0 -0
  141. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tests/test_security_invariants.py +0 -0
  142. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tests/test_skill_runtime_boundaries.py +0 -0
  143. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tests/test_source_snapshot_agent_contract.py +0 -0
  144. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tests/test_v1_migrations.py +0 -0
  145. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tests/test_v1_state_integrity.py +0 -0
  146. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tests/test_viewer.py +0 -0
  147. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tests/test_workspace_git_contract.py +0 -0
  148. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex.egg-info/dependency_links.txt +0 -0
  149. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex.egg-info/entry_points.txt +0 -0
  150. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex.egg-info/requires.txt +0 -0
  151. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex.egg-info/top_level.txt +0 -0
  152. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex_cli/__init__.py +0 -0
  153. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex_cli/__main__.py +0 -0
  154. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex_cli/commands/__init__.py +0 -0
  155. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex_cli/commands/build.py +0 -0
  156. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex_cli/commands/connectors.py +0 -0
  157. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex_cli/commands/db.py +0 -0
  158. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex_cli/commands/decision.py +0 -0
  159. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex_cli/commands/doctor.py +0 -0
  160. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex_cli/commands/evaluation.py +0 -0
  161. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex_cli/commands/forecast.py +0 -0
  162. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex_cli/commands/home.py +0 -0
  163. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex_cli/commands/investment_brains.py +0 -0
  164. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex_cli/commands/investor_context.py +0 -0
  165. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex_cli/commands/mcp.py +0 -0
  166. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex_cli/commands/mode.py +0 -0
  167. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex_cli/commands/orders.py +0 -0
  168. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex_cli/commands/policy.py +0 -0
  169. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex_cli/commands/profile.py +0 -0
  170. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex_cli/commands/research.py +0 -0
  171. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex_cli/commands/skills.py +0 -0
  172. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex_cli/commands/strategies.py +0 -0
  173. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex_cli/commands/subagents.py +0 -0
  174. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex_cli/commands/utils.py +0 -0
  175. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex_cli/commands/workflow.py +0 -0
  176. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex_cli/commands/workspaces.py +0 -0
  177. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex_cli/generator.py +0 -0
  178. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex_cli/mcp_stdio.py +0 -0
  179. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex_cli/package_source.py +0 -0
  180. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex_cli/service_autostart.py +0 -0
  181. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex_cli/startup_status.py +0 -0
  182. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex_cli/versioning.py +0 -0
  183. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex_service/__init__.py +0 -0
  184. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex_service/admin.py +0 -0
  185. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex_service/api.py +0 -0
  186. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex_service/application/__init__.py +0 -0
  187. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex_service/application/agents.py +0 -0
  188. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex_service/application/analysis_runs.py +0 -0
  189. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex_service/application/artifact_bindings.py +0 -0
  190. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex_service/application/artifact_quality.py +0 -0
  191. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex_service/application/audit.py +0 -0
  192. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex_service/application/brokers.py +0 -0
  193. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex_service/application/build_gateway.py +0 -0
  194. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex_service/application/common.py +0 -0
  195. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex_service/application/components.py +0 -0
  196. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex_service/application/context_budget.py +0 -0
  197. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex_service/application/customization.py +0 -0
  198. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex_service/application/decision_packages.py +0 -0
  199. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex_service/application/evaluation_lab.py +0 -0
  200. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex_service/application/execution_gateway.py +0 -0
  201. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex_service/application/forecasting.py +0 -0
  202. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex_service/application/git_subprocess.py +0 -0
  203. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex_service/application/harness.py +0 -0
  204. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex_service/application/health.py +0 -0
  205. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex_service/application/investment_analysis.py +0 -0
  206. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex_service/application/investment_brains.py +0 -0
  207. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex_service/application/investor_context.py +0 -0
  208. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex_service/application/markdown_preview.py +0 -0
  209. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex_service/application/operator_authority.py +0 -0
  210. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex_service/application/orders.py +0 -0
  211. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex_service/application/policy.py +0 -0
  212. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex_service/application/portfolio.py +0 -0
  213. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex_service/application/postmortems.py +0 -0
  214. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex_service/application/research.py +0 -0
  215. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex_service/application/research_specs.py +0 -0
  216. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex_service/application/runtime.py +0 -0
  217. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex_service/application/runtime_mode.py +0 -0
  218. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex_service/application/source_snapshots.py +0 -0
  219. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex_service/application/viewer.py +0 -0
  220. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex_service/application/workspace_git.py +0 -0
  221. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex_service/application/workspaces.py +0 -0
  222. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex_service/asgi.py +0 -0
  223. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex_service/log_safety.py +0 -0
  224. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex_service/mcp_runtime.py +0 -0
  225. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex_service/runtime_profile.py +0 -0
  226. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex_service/settings.py +0 -0
  227. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex_service/static/tradingcodex_admin/favicon.svg +0 -0
  228. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex_service/static/tradingcodex_web/assets/index-CFoXYUtq.js +0 -0
  229. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex_service/static/tradingcodex_web/assets/index-DYzj_xRR.css +0 -0
  230. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex_service/static/tradingcodex_web/index.html +0 -0
  231. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex_service/urls.py +0 -0
  232. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex_service/viewer_api.py +0 -0
  233. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex_service/web.py +0 -0
  234. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/tradingcodex_service/wsgi.py +0 -0
  235. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/__init__.py +0 -0
  236. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/audit/files/.tradingcodex/audit/README.md +0 -0
  237. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/audit/files/trading/audit/.gitkeep +0 -0
  238. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/audit/module.json +0 -0
  239. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/codex-base/files/.codex/config.toml +0 -0
  240. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/codex-base/files/.codex/hooks/tradingcodex_hook.py +0 -0
  241. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/codex-base/files/.codex/hooks.json +0 -0
  242. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/codex-base/files/.codex/prompts/base_instructions/head-manager.md +0 -0
  243. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/codex-base/files/.codex/rules/tradingcodex.rules +0 -0
  244. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/codex-base/files/.tradingcodex/cli.py +0 -0
  245. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/codex-base/files/.tradingcodex/config.yaml +0 -0
  246. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/codex-base/files/AGENTS.md +0 -0
  247. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/codex-base/files/pyproject.toml +0 -0
  248. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/codex-base/files/tcx +0 -0
  249. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/codex-base/files/tcx.cmd +0 -0
  250. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/codex-base/module.json +0 -0
  251. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/policies/restricted-list.yaml +0 -0
  252. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/schemas/approval_receipt.schema.json +0 -0
  253. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/schemas/audit_event.schema.json +0 -0
  254. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/schemas/evidence_pack.schema.json +0 -0
  255. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/schemas/execution_result.schema.json +0 -0
  256. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/schemas/fundamental_report.schema.json +0 -0
  257. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/schemas/news_report.schema.json +0 -0
  258. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/schemas/order_ticket.schema.json +0 -0
  259. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/schemas/portfolio_review.schema.json +0 -0
  260. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/schemas/postmortem_report.schema.json +0 -0
  261. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/schemas/research_artifact.schema.json +0 -0
  262. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/schemas/risk_report.schema.json +0 -0
  263. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/schemas/technical_report.schema.json +0 -0
  264. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/schemas/thesis.schema.json +0 -0
  265. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/schemas/valuation.schema.json +0 -0
  266. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/enforcement-guardrails/module.json +0 -0
  267. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/fixed-subagents/files/.codex/agents/fundamental-analyst.toml +0 -0
  268. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/fixed-subagents/files/.codex/agents/instrument-analyst.toml +0 -0
  269. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/fixed-subagents/files/.codex/agents/judgment-reviewer.toml +0 -0
  270. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/fixed-subagents/files/.codex/agents/macro-analyst.toml +0 -0
  271. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/fixed-subagents/files/.codex/agents/news-analyst.toml +0 -0
  272. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/fixed-subagents/files/.codex/agents/portfolio-manager.toml +0 -0
  273. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/fixed-subagents/files/.codex/agents/risk-manager.toml +0 -0
  274. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/fixed-subagents/files/.codex/agents/technical-analyst.toml +0 -0
  275. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/fixed-subagents/files/.codex/agents/valuation-analyst.toml +0 -0
  276. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/fixed-subagents/files/.tradingcodex/mainagent/skill-change-proposals/.gitkeep +0 -0
  277. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/fixed-subagents/module.json +0 -0
  278. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/guidance-guardrails/files/.tradingcodex/guidance/guardrails.md +0 -0
  279. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/guidance-guardrails/files/.tradingcodex/guidance/task-quality-checklist.md +0 -0
  280. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/guidance-guardrails/module.json +0 -0
  281. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/information-barriers/files/.tradingcodex/secrets.md +0 -0
  282. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/information-barriers/files/trading/forecasts/.gitkeep +0 -0
  283. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/information-barriers/files/trading/market-data/.gitkeep +0 -0
  284. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/information-barriers/files/trading/portfolio/.gitkeep +0 -0
  285. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/information-barriers/files/trading/reports/fundamental/.gitkeep +0 -0
  286. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/information-barriers/files/trading/reports/instrument/.gitkeep +0 -0
  287. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/information-barriers/files/trading/reports/macro/.gitkeep +0 -0
  288. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/information-barriers/files/trading/reports/news/.gitkeep +0 -0
  289. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/information-barriers/files/trading/reports/policy/.gitkeep +0 -0
  290. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/information-barriers/files/trading/reports/portfolio/.gitkeep +0 -0
  291. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/information-barriers/files/trading/reports/postmortem/.gitkeep +0 -0
  292. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/information-barriers/files/trading/reports/risk/.gitkeep +0 -0
  293. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/information-barriers/files/trading/reports/technical/.gitkeep +0 -0
  294. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/information-barriers/files/trading/reports/valuation/.gitkeep +0 -0
  295. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/information-barriers/files/trading/research/.gitkeep +0 -0
  296. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/information-barriers/module.json +0 -0
  297. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/paper-trading/module.json +0 -0
  298. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/repo-skills/files/.agents/skills/tcx-automate/SKILL.md +0 -0
  299. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/repo-skills/files/.agents/skills/tcx-automate/agents/openai.yaml +0 -0
  300. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/repo-skills/files/.agents/skills/tcx-brain/SKILL.md +0 -0
  301. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/repo-skills/files/.agents/skills/tcx-brain/agents/openai.yaml +0 -0
  302. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/repo-skills/files/.agents/skills/tcx-brain/references/bundle-contract.md +0 -0
  303. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/repo-skills/files/.agents/skills/tcx-build/SKILL.md +0 -0
  304. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/repo-skills/files/.agents/skills/tcx-build/agents/openai.yaml +0 -0
  305. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/repo-skills/files/.agents/skills/tcx-dashboard/SKILL.md +0 -0
  306. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/repo-skills/files/.agents/skills/tcx-dashboard/agents/openai.yaml +0 -0
  307. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/repo-skills/files/.agents/skills/tcx-investor-context/SKILL.md +0 -0
  308. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/repo-skills/files/.agents/skills/tcx-investor-context/agents/openai.yaml +0 -0
  309. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/repo-skills/files/.agents/skills/tcx-memory/SKILL.md +0 -0
  310. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/repo-skills/files/.agents/skills/tcx-memory/agents/openai.yaml +0 -0
  311. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/repo-skills/files/.agents/skills/tcx-order-allow/SKILL.md +0 -0
  312. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/repo-skills/files/.agents/skills/tcx-order-allow/agents/openai.yaml +0 -0
  313. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/repo-skills/files/.agents/skills/tcx-order-cancel/SKILL.md +0 -0
  314. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/repo-skills/files/.agents/skills/tcx-order-cancel/agents/openai.yaml +0 -0
  315. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/repo-skills/files/.agents/skills/tcx-order-submit/SKILL.md +0 -0
  316. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/repo-skills/files/.agents/skills/tcx-order-submit/agents/openai.yaml +0 -0
  317. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/repo-skills/files/.agents/skills/tcx-plan/SKILL.md +0 -0
  318. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/repo-skills/files/.agents/skills/tcx-plan/agents/openai.yaml +0 -0
  319. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/repo-skills/files/.agents/skills/tcx-server/SKILL.md +0 -0
  320. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/repo-skills/files/.agents/skills/tcx-server/agents/openai.yaml +0 -0
  321. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/repo-skills/files/.agents/skills/tcx-strategy/SKILL.md +0 -0
  322. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/repo-skills/files/.agents/skills/tcx-strategy/agents/openai.yaml +0 -0
  323. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/repo-skills/files/.agents/skills/tcx-workflow/SKILL.md +0 -0
  324. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/repo-skills/files/.agents/skills/tcx-workflow/agents/openai.yaml +0 -0
  325. {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
  326. {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
  327. {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
  328. {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
  329. {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
  330. {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
  331. {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
  332. {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
  333. {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
  334. {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
  335. {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
  336. {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
  337. {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
  338. {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
  339. {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
  340. {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
  341. {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
  342. {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
  343. {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
  344. {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
  345. {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
  346. {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
  347. {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
  348. {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
  349. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/shared/tcx-artifact/SKILL.md +0 -0
  350. {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
  351. {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
  352. {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
  353. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/shared/tcx-evidence/SKILL.md +0 -0
  354. {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
  355. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/shared/tcx-forecast/SKILL.md +0 -0
  356. {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
  357. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/shared/tcx-scenarios/SKILL.md +0 -0
  358. {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
  359. {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
  360. {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
  361. {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
  362. {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
  363. {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
  364. {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
  365. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/repo-skills/module.json +0 -0
  366. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/tradingcodex-mcp/files/.tradingcodex/mcp/enforcer/README.md +0 -0
  367. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/tradingcodex-mcp/files/.tradingcodex/mcp/gateway/README.md +0 -0
  368. {tradingcodex-1.0.1 → tradingcodex-1.0.2}/workspace_templates/modules/tradingcodex-mcp/files/.tradingcodex/mcp/server.py +0 -0
  369. {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
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: tradingcodex
3
- Version: 1.0.1
3
+ Version: 1.0.2
4
4
  Summary: Local-first investment operating system for Codex-native research and service-gated execution.
5
5
  Author: TradingCodex Authors
6
6
  License-Expression: Apache-2.0
@@ -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, while CI keeps the supported
113
- Python 3.11, 3.12, 3.13, and 3.14 range green. Node is a maintainer-only build
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. It runs frontend verification, safety
163
- invariants, the supported Python matrix, clean package construction, and native
164
- macOS and Windows wheel smokes. It never publishes.
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 same uploaded artifact is downloaded by both native jobs and the PyPI
181
- publisher. No job rebuilds the distribution after verification.
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` uploads only `guidebook/` and deploys
193
- it to GitHub Pages after a push to `main` that changes the guide or its workflow.
194
- It can also be run manually. It does not build or deploy the Python package,
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=false` for a rehearsal and
218
- `publish_pypi=true` only for the approved publication.
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.1"
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 Release Status
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-bound rehearsal, tag, and
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.1` release state. It is not an implementation
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.1 Contract
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
- - PyPI publication is manual, tag-bound, and reuses one verified sdist and
30
- wheel across Ubuntu, macOS, Windows, and publication jobs.
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.1`; `pyproject.toml` reads it dynamically; `tcx --version` uses the same source. |
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 native acceptance passes locally | The v1.0.1 candidate projects the shared artifact skill to all producing roles, requires the current reference Codex client, and exposes the nested MCP contracts. A disposable generated workspace passed strict config/hook preflight plus artifact, forecast, and proof-protected Brain MCP smokes. |
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 source, build, and browser acceptance pass | Ten focused tests, typecheck/build, deterministic committed assets, three-section routing, read-only source checks, 1440px/900px/600px layouts, keyboard focus, workspace switching, long-label containment, and invalid-selection failure rendering pass. |
41
- | Release automation | Structurally verified | The release contract suite verifies tag and artifact gating; a manual `publish_pypi=false` rehearsal remains required. |
42
- | Distribution artifacts | Exact local candidate passes | Fresh `1.0.1` sdist/wheel build, `twine check`, and the isolated macOS packaged-wheel smoke pass. Native CI reuse on Ubuntu, macOS, and Windows remains required. |
43
- | Git tag and PyPI | Not performed by this status | Merge/CI, annotated `v1.0.1` tag, protected-environment approval, and manual publication remain release-operator actions. |
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.1 candidate evidence recorded on 2026-07-15 is:
51
+ The local v1.0.2 candidate evidence recorded on 2026-07-15 is:
50
52
 
51
- - `python3.11 -m pytest`: **617 passed** with three dependency-level Pydantic
52
- deprecation warnings and no failures.
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 fresh `tradingcodex-1.0.1` sdist and wheel built in isolation; both passed
58
- `twine check`, and the wheel passed the macOS isolated-install platform smoke
59
- with runtime version `1.0.1`.
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.1 validation, CI on the candidate commit, or the
78
- tag-bound rehearsal of the immutable patch artifacts:
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
- tagged immutable artifacts must then pass the manual `publish_pypi=false`
199
- rehearsal before publication.
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
- CI and the manual release rehearsal must run the exact uploaded artifact on
247
- Ubuntu, native macOS, and native Windows. The protected `pypi` environment and
248
- Trusted Publisher configuration must be reviewed before publication.
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.1`. After every final-commit and artifact
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.1` at that commit.
258
- 3. Rehearse the manual workflow with `publish_pypi=false` and
259
- `release_version=1.0.1`.
260
- 4. With protected-environment approval, run the same tag with
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.2", "127.0.0.1:48267")
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.2"\n', encoding="utf-8")
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.2"
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.2"
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.2"
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.1"
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.1" in checklist
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.2",
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.2",
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 test_release_publish_is_tag_bound_and_waits_for_native_wheel_smokes() -> None:
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
- native = jobs["native-platform-wheel-smoke"]
746
- assert native["needs"] == "build"
747
- assert native["runs-on"] == "${{ matrix.os }}"
748
- assert native["strategy"]["matrix"]["os"] == ["macos-latest", "windows-latest"]
749
- assert jobs["publish-pypi"]["needs"] == "native-platform-wheel-smoke"
750
- assert any("platform_wheel_smoke.py" in step.get("run", "") for step in native["steps"])
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
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: tradingcodex
3
- Version: 1.0.1
3
+ Version: 1.0.2
4
4
  Summary: Local-first investment operating system for Codex-native research and service-gated execution.
5
5
  Author: TradingCodex Authors
6
6
  License-Expression: Apache-2.0
@@ -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=validated_workspace["module_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"