crewplane 0.2.2__tar.gz → 0.3.0__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 (554) hide show
  1. {crewplane-0.2.2 → crewplane-0.3.0}/PKG-INFO +3 -3
  2. {crewplane-0.2.2 → crewplane-0.3.0}/README.md +2 -2
  3. {crewplane-0.2.2 → crewplane-0.3.0}/pyproject.toml +1 -1
  4. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/artifacts/resume/hydration.py +19 -0
  5. crewplane-0.3.0/src/crewplane/artifacts/workspace/chain_validation.py +325 -0
  6. crewplane-0.3.0/src/crewplane/artifacts/workspace/persisted_chain.py +117 -0
  7. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/artifacts/workspace/source_validation.py +22 -22
  8. crewplane-0.3.0/src/crewplane/artifacts/workspace/state/contracts.py +442 -0
  9. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/artifacts/workspace/state/expected_set.py +17 -24
  10. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/artifacts/workspace/state/fields.py +4 -0
  11. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/artifacts/workspace/state/invocations.py +40 -0
  12. crewplane-0.3.0/src/crewplane/artifacts/workspace/state/ref_contracts.py +366 -0
  13. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/artifacts/workspace/state/validation.py +45 -13
  14. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/cli/app.py +3 -3
  15. crewplane-0.3.0/src/crewplane/cli/cleanup.py +169 -0
  16. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/cli/onboarding/constants.py +1 -1
  17. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/cli/onboarding/messages.py +19 -23
  18. crewplane-0.3.0/src/crewplane/cli/onboarding/rendering_config.py +43 -0
  19. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/cli/onboarding/rendering_config_agents.py +2 -1
  20. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/cli/onboarding/rendering_config_validation.py +12 -9
  21. crewplane-0.3.0/src/crewplane/cli/onboarding/rendering_providers.py +24 -0
  22. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/cli/onboarding/rendering_workflow.py +14 -12
  23. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/cli/onboarding/runner.py +51 -42
  24. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/cli/run/execution.py +16 -4
  25. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/cli/run/execution_helpers.py +12 -8
  26. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/cli/run/workspace/disk_policy.py +19 -65
  27. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/cli/run/workspace/git_source.py +0 -12
  28. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/cli/run/workspace/repo_policy.py +6 -0
  29. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/cli/run/workspace/source_policy.py +6 -2
  30. crewplane-0.3.0/src/crewplane/cli/workspace_cleanup/__init__.py +1 -0
  31. crewplane-0.3.0/src/crewplane/cli/workspace_cleanup/context.py +198 -0
  32. crewplane-0.3.0/src/crewplane/cli/workspace_cleanup/eligibility.py +230 -0
  33. crewplane-0.3.0/src/crewplane/cli/workspace_cleanup/evidence_claims.py +384 -0
  34. crewplane-0.3.0/src/crewplane/cli/workspace_cleanup/evidence_discovery.py +160 -0
  35. crewplane-0.3.0/src/crewplane/cli/workspace_cleanup/evidence_validation.py +280 -0
  36. crewplane-0.3.0/src/crewplane/cli/workspace_cleanup/execution.py +194 -0
  37. crewplane-0.3.0/src/crewplane/cli/workspace_cleanup/run_artifacts.py +132 -0
  38. crewplane-0.3.0/src/crewplane/cli/workspace_cleanup_evidence.py +258 -0
  39. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/preflight/plan_contract_shape.py +11 -0
  40. crewplane-0.3.0/src/crewplane/core/preflight/workspace/models.py +171 -0
  41. crewplane-0.3.0/src/crewplane/core/workspace/checkout_size.py +75 -0
  42. crewplane-0.3.0/src/crewplane/core/workspace/invocation_identity.py +39 -0
  43. crewplane-0.3.0/src/crewplane/core/workspace/repository_identity.py +19 -0
  44. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/example_templates/config.yml +17 -19
  45. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/example_templates/example-templates/worktree/workspace-alternatives-example.task.md +2 -2
  46. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/example_templates/example-templates/worktree/workspace-inherited-worktree-example.task.md +2 -2
  47. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/observability/dag_graph.py +9 -5
  48. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/observability/dag_render.py +13 -2
  49. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/agent/invocation/command.py +212 -71
  50. crewplane-0.3.0/src/crewplane/runtime/agent/invocation/retry_reset.py +217 -0
  51. crewplane-0.3.0/src/crewplane/runtime/agent/process/drain.py +279 -0
  52. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/agent/process/signals.py +3 -28
  53. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/agent/process/streams.py +112 -22
  54. crewplane-0.3.0/src/crewplane/runtime/execution/deferred_cleanup.py +179 -0
  55. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/execution/provider_call/generated_file_changes.py +0 -60
  56. crewplane-0.3.0/src/crewplane/runtime/execution/provider_call/generated_file_snapshot_source.py +93 -0
  57. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/execution/provider_call/generated_files.py +164 -111
  58. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/execution/provider_call/lifecycle.py +3 -0
  59. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/execution/provider_call/workspace.py +38 -57
  60. crewplane-0.3.0/src/crewplane/runtime/execution/provider_call/workspace_worker_cancellation.py +138 -0
  61. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/execution/publication_registry.py +42 -0
  62. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/execution/review_loop/drift/guard.py +7 -4
  63. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/execution/review_loop/drift/node.py +43 -2
  64. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/execution/review_loop/types.py +5 -0
  65. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/execution/review_loop/workspace_state_paths.py +2 -2
  66. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/execution/workflow/postconditions.py +87 -25
  67. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/execution/workflow/scheduling.py +0 -5
  68. crewplane-0.3.0/src/crewplane/runtime/execution/workspace_files/__init__.py +39 -0
  69. crewplane-0.3.0/src/crewplane/runtime/execution/workspace_files/descriptors.py +59 -0
  70. crewplane-0.3.0/src/crewplane/runtime/execution/workspace_files/models.py +19 -0
  71. crewplane-0.3.0/src/crewplane/runtime/execution/workspace_files/resolution.py +290 -0
  72. crewplane-0.3.0/src/crewplane/runtime/execution/workspace_files/source_selection.py +156 -0
  73. crewplane-0.3.0/src/crewplane/runtime/execution/workspace_files/state_loading.py +50 -0
  74. crewplane-0.3.0/src/crewplane/runtime/workspace/branch_export/__init__.py +13 -0
  75. crewplane-0.3.0/src/crewplane/runtime/workspace/branch_export/attempts.py +495 -0
  76. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/workspace/branch_export/checkpoint.py +62 -19
  77. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/workspace/branch_export/fulfillment.py +14 -17
  78. crewplane-0.3.0/src/crewplane/runtime/workspace/branch_export/git.py +190 -0
  79. crewplane-0.3.0/src/crewplane/runtime/workspace/branch_export/orchestration.py +276 -0
  80. crewplane-0.3.0/src/crewplane/runtime/workspace/branch_export/reconciliation.py +333 -0
  81. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/workspace/branch_export/records.py +54 -0
  82. crewplane-0.3.0/src/crewplane/runtime/workspace/cleanup.py +529 -0
  83. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/workspace/invocation.py +5 -35
  84. crewplane-0.3.0/src/crewplane/runtime/workspace/lineage_discard.py +39 -0
  85. crewplane-0.3.0/src/crewplane/runtime/workspace/locks.py +174 -0
  86. crewplane-0.3.0/src/crewplane/runtime/workspace/materialization.py +244 -0
  87. crewplane-0.3.0/src/crewplane/runtime/workspace/mutator_fence.py +22 -0
  88. crewplane-0.3.0/src/crewplane/runtime/workspace/prepared_workspace.py +557 -0
  89. crewplane-0.3.0/src/crewplane/runtime/workspace/running_state_payload.py +230 -0
  90. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/workspace/service/common.py +9 -1
  91. crewplane-0.3.0/src/crewplane/runtime/workspace/service/retry_reset.py +142 -0
  92. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/workspace/service/snapshot.py +138 -63
  93. crewplane-0.3.0/src/crewplane/runtime/workspace/service/snapshot_failures.py +70 -0
  94. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/workspace/service/types.py +8 -1
  95. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/workspace/service/worktree.py +146 -193
  96. crewplane-0.3.0/src/crewplane/runtime/workspace/service/worktree_claims.py +113 -0
  97. crewplane-0.3.0/src/crewplane/runtime/workspace/service/worktree_failures.py +263 -0
  98. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/workspace/setup.py +71 -27
  99. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/workspace/snapshot.py +2 -0
  100. crewplane-0.3.0/src/crewplane/runtime/workspace/snapshot_reporting.py +74 -0
  101. crewplane-0.3.0/src/crewplane/runtime/workspace/state.py +398 -0
  102. crewplane-0.3.0/src/crewplane/runtime/workspace/state_evidence.py +163 -0
  103. crewplane-0.3.0/src/crewplane/runtime/workspace/terminalization.py +94 -0
  104. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/workspace/worktree/cache.py +134 -29
  105. crewplane-0.3.0/src/crewplane/runtime/workspace/worktree/checkout_identity.py +97 -0
  106. crewplane-0.3.0/src/crewplane/runtime/workspace/worktree/checkout_placement.py +44 -0
  107. crewplane-0.3.0/src/crewplane/runtime/workspace/worktree/cleanup.py +375 -0
  108. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/workspace/worktree/descriptors.py +19 -0
  109. crewplane-0.3.0/src/crewplane/runtime/workspace/worktree/head.py +101 -0
  110. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/workspace/worktree/inspection.py +50 -11
  111. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/workspace/worktree/lineage.py +241 -219
  112. crewplane-0.3.0/src/crewplane/runtime/workspace/worktree/materialization.py +517 -0
  113. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/workspace/worktree/orchestration.py +243 -171
  114. crewplane-0.3.0/src/crewplane/runtime/workspace/worktree/protected_refs.py +131 -0
  115. crewplane-0.3.0/src/crewplane/runtime/workspace/worktree/ref_cleanup.py +557 -0
  116. crewplane-0.3.0/src/crewplane/runtime/workspace/worktree/ref_publication.py +444 -0
  117. crewplane-0.3.0/src/crewplane/runtime/workspace/worktree/removal.py +131 -0
  118. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/workspace/worktree/reset.py +116 -34
  119. crewplane-0.3.0/src/crewplane/runtime/workspace/worktree/result_validation.py +151 -0
  120. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/workspace/worktree/reuse.py +22 -6
  121. crewplane-0.3.0/src/crewplane/runtime/workspace/worktree/temporary_refs.py +397 -0
  122. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/workspace/worktree/types.py +10 -0
  123. crewplane-0.2.2/src/crewplane/cli/cleanup.py +0 -604
  124. crewplane-0.2.2/src/crewplane/cli/onboarding/rendering_config.py +0 -37
  125. crewplane-0.2.2/src/crewplane/cli/onboarding/rendering_providers.py +0 -21
  126. crewplane-0.2.2/src/crewplane/core/preflight/workspace/models.py +0 -113
  127. crewplane-0.2.2/src/crewplane/runtime/agent/invocation/retry_reset.py +0 -32
  128. crewplane-0.2.2/src/crewplane/runtime/execution/deferred_cleanup.py +0 -115
  129. crewplane-0.2.2/src/crewplane/runtime/execution/workspace_files/__init__.py +0 -413
  130. crewplane-0.2.2/src/crewplane/runtime/workspace/branch_export/__init__.py +0 -389
  131. crewplane-0.2.2/src/crewplane/runtime/workspace/branch_export/git.py +0 -141
  132. crewplane-0.2.2/src/crewplane/runtime/workspace/cleanup.py +0 -295
  133. crewplane-0.2.2/src/crewplane/runtime/workspace/locks.py +0 -89
  134. crewplane-0.2.2/src/crewplane/runtime/workspace/materialization.py +0 -42
  135. crewplane-0.2.2/src/crewplane/runtime/workspace/prepared_workspace.py +0 -422
  136. crewplane-0.2.2/src/crewplane/runtime/workspace/service/worktree_failures.py +0 -136
  137. crewplane-0.2.2/src/crewplane/runtime/workspace/state.py +0 -365
  138. crewplane-0.2.2/src/crewplane/runtime/workspace/worktree/cleanup.py +0 -222
  139. crewplane-0.2.2/src/crewplane/runtime/workspace/worktree/materialization.py +0 -139
  140. crewplane-0.2.2/src/crewplane/runtime/workspace/worktree/protected_refs.py +0 -79
  141. crewplane-0.2.2/src/crewplane/runtime/workspace/worktree/ref_cleanup.py +0 -79
  142. crewplane-0.2.2/src/crewplane/runtime/workspace/worktree/result_validation.py +0 -52
  143. {crewplane-0.2.2 → crewplane-0.3.0}/.gitignore +0 -0
  144. {crewplane-0.2.2 → crewplane-0.3.0}/LICENSE +0 -0
  145. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/__init__.py +0 -0
  146. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/adapters/__init__.py +0 -0
  147. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/adapters/artifacts/__init__.py +0 -0
  148. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/adapters/artifacts/filesystem.py +0 -0
  149. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/adapters/artifacts/terminal_history.py +0 -0
  150. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/adapters/invokers/__init__.py +0 -0
  151. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/adapters/invokers/cli.py +0 -0
  152. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/adapters/invokers/cli_invoker/__init__.py +0 -0
  153. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/adapters/invokers/cli_invoker/capabilities.py +0 -0
  154. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/adapters/invokers/cli_invoker/claude_json.py +0 -0
  155. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/adapters/invokers/cli_invoker/claude_json_parser.py +0 -0
  156. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/adapters/invokers/cli_invoker/env_command.py +0 -0
  157. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/adapters/invokers/cli_invoker/json_number.py +0 -0
  158. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/adapters/invokers/cli_invoker/machine_json.py +0 -0
  159. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/adapters/invokers/cli_invoker/reasoning.py +0 -0
  160. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/adapters/invokers/cli_invoker/streaming.py +0 -0
  161. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/adapters/invokers/cli_invoker/usage_decoders.py +0 -0
  162. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/adapters/invokers/mock.py +0 -0
  163. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/adapters/invokers/mock_invoker/__init__.py +0 -0
  164. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/adapters/invokers/mock_invoker/context.py +0 -0
  165. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/adapters/invokers/mock_invoker/fixtures.py +0 -0
  166. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/adapters/invokers/mock_invoker/invoker.py +0 -0
  167. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/adapters/invokers/mock_invoker/logging.py +0 -0
  168. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/adapters/invokers/mock_invoker/mutations.py +0 -0
  169. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/adapters/invokers/mock_invoker/options.py +0 -0
  170. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/adapters/invokers/mock_invoker/outputs.py +0 -0
  171. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/adapters/invokers/mock_invoker/selectors.py +0 -0
  172. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/adapters/ui/__init__.py +0 -0
  173. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/adapters/ui/null.py +0 -0
  174. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/adapters/ui/tmux.py +0 -0
  175. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/architecture/__init__.py +0 -0
  176. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/architecture/contracts/__init__.py +0 -0
  177. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/architecture/contracts/artifacts.py +0 -0
  178. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/architecture/contracts/execution_event.py +0 -0
  179. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/architecture/contracts/integration.py +0 -0
  180. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/architecture/contracts/integration_options.py +0 -0
  181. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/architecture/contracts/integration_secrets.py +0 -0
  182. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/architecture/contracts/invocation.py +0 -0
  183. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/architecture/contracts/json.py +0 -0
  184. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/architecture/contracts/observer.py +0 -0
  185. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/architecture/errors.py +0 -0
  186. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/architecture/loader.py +0 -0
  187. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/architecture/ports/__init__.py +0 -0
  188. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/architecture/ports/artifacts.py +0 -0
  189. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/architecture/ports/invoker.py +0 -0
  190. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/architecture/ports/options.py +0 -0
  191. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/architecture/ports/runtime.py +0 -0
  192. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/architecture/ports/ui.py +0 -0
  193. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/architecture/registry.py +0 -0
  194. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/architecture/safe_files.py +0 -0
  195. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/artifacts/__init__.py +0 -0
  196. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/artifacts/atomic.py +0 -0
  197. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/artifacts/directory_manager.py +0 -0
  198. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/artifacts/failure_artifacts.py +0 -0
  199. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/artifacts/generated_files/__init__.py +0 -0
  200. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/artifacts/generated_files/catalog.py +0 -0
  201. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/artifacts/generated_files/detection.py +0 -0
  202. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/artifacts/generated_files/snapshot_io.py +0 -0
  203. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/artifacts/generated_files/snapshot_policy.py +0 -0
  204. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/artifacts/locks/__init__.py +0 -0
  205. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/artifacts/locks/manifest.py +0 -0
  206. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/artifacts/locks/process_identity.py +0 -0
  207. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/artifacts/locks/provider_processes.py +0 -0
  208. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/artifacts/manager.py +0 -0
  209. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/artifacts/naming.py +0 -0
  210. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/artifacts/provider_process_publisher.py +0 -0
  211. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/artifacts/results/__init__.py +0 -0
  212. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/artifacts/results/aggregation.py +0 -0
  213. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/artifacts/results/findings.py +0 -0
  214. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/artifacts/results/review_loop_status.py +0 -0
  215. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/artifacts/results/selection.py +0 -0
  216. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/artifacts/results/stage_document.py +0 -0
  217. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/artifacts/results/stage_outputs.py +0 -0
  218. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/artifacts/results/writer.py +0 -0
  219. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/artifacts/resume/__init__.py +0 -0
  220. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/artifacts/resume/decision.py +0 -0
  221. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/artifacts/resume/generated_files.py +0 -0
  222. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/artifacts/resume/validation.py +0 -0
  223. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/artifacts/resume/verified_copy.py +0 -0
  224. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/artifacts/run_history.py +0 -0
  225. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/artifacts/verification.py +0 -0
  226. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/artifacts/workspace/__init__.py +0 -0
  227. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/artifacts/workspace/bundle_validation.py +0 -0
  228. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/artifacts/workspace/git_blob_hash.py +0 -0
  229. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/artifacts/workspace/node_state.py +0 -0
  230. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/artifacts/workspace/rendered_file_validation.py +0 -0
  231. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/artifacts/workspace/state/__init__.py +0 -0
  232. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/artifacts/workspace/state/lineage.py +0 -0
  233. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/bootstrap/__init__.py +0 -0
  234. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/bootstrap/container.py +0 -0
  235. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/bootstrap/runtime_config.py +0 -0
  236. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/cli/__init__.py +0 -0
  237. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/cli/dry_run.py +0 -0
  238. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/cli/onboarding/__init__.py +0 -0
  239. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/cli/onboarding/history.py +0 -0
  240. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/cli/onboarding/rendering.py +0 -0
  241. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/cli/onboarding/rendering_config_invoker.py +0 -0
  242. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/cli/onboarding/rendering_defaults.py +0 -0
  243. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/cli/onboarding/rendering_errors.py +0 -0
  244. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/cli/onboarding/rendering_yaml_blocks.py +0 -0
  245. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/cli/onboarding/rendering_yaml_loading.py +0 -0
  246. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/cli/paths.py +0 -0
  247. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/cli/project_init.py +0 -0
  248. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/cli/run/__init__.py +0 -0
  249. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/cli/run/best_effort_thread.py +0 -0
  250. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/cli/run/branch_export_output.py +0 -0
  251. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/cli/run/components.py +0 -0
  252. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/cli/run/context.py +0 -0
  253. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/cli/run/historical_summary.py +0 -0
  254. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/cli/run/manifest.py +0 -0
  255. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/cli/run/observability.py +0 -0
  256. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/cli/run/preflight.py +0 -0
  257. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/cli/run/preflight_success.py +0 -0
  258. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/cli/run/resume.py +0 -0
  259. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/cli/run/terminalization.py +0 -0
  260. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/cli/run/topology.py +0 -0
  261. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/cli/run/workspace/__init__.py +0 -0
  262. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/cli/run/workspace/cache_policy.py +0 -0
  263. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/cli/run/workspace/diagnostic_text.py +0 -0
  264. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/cli/run/workspace/filesystem_policy.py +0 -0
  265. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/cli/run/workspace/git_attributes.py +0 -0
  266. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/cli/run/workspace/git_index.py +0 -0
  267. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/cli/run/workspace/preflight_diagnostics.py +0 -0
  268. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/cli/run/workspace/source_types.py +0 -0
  269. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/cli/templates.py +0 -0
  270. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/cli/update/__init__.py +0 -0
  271. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/cli/update/detection.py +0 -0
  272. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/cli/update/runner.py +0 -0
  273. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/cli/update/types.py +0 -0
  274. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/cli/workflow_runner.py +0 -0
  275. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/__init__.py +0 -0
  276. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/config.py +0 -0
  277. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/execution_state.py +0 -0
  278. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/file_hashing.py +0 -0
  279. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/platform.py +0 -0
  280. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/preflight/__init__.py +0 -0
  281. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/preflight/compile_state.py +0 -0
  282. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/preflight/compiler.py +0 -0
  283. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/preflight/dependency_edges.py +0 -0
  284. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/preflight/diagnostics.py +0 -0
  285. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/preflight/execution_nodes.py +0 -0
  286. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/preflight/fragment_handlers.py +0 -0
  287. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/preflight/input_sources.py +0 -0
  288. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/preflight/models.py +0 -0
  289. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/preflight/plan_contract.py +0 -0
  290. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/preflight/plan_contract_artifacts.py +0 -0
  291. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/preflight/plan_contract_dependencies.py +0 -0
  292. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/preflight/plan_contract_nodes.py +0 -0
  293. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/preflight/plan_contract_records.py +0 -0
  294. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/preflight/plan_contract_workspace_lineage.py +0 -0
  295. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/preflight/plan_contract_workspace_locators.py +0 -0
  296. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/preflight/plan_signatures.py +0 -0
  297. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/preflight/prompt_transport_warnings.py +0 -0
  298. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/preflight/references.py +0 -0
  299. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/preflight/render_plans.py +0 -0
  300. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/preflight/runner.py +0 -0
  301. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/preflight/runtime_config/__init__.py +0 -0
  302. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/preflight/runtime_config/redaction.py +0 -0
  303. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/preflight/secrets.py +0 -0
  304. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/preflight/serialization.py +0 -0
  305. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/preflight/signatures.py +0 -0
  306. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/preflight/source.py +0 -0
  307. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/preflight/static_resources.py +0 -0
  308. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/preflight/token_catalog.py +0 -0
  309. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/preflight/validation.py +0 -0
  310. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/preflight/value_fingerprints.py +0 -0
  311. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/preflight/variables.py +0 -0
  312. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/preflight/workspace/__init__.py +0 -0
  313. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/preflight/workspace/files/__init__.py +0 -0
  314. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/preflight/workspace/files/git_reads.py +0 -0
  315. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/preflight/workspace/files/locators.py +0 -0
  316. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/preflight/workspace/files/paths.py +0 -0
  317. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/preflight/workspace/files/selection.py +0 -0
  318. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/preflight/workspace/observability.py +0 -0
  319. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/preflight/workspace/records.py +0 -0
  320. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/preflight/workspace/snapshot_guard.py +0 -0
  321. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/prompt_segments.py +0 -0
  322. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/provider_names.py +0 -0
  323. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/provider_process_state.py +0 -0
  324. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/review_contract.py +0 -0
  325. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/state_paths.py +0 -0
  326. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/token_budget.py +0 -0
  327. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/value_checks.py +0 -0
  328. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/workflow/__init__.py +0 -0
  329. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/workflow/composition/__init__.py +0 -0
  330. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/workflow/composition/imports.py +0 -0
  331. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/workflow/composition/models.py +0 -0
  332. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/workflow/composition/nodes.py +0 -0
  333. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/workflow/composition/parsing.py +0 -0
  334. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/workflow/composition/rewrites.py +0 -0
  335. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/workflow/composition/traversal.py +0 -0
  336. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/workflow/diagnostics.py +0 -0
  337. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/workflow/graph.py +0 -0
  338. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/workflow/keywords.py +0 -0
  339. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/workflow/loading.py +0 -0
  340. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/workflow/markdown/__init__.py +0 -0
  341. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/workflow/markdown/frontmatter.py +0 -0
  342. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/workflow/markdown/markers.py +0 -0
  343. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/workflow/markdown/models.py +0 -0
  344. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/workflow/markdown/payloads.py +0 -0
  345. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/workflow/markdown/sections.py +0 -0
  346. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/workflow/models.py +0 -0
  347. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/workflow/normalization.py +0 -0
  348. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/workflow/source_locations.py +0 -0
  349. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/workflow/syntax.py +0 -0
  350. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/workflow/validation/__init__.py +0 -0
  351. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/workflow/validation/api.py +0 -0
  352. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/workflow/validation/modes.py +0 -0
  353. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/workflow/validation/nodes.py +0 -0
  354. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/workflow/validation/policies.py +0 -0
  355. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/workflow/validation/templates.py +0 -0
  356. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/workflow/validation/workspace.py +0 -0
  357. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/workflow/validation/workspace_diagnostics.py +0 -0
  358. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/workspace/__init__.py +0 -0
  359. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/workspace/cache.py +0 -0
  360. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/workspace/git_policy.py +0 -0
  361. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/workspace/policy.py +0 -0
  362. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/workspace/selection.py +0 -0
  363. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/workspace/settings.py +0 -0
  364. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/yaml_loader.py +0 -0
  365. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/example_templates/example-templates/code-review-example.task.md +0 -0
  366. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/example_templates/example-templates/composition/review-findings-producer-example.task.md +0 -0
  367. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/example_templates/example-templates/composition/review-fix-composed-example.task.md +0 -0
  368. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/example_templates/example-templates/composition/review-fix-consumer-example.task.md +0 -0
  369. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/example_templates/example-templates/design-review-example.task.md +0 -0
  370. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/example_templates/example-templates/feature-implement-example.task.md +0 -0
  371. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/example_templates/example-templates/multi-executor-review-chain-example.task.md +0 -0
  372. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/example_templates/example-templates/refactoring-example.task.md +0 -0
  373. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/example_templates/example-templates/sample-inputs/coding-standards.md +0 -0
  374. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/example_templates/example-templates/sample-inputs/feature-brief.md +0 -0
  375. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/example_templates/example-templates/sample-inputs/review-findings.md +0 -0
  376. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/example_templates/example-templates/test-generation-example.task.md +0 -0
  377. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/example_templates/single-agent-review.task.md +0 -0
  378. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/observability/__init__.py +0 -0
  379. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/observability/events/__init__.py +0 -0
  380. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/observability/events/builders.py +0 -0
  381. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/observability/events/dashboard_state.py +0 -0
  382. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/observability/events/execution_event.py +0 -0
  383. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/observability/events/log.py +0 -0
  384. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/observability/events/payloads.py +0 -0
  385. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/observability/events/reader.py +0 -0
  386. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/observability/events/reducer.py +0 -0
  387. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/observability/events/types.py +0 -0
  388. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/observability/layout.py +0 -0
  389. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/observability/log_headers.py +0 -0
  390. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/observability/log_presentation/__init__.py +0 -0
  391. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/observability/log_presentation/follow.py +0 -0
  392. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/observability/log_presentation/formatters.py +0 -0
  393. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/observability/log_presentation/json_extract.py +0 -0
  394. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/observability/log_presentation/limits.py +0 -0
  395. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/observability/log_presentation/models.py +0 -0
  396. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/observability/log_presentation/sanitize.py +0 -0
  397. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/observability/log_presentation/tail.py +0 -0
  398. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/observability/log_presentation/throttle.py +0 -0
  399. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/observability/log_stream.py +0 -0
  400. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/observability/node_order.py +0 -0
  401. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/observability/observer.py +0 -0
  402. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/observability/observer_lifecycle.py +0 -0
  403. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/observability/persistent.py +0 -0
  404. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/observability/render/__init__.py +0 -0
  405. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/observability/render/cells.py +0 -0
  406. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/observability/render/header.py +0 -0
  407. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/observability/render/text.py +0 -0
  408. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/observability/render/timeline.py +0 -0
  409. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/observability/render/viewport.py +0 -0
  410. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/observability/run_summary/accumulator.py +0 -0
  411. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/observability/run_summary/builder.py +0 -0
  412. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/observability/run_summary/formatting.py +0 -0
  413. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/observability/run_summary/issues.py +0 -0
  414. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/observability/run_summary/logger.py +0 -0
  415. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/observability/run_summary/markdown.py +0 -0
  416. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/observability/run_summary/models.py +0 -0
  417. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/observability/run_summary/spend.py +0 -0
  418. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/observability/run_summary/terminal.py +0 -0
  419. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/observability/run_summary/workspace.py +0 -0
  420. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/observability/run_summary/workspace_readers.py +0 -0
  421. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/observability/run_summary/workspace_state_paths.py +0 -0
  422. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/observability/run_summary/workspace_values.py +0 -0
  423. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/observability/runtime.py +0 -0
  424. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/observability/status_icons.py +0 -0
  425. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/observability/text_layout.py +0 -0
  426. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/observability/timing.py +0 -0
  427. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/observability/tmux/__init__.py +0 -0
  428. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/observability/tmux/bindings.py +0 -0
  429. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/observability/tmux/client.py +0 -0
  430. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/observability/tmux/commands.py +0 -0
  431. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/observability/tmux/compact.py +0 -0
  432. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/observability/tmux/control_state.py +0 -0
  433. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/observability/tmux/inspect_control.py +0 -0
  434. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/observability/tmux/inspect_launcher.py +0 -0
  435. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/observability/tmux/inspect_snapshot.py +0 -0
  436. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/observability/tmux/labels.py +0 -0
  437. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/observability/tmux/log_tail.py +0 -0
  438. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/observability/tmux/refresh.py +0 -0
  439. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/observability/tmux/rendering.py +0 -0
  440. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/observability/tmux/runtime.py +0 -0
  441. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/observability/tmux/runtime_files.py +0 -0
  442. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/observability/tmux/selected_invocation.py +0 -0
  443. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/observability/tmux/selection.py +0 -0
  444. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/observability/tmux/selection_control.py +0 -0
  445. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/observability/tmux/session.py +0 -0
  446. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/observability/tmux/session_lifecycle.py +0 -0
  447. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/observability/tmux/shell_commands.py +0 -0
  448. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/observability/tmux/snapshot_types.py +0 -0
  449. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/observability/tmux/viewport.py +0 -0
  450. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/observability/tmux/warnings.py +0 -0
  451. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/observability/tmux/window.py +0 -0
  452. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/observability/types.py +0 -0
  453. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/py.typed +0 -0
  454. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/__init__.py +0 -0
  455. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/agent/__init__.py +0 -0
  456. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/agent/failures/__init__.py +0 -0
  457. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/agent/failures/classifier.py +0 -0
  458. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/agent/failures/evidence.py +0 -0
  459. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/agent/failures/formatting.py +0 -0
  460. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/agent/failures/patterns.py +0 -0
  461. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/agent/failures/types.py +0 -0
  462. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/agent/invocation/loop.py +0 -0
  463. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/agent/invocation/output.py +0 -0
  464. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/agent/invocation/retry.py +0 -0
  465. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/agent/invocation/state.py +0 -0
  466. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/agent/invocation/telemetry.py +0 -0
  467. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/agent/invocation/transitions.py +0 -0
  468. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/agent/invoker.py +0 -0
  469. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/agent/process/diagnostics.py +0 -0
  470. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/agent/process/log_rendering.py +0 -0
  471. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/agent/process/runner.py +0 -0
  472. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/agent/process/stream_capture.py +0 -0
  473. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/agent/quota/__init__.py +0 -0
  474. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/agent/quota/classifier.py +0 -0
  475. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/agent/quota/evidence.py +0 -0
  476. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/agent/quota/lexicons.py +0 -0
  477. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/agent/quota/waits.py +0 -0
  478. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/agent/retry_units.py +0 -0
  479. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/agent/usage.py +0 -0
  480. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/agent/usage_costs.py +0 -0
  481. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/agent/usage_types.py +0 -0
  482. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/agent/workspace_environment.py +0 -0
  483. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/execution/__init__.py +0 -0
  484. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/execution/activity/__init__.py +0 -0
  485. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/execution/activity/console.py +0 -0
  486. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/execution/activity/events.py +0 -0
  487. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/execution/activity/telemetry.py +0 -0
  488. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/execution/common.py +0 -0
  489. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/execution/consensus.py +0 -0
  490. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/execution/errors.py +0 -0
  491. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/execution/fragment_assembler.py +0 -0
  492. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/execution/input.py +0 -0
  493. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/execution/log_presentation.py +0 -0
  494. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/execution/parallel.py +0 -0
  495. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/execution/prompt_budgeting.py +0 -0
  496. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/execution/provider_call/__init__.py +0 -0
  497. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/execution/provider_call/artifact_capture.py +0 -0
  498. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/execution/provider_call/cancellation.py +0 -0
  499. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/execution/provider_call/display.py +0 -0
  500. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/execution/provider_call/events.py +0 -0
  501. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/execution/provider_call/lifecycle_state.py +0 -0
  502. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/execution/provider_call/provider_output.py +0 -0
  503. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/execution/provider_call/types.py +0 -0
  504. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/execution/resume.py +0 -0
  505. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/execution/review_loop/__init__.py +0 -0
  506. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/execution/review_loop/audit_round.py +0 -0
  507. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/execution/review_loop/drift/__init__.py +0 -0
  508. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/execution/review_loop/drift/capture.py +0 -0
  509. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/execution/review_loop/drift/comparison.py +0 -0
  510. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/execution/review_loop/drift/detection.py +0 -0
  511. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/execution/review_loop/drift/events.py +0 -0
  512. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/execution/review_loop/drift/recovery.py +0 -0
  513. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/execution/review_loop/drift/reserved.py +0 -0
  514. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/execution/review_loop/drift/snapshots.py +0 -0
  515. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/execution/review_loop/executor_round.py +0 -0
  516. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/execution/review_loop/orchestration.py +0 -0
  517. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/execution/review_loop/policy.py +0 -0
  518. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/execution/review_loop/prompts.py +0 -0
  519. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/execution/review_loop/reviewer_round.py +0 -0
  520. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/execution/review_loop/rounds.py +0 -0
  521. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/execution/review_loop/state.py +0 -0
  522. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/execution/review_loop/validation.py +0 -0
  523. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/execution/reviews/__init__.py +0 -0
  524. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/execution/reviews/consensus.py +0 -0
  525. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/execution/reviews/fingerprints.py +0 -0
  526. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/execution/reviews/markdown.py +0 -0
  527. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/execution/reviews/plain_language.py +0 -0
  528. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/execution/reviews/structured.py +0 -0
  529. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/execution/reviews/types.py +0 -0
  530. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/execution/runtime_context.py +0 -0
  531. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/execution/sequential.py +0 -0
  532. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/execution/stage_finalize_events.py +0 -0
  533. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/execution/stage_tasks.py +0 -0
  534. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/execution/workflow/__init__.py +0 -0
  535. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/execution/workflow/cleanup.py +0 -0
  536. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/execution/workflow/execution_session.py +0 -0
  537. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/execution/workflow/node.py +0 -0
  538. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/execution/workflow/orchestration.py +0 -0
  539. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/execution/workflow/state.py +0 -0
  540. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/execution/workspace_files/generated.py +0 -0
  541. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/execution/workspace_files/source_resolution.py +0 -0
  542. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/workspace/__init__.py +0 -0
  543. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/workspace/cleanup_notes.py +0 -0
  544. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/workspace/git.py +0 -0
  545. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/workspace/plan_nodes.py +0 -0
  546. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/workspace/service/__init__.py +0 -0
  547. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/workspace/state_selection.py +0 -0
  548. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/workspace/worktree/__init__.py +0 -0
  549. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/workspace/worktree/attributes.py +0 -0
  550. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/workspace/worktree/commit.py +0 -0
  551. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/workspace/worktree/policy.py +0 -0
  552. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/workspace/worktree/refs.py +0 -0
  553. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/workspace/worktree/source_refs.py +0 -0
  554. {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/version.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: crewplane
3
- Version: 0.2.2
3
+ Version: 0.3.0
4
4
  Summary: A provider-neutral CLI-first control plane for human-designed coding-agent workflows
5
5
  Project-URL: Homepage, https://github.com/crewplaneai/crewplane
6
6
  Project-URL: Repository, https://github.com/crewplaneai/crewplane
@@ -175,7 +175,7 @@ structure is the same one used for provider-backed workflows, so you can see how
175
175
  Crewplane validates stages, passes work forward, and records the run before
176
176
  connecting a real agent.
177
177
 
178
- Ready to put one of the CLIs already installed on your machine behind the
178
+ Ready to put the CLIs already installed on your machine behind the
179
179
  workflow?
180
180
 
181
181
  ```bash
@@ -184,7 +184,7 @@ crewplane run
184
184
  ```
185
185
 
186
186
  `crewplane onboarding` finds the supported provider CLIs already installed on
187
- your machine, lets you choose one, and configures Crewplane to use it.
187
+ your machine, lets you choose one or more, and configures Crewplane to use them.
188
188
  ***Crewplane does not install provider software or manage provider credentials.***
189
189
 
190
190
  <details>
@@ -143,7 +143,7 @@ structure is the same one used for provider-backed workflows, so you can see how
143
143
  Crewplane validates stages, passes work forward, and records the run before
144
144
  connecting a real agent.
145
145
 
146
- Ready to put one of the CLIs already installed on your machine behind the
146
+ Ready to put the CLIs already installed on your machine behind the
147
147
  workflow?
148
148
 
149
149
  ```bash
@@ -152,7 +152,7 @@ crewplane run
152
152
  ```
153
153
 
154
154
  `crewplane onboarding` finds the supported provider CLIs already installed on
155
- your machine, lets you choose one, and configures Crewplane to use it.
155
+ your machine, lets you choose one or more, and configures Crewplane to use them.
156
156
  ***Crewplane does not install provider software or manage provider credentials.***
157
157
 
158
158
  <details>
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "crewplane"
3
- version = "0.2.2"
3
+ version = "0.3.0"
4
4
  description = "A provider-neutral CLI-first control plane for human-designed coding-agent workflows"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.13"
@@ -385,10 +385,14 @@ def _workspace_state_resume_origin(
385
385
  execution = state.get("execution")
386
386
  if isinstance(execution, Mapping):
387
387
  origin["source_execution"] = _json_object(execution)
388
+ source_resume_origin = state.get("resume_origin")
389
+ if isinstance(source_resume_origin, Mapping):
390
+ origin["source_resume_origin"] = _json_object(source_resume_origin)
388
391
  return origin
389
392
 
390
393
 
391
394
  def _scrub_workspace_state_placement(state: dict[str, object]) -> None:
395
+ _reject_unresolved_source_workspace_claims(state)
392
396
  workspace = state.get("workspace")
393
397
  if isinstance(workspace, dict):
394
398
  workspace["path"] = None
@@ -404,6 +408,21 @@ def _scrub_workspace_state_placement(state: dict[str, object]) -> None:
404
408
  execution["workspace_path"] = None
405
409
  execution["checkout_root"] = None
406
410
  execution["effective_cwd"] = None
411
+ execution["worktree_git_dir"] = None
412
+ state.pop("temporary_refs", None)
413
+ state.pop("ref_publication", None)
414
+
415
+
416
+ def _reject_unresolved_source_workspace_claims(state: dict[str, object]) -> None:
417
+ temporary_refs = state.get("temporary_refs")
418
+ if isinstance(temporary_refs, list) and any(
419
+ isinstance(claim, dict) and claim.get("phase") != "removed"
420
+ for claim in temporary_refs
421
+ ):
422
+ raise ValueError("Workspace state has unresolved source temporary refs.")
423
+ publication = state.get("ref_publication")
424
+ if isinstance(publication, dict) and publication.get("phase") == "prepared":
425
+ raise ValueError("Workspace state has unresolved source ref publication.")
407
426
 
408
427
 
409
428
  def _json_object(value: Mapping[str, object]) -> JsonObject:
@@ -0,0 +1,325 @@
1
+ from __future__ import annotations
2
+
3
+ import stat
4
+ import subprocess
5
+ from collections.abc import Mapping, Sequence
6
+ from pathlib import Path
7
+ from tempfile import TemporaryDirectory
8
+ from typing import Protocol, Self
9
+
10
+ from crewplane.core.file_hashing import file_size_and_sha256
11
+ from crewplane.core.preflight.models import WorkspaceSourceSnapshot
12
+ from crewplane.core.workspace.git_policy import workspace_git_config_args
13
+
14
+ from .bundle_validation import (
15
+ GIT_BUNDLE_VALIDATION_TIMEOUT_SECONDS,
16
+ sanitized_bundle_git_environment,
17
+ )
18
+ from .persisted_chain import workspace_result_descriptor_from_payload
19
+
20
+
21
+ class WorkspaceSourceDescriptor(Protocol):
22
+ @property
23
+ def source_kind(self) -> str: ...
24
+
25
+ @property
26
+ def source_node_id(self) -> str | None: ...
27
+
28
+ @property
29
+ def source_commit(self) -> str: ...
30
+
31
+ @property
32
+ def source_tree(self) -> str: ...
33
+
34
+ @property
35
+ def bundle_path(self) -> Path | None: ...
36
+
37
+ @property
38
+ def bundle_sha256(self) -> str | None: ...
39
+
40
+ @property
41
+ def bundle_size_bytes(self) -> int | None: ...
42
+
43
+ @property
44
+ def bundle_ref(self) -> str | None: ...
45
+
46
+ @property
47
+ def upstream_sources(self) -> Sequence[Self]: ...
48
+
49
+
50
+ def verify_persisted_workspace_result_chain(
51
+ source: WorkspaceSourceSnapshot,
52
+ run_dir: Path,
53
+ payload: Mapping[str, object],
54
+ ) -> None:
55
+ """Verify a persisted node result and its recursive workspace source chain.
56
+
57
+ Bundle paths are decoded relative to ``run_dir`` before verification in an
58
+ isolated bare Git repository. Invalid payloads or lineage raise
59
+ ``RuntimeError``; Git command failures propagate as subprocess errors.
60
+ """
61
+
62
+ descriptor = workspace_result_descriptor_from_payload(
63
+ run_dir,
64
+ payload,
65
+ )
66
+ verify_workspace_source_chain(source, descriptor)
67
+
68
+
69
+ def verify_workspace_source_chain(
70
+ source: WorkspaceSourceSnapshot,
71
+ source_ref: WorkspaceSourceDescriptor,
72
+ ) -> None:
73
+ """Verify a project, node, or candidate source chain in isolation.
74
+
75
+ A temporary bare repository is seeded with the recorded project base before
76
+ validated bundles are imported in dependency order. Contradictory
77
+ descriptors or invalid lineage raise ``RuntimeError``; Git command failures
78
+ propagate as subprocess errors.
79
+ """
80
+
81
+ with TemporaryDirectory(prefix="crewplane-chain-verify-") as temp_dir_name:
82
+ git_dir = Path(temp_dir_name) / "chain.git"
83
+ _init_bare_repository(git_dir, source.object_format)
84
+ _seed_project_base(git_dir, source)
85
+ visited: set[str] = set()
86
+ _verify_source_descriptor(git_dir, source, source_ref, set(), visited)
87
+
88
+
89
+ def _verify_source_descriptor(
90
+ git_dir: Path,
91
+ source: WorkspaceSourceSnapshot,
92
+ descriptor: WorkspaceSourceDescriptor,
93
+ active: set[str],
94
+ visited: set[str],
95
+ ) -> None:
96
+ if descriptor.source_commit in active:
97
+ raise RuntimeError("Workspace source descriptor chain contains a cycle.")
98
+ if descriptor.source_commit in visited:
99
+ return
100
+ active.add(descriptor.source_commit)
101
+ for upstream in descriptor.upstream_sources:
102
+ _verify_source_descriptor(git_dir, source, upstream, active, visited)
103
+ active.remove(descriptor.source_commit)
104
+ if descriptor.source_kind == "project":
105
+ _verify_project_descriptor(git_dir, source, descriptor)
106
+ else:
107
+ _verify_bundle_descriptor(git_dir, descriptor)
108
+ visited.add(descriptor.source_commit)
109
+
110
+
111
+ def _verify_project_descriptor(
112
+ git_dir: Path,
113
+ source: WorkspaceSourceSnapshot,
114
+ descriptor: WorkspaceSourceDescriptor,
115
+ ) -> None:
116
+ if (
117
+ descriptor.source_node_id is not None
118
+ or bool(descriptor.upstream_sources)
119
+ or descriptor.source_commit != source.run_base_commit
120
+ or descriptor.source_tree != source.source_tree
121
+ or any(
122
+ value is not None
123
+ for value in (
124
+ descriptor.bundle_path,
125
+ descriptor.bundle_sha256,
126
+ descriptor.bundle_size_bytes,
127
+ descriptor.bundle_ref,
128
+ )
129
+ )
130
+ ):
131
+ raise RuntimeError("Workspace project source descriptor is contradictory.")
132
+ _verify_commit_tree(git_dir, descriptor.source_commit, descriptor.source_tree)
133
+
134
+
135
+ def _verify_bundle_descriptor(
136
+ git_dir: Path,
137
+ descriptor: WorkspaceSourceDescriptor,
138
+ ) -> None:
139
+ if descriptor.source_kind not in {"node", "candidate"}:
140
+ raise RuntimeError("Workspace source bundle kind is invalid.")
141
+ if not descriptor.source_node_id:
142
+ raise RuntimeError("Workspace source bundle lacks a source node.")
143
+ if descriptor.bundle_ref is None:
144
+ raise RuntimeError("Workspace source bundle descriptor is incomplete.")
145
+ bundle_path = _validated_bundle_file(descriptor)
146
+ if _bundle_has_prerequisites(bundle_path):
147
+ raise RuntimeError("Workspace source bundle advertises prerequisites.")
148
+ _run_git_dir(git_dir, "bundle", "verify", bundle_path.as_posix())
149
+ _verify_offered_bundle_head(git_dir, bundle_path, descriptor)
150
+ _run_git_dir(git_dir, "bundle", "unbundle", bundle_path.as_posix())
151
+ if len(descriptor.upstream_sources) != 1:
152
+ raise RuntimeError(
153
+ "Workspace non-project source descriptor requires exactly one parent source."
154
+ )
155
+ expected_parent = descriptor.upstream_sources[0].source_commit
156
+ _verify_commit(git_dir, descriptor, expected_parent)
157
+
158
+
159
+ def _verify_offered_bundle_head(
160
+ git_dir: Path,
161
+ bundle_path: Path,
162
+ descriptor: WorkspaceSourceDescriptor,
163
+ ) -> None:
164
+ listed = (
165
+ _run_git_dir(
166
+ git_dir,
167
+ "bundle",
168
+ "list-heads",
169
+ bundle_path.as_posix(),
170
+ )
171
+ .stdout.decode("utf-8")
172
+ .splitlines()
173
+ )
174
+ if len(listed) != 1:
175
+ raise RuntimeError("Workspace source bundle must offer exactly one ref.")
176
+ object_id, separator, ref_name = listed[0].partition(" ")
177
+ if (
178
+ separator != " "
179
+ or object_id != descriptor.source_commit
180
+ or ref_name != descriptor.bundle_ref
181
+ ):
182
+ raise RuntimeError("Workspace source bundle ref or target OID mismatch.")
183
+
184
+
185
+ def _verify_commit(
186
+ git_dir: Path,
187
+ descriptor: WorkspaceSourceDescriptor,
188
+ expected_parent: str,
189
+ ) -> None:
190
+ object_type = (
191
+ _run_git_dir(
192
+ git_dir,
193
+ "cat-file",
194
+ "-t",
195
+ descriptor.source_commit,
196
+ )
197
+ .stdout.decode("utf-8")
198
+ .strip()
199
+ )
200
+ if object_type != "commit":
201
+ raise RuntimeError("Workspace source bundle result is not a commit.")
202
+ parent_record = (
203
+ _run_git_dir(
204
+ git_dir,
205
+ "rev-list",
206
+ "--parents",
207
+ "-n",
208
+ "1",
209
+ descriptor.source_commit,
210
+ )
211
+ .stdout.decode("utf-8")
212
+ .strip()
213
+ .split()
214
+ )
215
+ if parent_record != [descriptor.source_commit, expected_parent]:
216
+ raise RuntimeError("Workspace source bundle result has an unexpected parent.")
217
+ _verify_commit_tree(git_dir, descriptor.source_commit, descriptor.source_tree)
218
+
219
+
220
+ def _verify_commit_tree(git_dir: Path, commit: str, expected_tree: str) -> None:
221
+ actual_tree = (
222
+ _run_git_dir(
223
+ git_dir,
224
+ "rev-parse",
225
+ f"{commit}^{{tree}}",
226
+ )
227
+ .stdout.decode("utf-8")
228
+ .strip()
229
+ )
230
+ if actual_tree != expected_tree:
231
+ raise RuntimeError("Workspace source bundle result tree mismatch.")
232
+
233
+
234
+ def _validated_bundle_file(descriptor: WorkspaceSourceDescriptor) -> Path:
235
+ path = descriptor.bundle_path
236
+ if (
237
+ path is None
238
+ or descriptor.bundle_sha256 is None
239
+ or descriptor.bundle_size_bytes is None
240
+ ):
241
+ raise RuntimeError("Workspace source bundle descriptor is incomplete.")
242
+ _verify_regular_bundle_file(path)
243
+ _verify_bundle_file_identity(path, descriptor)
244
+ return path
245
+
246
+
247
+ def _verify_regular_bundle_file(path: Path) -> None:
248
+ try:
249
+ mode = path.lstat().st_mode
250
+ file_stat = path.stat()
251
+ except OSError as exc:
252
+ raise RuntimeError("Workspace source bundle is missing or unreadable.") from exc
253
+ if stat.S_ISLNK(mode) or not stat.S_ISREG(mode) or file_stat.st_nlink != 1:
254
+ raise RuntimeError("Workspace source bundle must be a regular file.")
255
+
256
+
257
+ def _verify_bundle_file_identity(
258
+ path: Path,
259
+ descriptor: WorkspaceSourceDescriptor,
260
+ ) -> None:
261
+ size_bytes, sha256 = file_size_and_sha256(path)
262
+ if size_bytes != descriptor.bundle_size_bytes:
263
+ raise RuntimeError("Workspace source bundle size mismatch.")
264
+ if sha256 != descriptor.bundle_sha256:
265
+ raise RuntimeError("Workspace source bundle digest mismatch.")
266
+
267
+
268
+ def _bundle_has_prerequisites(bundle_path: Path) -> bool:
269
+ with bundle_path.open("rb") as handle:
270
+ signature = handle.readline()
271
+ if not signature.startswith(b"# v") or not signature.rstrip().endswith(
272
+ b"git bundle"
273
+ ):
274
+ raise RuntimeError("Workspace source bundle header is invalid.")
275
+ for line in handle:
276
+ if line in {b"\n", b"\r\n"}:
277
+ return False
278
+ if line.startswith(b"-"):
279
+ return True
280
+ raise RuntimeError("Workspace source bundle header is incomplete.")
281
+
282
+
283
+ def _init_bare_repository(git_dir: Path, object_format: str) -> None:
284
+ if object_format not in {"sha1", "sha256"}:
285
+ raise RuntimeError(f"Unsupported workspace object format: {object_format}.")
286
+ template_dir = git_dir.parent / "empty-template"
287
+ template_dir.mkdir()
288
+ _run_git(
289
+ "init",
290
+ "--bare",
291
+ f"--object-format={object_format}",
292
+ f"--template={template_dir.as_posix()}",
293
+ git_dir.as_posix(),
294
+ )
295
+
296
+
297
+ def _seed_project_base(git_dir: Path, source: WorkspaceSourceSnapshot) -> None:
298
+ seed_ref = f"refs/crewplane/verification/base-{source.run_base_commit[:24]}"
299
+ _run_git_dir(
300
+ git_dir,
301
+ "fetch",
302
+ "--no-auto-maintenance",
303
+ "--no-tags",
304
+ source.git_top_level,
305
+ f"{source.run_base_commit}:{seed_ref}",
306
+ )
307
+ _verify_commit_tree(git_dir, source.run_base_commit, source.source_tree)
308
+
309
+
310
+ def _run_git(*args: str) -> subprocess.CompletedProcess[bytes]:
311
+ return subprocess.run(
312
+ ["git", *workspace_git_config_args(), *args],
313
+ check=True,
314
+ capture_output=True,
315
+ env=sanitized_bundle_git_environment(),
316
+ timeout=GIT_BUNDLE_VALIDATION_TIMEOUT_SECONDS,
317
+ )
318
+
319
+
320
+ def _run_git_dir(git_dir: Path, *args: str) -> subprocess.CompletedProcess[bytes]:
321
+ return _run_git(
322
+ "--no-optional-locks",
323
+ f"--git-dir={git_dir.as_posix()}",
324
+ *args,
325
+ )
@@ -0,0 +1,117 @@
1
+ from __future__ import annotations
2
+
3
+ from collections.abc import Mapping
4
+ from dataclasses import dataclass
5
+ from pathlib import Path
6
+
7
+
8
+ @dataclass(frozen=True)
9
+ class PersistedWorkspaceSourceDescriptor:
10
+ source_kind: str
11
+ source_node_id: str | None
12
+ source_commit: str
13
+ source_tree: str
14
+ bundle_path: Path | None
15
+ bundle_sha256: str | None
16
+ bundle_size_bytes: int | None
17
+ bundle_ref: str | None
18
+ upstream_sources: tuple[PersistedWorkspaceSourceDescriptor, ...] = ()
19
+
20
+
21
+ def workspace_result_descriptor_from_payload(
22
+ run_dir: Path,
23
+ payload: Mapping[str, object],
24
+ ) -> PersistedWorkspaceSourceDescriptor:
25
+ """Decode a persisted workspace result and its recursive source chain."""
26
+
27
+ source_payload = _mapping(payload.get("source"))
28
+ result = _mapping(payload.get("result"))
29
+ bundle = _mapping(payload.get("bundle"))
30
+ refs = _mapping(payload.get("refs"))
31
+ return PersistedWorkspaceSourceDescriptor(
32
+ source_kind="node",
33
+ source_node_id=_required_string(payload.get("node_id")),
34
+ source_commit=_required_string(result.get("result_commit")),
35
+ source_tree=_required_string(result.get("result_tree")),
36
+ bundle_path=_contained_bundle_path(run_dir, bundle.get("path")),
37
+ bundle_sha256=_required_string(bundle.get("sha256")),
38
+ bundle_size_bytes=_required_int(bundle.get("size_bytes")),
39
+ bundle_ref=_required_string(refs.get("result")),
40
+ upstream_sources=(_source_descriptor_from_payload(run_dir, source_payload),),
41
+ )
42
+
43
+
44
+ def _source_descriptor_from_payload(
45
+ run_dir: Path,
46
+ payload: Mapping[str, object],
47
+ ) -> PersistedWorkspaceSourceDescriptor:
48
+ upstream_payloads = payload.get("upstream_sources")
49
+ if upstream_payloads is None:
50
+ upstream_payloads = []
51
+ if not isinstance(upstream_payloads, list) or not all(
52
+ isinstance(item, dict) for item in upstream_payloads
53
+ ):
54
+ raise RuntimeError("Workspace source descriptor chain is invalid.")
55
+ return PersistedWorkspaceSourceDescriptor(
56
+ source_kind=_required_string(payload.get("kind")),
57
+ source_node_id=_optional_string(payload.get("node_id")),
58
+ source_commit=_required_string(payload.get("commit")),
59
+ source_tree=_required_string(payload.get("tree")),
60
+ bundle_path=(
61
+ _contained_bundle_path(run_dir, payload.get("bundle_path"))
62
+ if payload.get("bundle_path") is not None
63
+ else None
64
+ ),
65
+ bundle_sha256=_optional_string(payload.get("bundle_sha256")),
66
+ bundle_size_bytes=_optional_int(payload.get("bundle_size_bytes")),
67
+ bundle_ref=_optional_string(payload.get("bundle_ref")),
68
+ upstream_sources=tuple(
69
+ _source_descriptor_from_payload(run_dir, item)
70
+ for item in upstream_payloads
71
+ if isinstance(item, dict)
72
+ ),
73
+ )
74
+
75
+
76
+ def _contained_bundle_path(run_dir: Path, value: object) -> Path:
77
+ relative_path = _required_string(value)
78
+ path = Path(relative_path)
79
+ if path.is_absolute() or any(part in {"", ".", ".."} for part in path.parts):
80
+ raise RuntimeError("Workspace source bundle path is unsafe.")
81
+ candidate = run_dir / path
82
+ try:
83
+ resolved_run_dir = run_dir.resolve(strict=True)
84
+ resolved_candidate = candidate.resolve(strict=True)
85
+ except OSError as exc:
86
+ raise RuntimeError("Workspace source bundle path is missing.") from exc
87
+ if not resolved_candidate.is_relative_to(resolved_run_dir):
88
+ raise RuntimeError("Workspace source bundle path escapes the run directory.")
89
+ return candidate
90
+
91
+
92
+ def _mapping(value: object) -> Mapping[str, object]:
93
+ return value if isinstance(value, dict) else {}
94
+
95
+
96
+ def _required_string(value: object) -> str:
97
+ if not isinstance(value, str) or not value:
98
+ raise RuntimeError("Workspace source descriptor lacks a required string.")
99
+ return value
100
+
101
+
102
+ def _optional_string(value: object) -> str | None:
103
+ if value is None:
104
+ return None
105
+ return _required_string(value)
106
+
107
+
108
+ def _required_int(value: object) -> int:
109
+ if not isinstance(value, int) or isinstance(value, bool) or value < 0:
110
+ raise RuntimeError("Workspace source descriptor lacks a required size.")
111
+ return value
112
+
113
+
114
+ def _optional_int(value: object) -> int | None:
115
+ if value is None:
116
+ return None
117
+ return _required_int(value)
@@ -140,7 +140,13 @@ def _candidate_source_matches(
140
140
  if payload.get("role") == ProviderRole.REVIEWER:
141
141
  source_round = round_num
142
142
  elif payload.get("role") == ProviderRole.EXECUTOR and round_num > 1:
143
- source_round = round_num - 1
143
+ candidate = _latest_lineage_payload(
144
+ workspace_state_payloads(run, node),
145
+ before=(audit_round_num.value or 0, round_num),
146
+ )
147
+ return candidate is not None and _descriptor_matches_result(
148
+ descriptor, candidate
149
+ )
144
150
  else:
145
151
  return False
146
152
  return _descriptor_matches_lineage_result(
@@ -170,15 +176,13 @@ def _descriptor_matches_lineage_result(
170
176
  if canonical_payload is not None:
171
177
  return _descriptor_matches_result(descriptor, canonical_payload)
172
178
  return False
173
- found_exact_source = False
174
- for payload in payloads:
175
- if not _lineage_payload_matches(payload, round_num, audit_round_num):
176
- continue
177
- found_exact_source = True
178
- if _descriptor_matches_result(descriptor, payload):
179
- return True
180
- if found_exact_source:
181
- return False
179
+ matches = [
180
+ payload
181
+ for payload in payloads
182
+ if _lineage_payload_matches(payload, round_num, audit_round_num)
183
+ ]
184
+ if matches:
185
+ return len(matches) == 1 and _descriptor_matches_result(descriptor, matches[0])
182
186
  seeded_source = _seeded_audit_source_payload(
183
187
  payloads,
184
188
  round_num,
@@ -276,16 +280,7 @@ def _seeded_audit_source_payload(
276
280
  ) -> dict[str, object] | None:
277
281
  if round_num != 1 or audit_round_num is None or audit_round_num <= 1:
278
282
  return None
279
- prior_payloads = [
280
- payload
281
- for payload in payloads
282
- if _lineage_payload_is_ordered_source(payload)
283
- and _lineage_payload_order(payload) < (audit_round_num, round_num)
284
- ]
285
- if not prior_payloads:
286
- return None
287
- prior_payloads.sort(key=_lineage_payload_order)
288
- return prior_payloads[-1]
283
+ return _latest_lineage_payload(payloads, before=(audit_round_num, round_num))
289
284
 
290
285
 
291
286
  def _canonical_lineage_payload(
@@ -378,8 +373,13 @@ def _latest_lineage_payload(
378
373
  ]
379
374
  if not lineage_payloads:
380
375
  return None
381
- lineage_payloads.sort(key=_lineage_payload_order)
382
- return lineage_payloads[-1]
376
+ latest_order = max(map(_lineage_payload_order, lineage_payloads))
377
+ latest = [
378
+ payload
379
+ for payload in lineage_payloads
380
+ if _lineage_payload_order(payload) == latest_order
381
+ ]
382
+ return latest[0] if len(latest) == 1 else None
383
383
 
384
384
 
385
385
  def _lineage_payload_order(payload: dict[str, object]) -> tuple[int, int]: