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.
- {crewplane-0.2.2 → crewplane-0.3.0}/PKG-INFO +3 -3
- {crewplane-0.2.2 → crewplane-0.3.0}/README.md +2 -2
- {crewplane-0.2.2 → crewplane-0.3.0}/pyproject.toml +1 -1
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/artifacts/resume/hydration.py +19 -0
- crewplane-0.3.0/src/crewplane/artifacts/workspace/chain_validation.py +325 -0
- crewplane-0.3.0/src/crewplane/artifacts/workspace/persisted_chain.py +117 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/artifacts/workspace/source_validation.py +22 -22
- crewplane-0.3.0/src/crewplane/artifacts/workspace/state/contracts.py +442 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/artifacts/workspace/state/expected_set.py +17 -24
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/artifacts/workspace/state/fields.py +4 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/artifacts/workspace/state/invocations.py +40 -0
- crewplane-0.3.0/src/crewplane/artifacts/workspace/state/ref_contracts.py +366 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/artifacts/workspace/state/validation.py +45 -13
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/cli/app.py +3 -3
- crewplane-0.3.0/src/crewplane/cli/cleanup.py +169 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/cli/onboarding/constants.py +1 -1
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/cli/onboarding/messages.py +19 -23
- crewplane-0.3.0/src/crewplane/cli/onboarding/rendering_config.py +43 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/cli/onboarding/rendering_config_agents.py +2 -1
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/cli/onboarding/rendering_config_validation.py +12 -9
- crewplane-0.3.0/src/crewplane/cli/onboarding/rendering_providers.py +24 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/cli/onboarding/rendering_workflow.py +14 -12
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/cli/onboarding/runner.py +51 -42
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/cli/run/execution.py +16 -4
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/cli/run/execution_helpers.py +12 -8
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/cli/run/workspace/disk_policy.py +19 -65
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/cli/run/workspace/git_source.py +0 -12
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/cli/run/workspace/repo_policy.py +6 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/cli/run/workspace/source_policy.py +6 -2
- crewplane-0.3.0/src/crewplane/cli/workspace_cleanup/__init__.py +1 -0
- crewplane-0.3.0/src/crewplane/cli/workspace_cleanup/context.py +198 -0
- crewplane-0.3.0/src/crewplane/cli/workspace_cleanup/eligibility.py +230 -0
- crewplane-0.3.0/src/crewplane/cli/workspace_cleanup/evidence_claims.py +384 -0
- crewplane-0.3.0/src/crewplane/cli/workspace_cleanup/evidence_discovery.py +160 -0
- crewplane-0.3.0/src/crewplane/cli/workspace_cleanup/evidence_validation.py +280 -0
- crewplane-0.3.0/src/crewplane/cli/workspace_cleanup/execution.py +194 -0
- crewplane-0.3.0/src/crewplane/cli/workspace_cleanup/run_artifacts.py +132 -0
- crewplane-0.3.0/src/crewplane/cli/workspace_cleanup_evidence.py +258 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/preflight/plan_contract_shape.py +11 -0
- crewplane-0.3.0/src/crewplane/core/preflight/workspace/models.py +171 -0
- crewplane-0.3.0/src/crewplane/core/workspace/checkout_size.py +75 -0
- crewplane-0.3.0/src/crewplane/core/workspace/invocation_identity.py +39 -0
- crewplane-0.3.0/src/crewplane/core/workspace/repository_identity.py +19 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/example_templates/config.yml +17 -19
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/example_templates/example-templates/worktree/workspace-alternatives-example.task.md +2 -2
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/example_templates/example-templates/worktree/workspace-inherited-worktree-example.task.md +2 -2
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/observability/dag_graph.py +9 -5
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/observability/dag_render.py +13 -2
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/agent/invocation/command.py +212 -71
- crewplane-0.3.0/src/crewplane/runtime/agent/invocation/retry_reset.py +217 -0
- crewplane-0.3.0/src/crewplane/runtime/agent/process/drain.py +279 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/agent/process/signals.py +3 -28
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/agent/process/streams.py +112 -22
- crewplane-0.3.0/src/crewplane/runtime/execution/deferred_cleanup.py +179 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/execution/provider_call/generated_file_changes.py +0 -60
- crewplane-0.3.0/src/crewplane/runtime/execution/provider_call/generated_file_snapshot_source.py +93 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/execution/provider_call/generated_files.py +164 -111
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/execution/provider_call/lifecycle.py +3 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/execution/provider_call/workspace.py +38 -57
- crewplane-0.3.0/src/crewplane/runtime/execution/provider_call/workspace_worker_cancellation.py +138 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/execution/publication_registry.py +42 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/execution/review_loop/drift/guard.py +7 -4
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/execution/review_loop/drift/node.py +43 -2
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/execution/review_loop/types.py +5 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/execution/review_loop/workspace_state_paths.py +2 -2
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/execution/workflow/postconditions.py +87 -25
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/execution/workflow/scheduling.py +0 -5
- crewplane-0.3.0/src/crewplane/runtime/execution/workspace_files/__init__.py +39 -0
- crewplane-0.3.0/src/crewplane/runtime/execution/workspace_files/descriptors.py +59 -0
- crewplane-0.3.0/src/crewplane/runtime/execution/workspace_files/models.py +19 -0
- crewplane-0.3.0/src/crewplane/runtime/execution/workspace_files/resolution.py +290 -0
- crewplane-0.3.0/src/crewplane/runtime/execution/workspace_files/source_selection.py +156 -0
- crewplane-0.3.0/src/crewplane/runtime/execution/workspace_files/state_loading.py +50 -0
- crewplane-0.3.0/src/crewplane/runtime/workspace/branch_export/__init__.py +13 -0
- crewplane-0.3.0/src/crewplane/runtime/workspace/branch_export/attempts.py +495 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/workspace/branch_export/checkpoint.py +62 -19
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/workspace/branch_export/fulfillment.py +14 -17
- crewplane-0.3.0/src/crewplane/runtime/workspace/branch_export/git.py +190 -0
- crewplane-0.3.0/src/crewplane/runtime/workspace/branch_export/orchestration.py +276 -0
- crewplane-0.3.0/src/crewplane/runtime/workspace/branch_export/reconciliation.py +333 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/workspace/branch_export/records.py +54 -0
- crewplane-0.3.0/src/crewplane/runtime/workspace/cleanup.py +529 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/workspace/invocation.py +5 -35
- crewplane-0.3.0/src/crewplane/runtime/workspace/lineage_discard.py +39 -0
- crewplane-0.3.0/src/crewplane/runtime/workspace/locks.py +174 -0
- crewplane-0.3.0/src/crewplane/runtime/workspace/materialization.py +244 -0
- crewplane-0.3.0/src/crewplane/runtime/workspace/mutator_fence.py +22 -0
- crewplane-0.3.0/src/crewplane/runtime/workspace/prepared_workspace.py +557 -0
- crewplane-0.3.0/src/crewplane/runtime/workspace/running_state_payload.py +230 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/workspace/service/common.py +9 -1
- crewplane-0.3.0/src/crewplane/runtime/workspace/service/retry_reset.py +142 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/workspace/service/snapshot.py +138 -63
- crewplane-0.3.0/src/crewplane/runtime/workspace/service/snapshot_failures.py +70 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/workspace/service/types.py +8 -1
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/workspace/service/worktree.py +146 -193
- crewplane-0.3.0/src/crewplane/runtime/workspace/service/worktree_claims.py +113 -0
- crewplane-0.3.0/src/crewplane/runtime/workspace/service/worktree_failures.py +263 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/workspace/setup.py +71 -27
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/workspace/snapshot.py +2 -0
- crewplane-0.3.0/src/crewplane/runtime/workspace/snapshot_reporting.py +74 -0
- crewplane-0.3.0/src/crewplane/runtime/workspace/state.py +398 -0
- crewplane-0.3.0/src/crewplane/runtime/workspace/state_evidence.py +163 -0
- crewplane-0.3.0/src/crewplane/runtime/workspace/terminalization.py +94 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/workspace/worktree/cache.py +134 -29
- crewplane-0.3.0/src/crewplane/runtime/workspace/worktree/checkout_identity.py +97 -0
- crewplane-0.3.0/src/crewplane/runtime/workspace/worktree/checkout_placement.py +44 -0
- crewplane-0.3.0/src/crewplane/runtime/workspace/worktree/cleanup.py +375 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/workspace/worktree/descriptors.py +19 -0
- crewplane-0.3.0/src/crewplane/runtime/workspace/worktree/head.py +101 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/workspace/worktree/inspection.py +50 -11
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/workspace/worktree/lineage.py +241 -219
- crewplane-0.3.0/src/crewplane/runtime/workspace/worktree/materialization.py +517 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/workspace/worktree/orchestration.py +243 -171
- crewplane-0.3.0/src/crewplane/runtime/workspace/worktree/protected_refs.py +131 -0
- crewplane-0.3.0/src/crewplane/runtime/workspace/worktree/ref_cleanup.py +557 -0
- crewplane-0.3.0/src/crewplane/runtime/workspace/worktree/ref_publication.py +444 -0
- crewplane-0.3.0/src/crewplane/runtime/workspace/worktree/removal.py +131 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/workspace/worktree/reset.py +116 -34
- crewplane-0.3.0/src/crewplane/runtime/workspace/worktree/result_validation.py +151 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/workspace/worktree/reuse.py +22 -6
- crewplane-0.3.0/src/crewplane/runtime/workspace/worktree/temporary_refs.py +397 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/workspace/worktree/types.py +10 -0
- crewplane-0.2.2/src/crewplane/cli/cleanup.py +0 -604
- crewplane-0.2.2/src/crewplane/cli/onboarding/rendering_config.py +0 -37
- crewplane-0.2.2/src/crewplane/cli/onboarding/rendering_providers.py +0 -21
- crewplane-0.2.2/src/crewplane/core/preflight/workspace/models.py +0 -113
- crewplane-0.2.2/src/crewplane/runtime/agent/invocation/retry_reset.py +0 -32
- crewplane-0.2.2/src/crewplane/runtime/execution/deferred_cleanup.py +0 -115
- crewplane-0.2.2/src/crewplane/runtime/execution/workspace_files/__init__.py +0 -413
- crewplane-0.2.2/src/crewplane/runtime/workspace/branch_export/__init__.py +0 -389
- crewplane-0.2.2/src/crewplane/runtime/workspace/branch_export/git.py +0 -141
- crewplane-0.2.2/src/crewplane/runtime/workspace/cleanup.py +0 -295
- crewplane-0.2.2/src/crewplane/runtime/workspace/locks.py +0 -89
- crewplane-0.2.2/src/crewplane/runtime/workspace/materialization.py +0 -42
- crewplane-0.2.2/src/crewplane/runtime/workspace/prepared_workspace.py +0 -422
- crewplane-0.2.2/src/crewplane/runtime/workspace/service/worktree_failures.py +0 -136
- crewplane-0.2.2/src/crewplane/runtime/workspace/state.py +0 -365
- crewplane-0.2.2/src/crewplane/runtime/workspace/worktree/cleanup.py +0 -222
- crewplane-0.2.2/src/crewplane/runtime/workspace/worktree/materialization.py +0 -139
- crewplane-0.2.2/src/crewplane/runtime/workspace/worktree/protected_refs.py +0 -79
- crewplane-0.2.2/src/crewplane/runtime/workspace/worktree/ref_cleanup.py +0 -79
- crewplane-0.2.2/src/crewplane/runtime/workspace/worktree/result_validation.py +0 -52
- {crewplane-0.2.2 → crewplane-0.3.0}/.gitignore +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/LICENSE +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/__init__.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/adapters/__init__.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/adapters/artifacts/__init__.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/adapters/artifacts/filesystem.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/adapters/artifacts/terminal_history.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/adapters/invokers/__init__.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/adapters/invokers/cli.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/adapters/invokers/cli_invoker/__init__.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/adapters/invokers/cli_invoker/capabilities.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/adapters/invokers/cli_invoker/claude_json.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/adapters/invokers/cli_invoker/claude_json_parser.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/adapters/invokers/cli_invoker/env_command.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/adapters/invokers/cli_invoker/json_number.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/adapters/invokers/cli_invoker/machine_json.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/adapters/invokers/cli_invoker/reasoning.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/adapters/invokers/cli_invoker/streaming.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/adapters/invokers/cli_invoker/usage_decoders.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/adapters/invokers/mock.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/adapters/invokers/mock_invoker/__init__.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/adapters/invokers/mock_invoker/context.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/adapters/invokers/mock_invoker/fixtures.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/adapters/invokers/mock_invoker/invoker.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/adapters/invokers/mock_invoker/logging.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/adapters/invokers/mock_invoker/mutations.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/adapters/invokers/mock_invoker/options.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/adapters/invokers/mock_invoker/outputs.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/adapters/invokers/mock_invoker/selectors.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/adapters/ui/__init__.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/adapters/ui/null.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/adapters/ui/tmux.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/architecture/__init__.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/architecture/contracts/__init__.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/architecture/contracts/artifacts.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/architecture/contracts/execution_event.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/architecture/contracts/integration.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/architecture/contracts/integration_options.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/architecture/contracts/integration_secrets.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/architecture/contracts/invocation.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/architecture/contracts/json.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/architecture/contracts/observer.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/architecture/errors.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/architecture/loader.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/architecture/ports/__init__.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/architecture/ports/artifacts.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/architecture/ports/invoker.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/architecture/ports/options.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/architecture/ports/runtime.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/architecture/ports/ui.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/architecture/registry.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/architecture/safe_files.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/artifacts/__init__.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/artifacts/atomic.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/artifacts/directory_manager.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/artifacts/failure_artifacts.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/artifacts/generated_files/__init__.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/artifacts/generated_files/catalog.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/artifacts/generated_files/detection.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/artifacts/generated_files/snapshot_io.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/artifacts/generated_files/snapshot_policy.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/artifacts/locks/__init__.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/artifacts/locks/manifest.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/artifacts/locks/process_identity.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/artifacts/locks/provider_processes.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/artifacts/manager.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/artifacts/naming.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/artifacts/provider_process_publisher.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/artifacts/results/__init__.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/artifacts/results/aggregation.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/artifacts/results/findings.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/artifacts/results/review_loop_status.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/artifacts/results/selection.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/artifacts/results/stage_document.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/artifacts/results/stage_outputs.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/artifacts/results/writer.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/artifacts/resume/__init__.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/artifacts/resume/decision.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/artifacts/resume/generated_files.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/artifacts/resume/validation.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/artifacts/resume/verified_copy.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/artifacts/run_history.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/artifacts/verification.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/artifacts/workspace/__init__.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/artifacts/workspace/bundle_validation.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/artifacts/workspace/git_blob_hash.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/artifacts/workspace/node_state.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/artifacts/workspace/rendered_file_validation.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/artifacts/workspace/state/__init__.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/artifacts/workspace/state/lineage.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/bootstrap/__init__.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/bootstrap/container.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/bootstrap/runtime_config.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/cli/__init__.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/cli/dry_run.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/cli/onboarding/__init__.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/cli/onboarding/history.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/cli/onboarding/rendering.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/cli/onboarding/rendering_config_invoker.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/cli/onboarding/rendering_defaults.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/cli/onboarding/rendering_errors.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/cli/onboarding/rendering_yaml_blocks.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/cli/onboarding/rendering_yaml_loading.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/cli/paths.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/cli/project_init.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/cli/run/__init__.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/cli/run/best_effort_thread.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/cli/run/branch_export_output.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/cli/run/components.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/cli/run/context.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/cli/run/historical_summary.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/cli/run/manifest.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/cli/run/observability.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/cli/run/preflight.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/cli/run/preflight_success.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/cli/run/resume.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/cli/run/terminalization.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/cli/run/topology.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/cli/run/workspace/__init__.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/cli/run/workspace/cache_policy.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/cli/run/workspace/diagnostic_text.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/cli/run/workspace/filesystem_policy.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/cli/run/workspace/git_attributes.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/cli/run/workspace/git_index.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/cli/run/workspace/preflight_diagnostics.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/cli/run/workspace/source_types.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/cli/templates.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/cli/update/__init__.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/cli/update/detection.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/cli/update/runner.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/cli/update/types.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/cli/workflow_runner.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/__init__.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/config.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/execution_state.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/file_hashing.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/platform.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/preflight/__init__.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/preflight/compile_state.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/preflight/compiler.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/preflight/dependency_edges.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/preflight/diagnostics.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/preflight/execution_nodes.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/preflight/fragment_handlers.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/preflight/input_sources.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/preflight/models.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/preflight/plan_contract.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/preflight/plan_contract_artifacts.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/preflight/plan_contract_dependencies.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/preflight/plan_contract_nodes.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/preflight/plan_contract_records.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/preflight/plan_contract_workspace_lineage.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/preflight/plan_contract_workspace_locators.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/preflight/plan_signatures.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/preflight/prompt_transport_warnings.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/preflight/references.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/preflight/render_plans.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/preflight/runner.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/preflight/runtime_config/__init__.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/preflight/runtime_config/redaction.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/preflight/secrets.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/preflight/serialization.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/preflight/signatures.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/preflight/source.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/preflight/static_resources.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/preflight/token_catalog.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/preflight/validation.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/preflight/value_fingerprints.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/preflight/variables.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/preflight/workspace/__init__.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/preflight/workspace/files/__init__.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/preflight/workspace/files/git_reads.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/preflight/workspace/files/locators.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/preflight/workspace/files/paths.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/preflight/workspace/files/selection.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/preflight/workspace/observability.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/preflight/workspace/records.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/preflight/workspace/snapshot_guard.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/prompt_segments.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/provider_names.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/provider_process_state.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/review_contract.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/state_paths.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/token_budget.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/value_checks.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/workflow/__init__.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/workflow/composition/__init__.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/workflow/composition/imports.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/workflow/composition/models.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/workflow/composition/nodes.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/workflow/composition/parsing.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/workflow/composition/rewrites.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/workflow/composition/traversal.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/workflow/diagnostics.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/workflow/graph.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/workflow/keywords.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/workflow/loading.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/workflow/markdown/__init__.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/workflow/markdown/frontmatter.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/workflow/markdown/markers.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/workflow/markdown/models.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/workflow/markdown/payloads.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/workflow/markdown/sections.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/workflow/models.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/workflow/normalization.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/workflow/source_locations.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/workflow/syntax.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/workflow/validation/__init__.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/workflow/validation/api.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/workflow/validation/modes.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/workflow/validation/nodes.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/workflow/validation/policies.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/workflow/validation/templates.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/workflow/validation/workspace.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/workflow/validation/workspace_diagnostics.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/workspace/__init__.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/workspace/cache.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/workspace/git_policy.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/workspace/policy.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/workspace/selection.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/workspace/settings.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/core/yaml_loader.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/example_templates/example-templates/code-review-example.task.md +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/example_templates/example-templates/composition/review-findings-producer-example.task.md +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/example_templates/example-templates/composition/review-fix-composed-example.task.md +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/example_templates/example-templates/composition/review-fix-consumer-example.task.md +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/example_templates/example-templates/design-review-example.task.md +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/example_templates/example-templates/feature-implement-example.task.md +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/example_templates/example-templates/multi-executor-review-chain-example.task.md +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/example_templates/example-templates/refactoring-example.task.md +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/example_templates/example-templates/sample-inputs/coding-standards.md +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/example_templates/example-templates/sample-inputs/feature-brief.md +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/example_templates/example-templates/sample-inputs/review-findings.md +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/example_templates/example-templates/test-generation-example.task.md +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/example_templates/single-agent-review.task.md +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/observability/__init__.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/observability/events/__init__.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/observability/events/builders.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/observability/events/dashboard_state.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/observability/events/execution_event.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/observability/events/log.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/observability/events/payloads.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/observability/events/reader.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/observability/events/reducer.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/observability/events/types.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/observability/layout.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/observability/log_headers.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/observability/log_presentation/__init__.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/observability/log_presentation/follow.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/observability/log_presentation/formatters.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/observability/log_presentation/json_extract.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/observability/log_presentation/limits.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/observability/log_presentation/models.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/observability/log_presentation/sanitize.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/observability/log_presentation/tail.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/observability/log_presentation/throttle.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/observability/log_stream.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/observability/node_order.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/observability/observer.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/observability/observer_lifecycle.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/observability/persistent.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/observability/render/__init__.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/observability/render/cells.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/observability/render/header.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/observability/render/text.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/observability/render/timeline.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/observability/render/viewport.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/observability/run_summary/accumulator.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/observability/run_summary/builder.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/observability/run_summary/formatting.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/observability/run_summary/issues.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/observability/run_summary/logger.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/observability/run_summary/markdown.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/observability/run_summary/models.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/observability/run_summary/spend.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/observability/run_summary/terminal.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/observability/run_summary/workspace.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/observability/run_summary/workspace_readers.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/observability/run_summary/workspace_state_paths.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/observability/run_summary/workspace_values.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/observability/runtime.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/observability/status_icons.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/observability/text_layout.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/observability/timing.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/observability/tmux/__init__.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/observability/tmux/bindings.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/observability/tmux/client.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/observability/tmux/commands.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/observability/tmux/compact.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/observability/tmux/control_state.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/observability/tmux/inspect_control.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/observability/tmux/inspect_launcher.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/observability/tmux/inspect_snapshot.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/observability/tmux/labels.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/observability/tmux/log_tail.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/observability/tmux/refresh.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/observability/tmux/rendering.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/observability/tmux/runtime.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/observability/tmux/runtime_files.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/observability/tmux/selected_invocation.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/observability/tmux/selection.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/observability/tmux/selection_control.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/observability/tmux/session.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/observability/tmux/session_lifecycle.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/observability/tmux/shell_commands.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/observability/tmux/snapshot_types.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/observability/tmux/viewport.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/observability/tmux/warnings.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/observability/tmux/window.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/observability/types.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/py.typed +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/__init__.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/agent/__init__.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/agent/failures/__init__.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/agent/failures/classifier.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/agent/failures/evidence.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/agent/failures/formatting.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/agent/failures/patterns.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/agent/failures/types.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/agent/invocation/loop.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/agent/invocation/output.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/agent/invocation/retry.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/agent/invocation/state.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/agent/invocation/telemetry.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/agent/invocation/transitions.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/agent/invoker.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/agent/process/diagnostics.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/agent/process/log_rendering.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/agent/process/runner.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/agent/process/stream_capture.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/agent/quota/__init__.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/agent/quota/classifier.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/agent/quota/evidence.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/agent/quota/lexicons.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/agent/quota/waits.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/agent/retry_units.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/agent/usage.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/agent/usage_costs.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/agent/usage_types.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/agent/workspace_environment.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/execution/__init__.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/execution/activity/__init__.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/execution/activity/console.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/execution/activity/events.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/execution/activity/telemetry.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/execution/common.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/execution/consensus.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/execution/errors.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/execution/fragment_assembler.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/execution/input.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/execution/log_presentation.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/execution/parallel.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/execution/prompt_budgeting.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/execution/provider_call/__init__.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/execution/provider_call/artifact_capture.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/execution/provider_call/cancellation.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/execution/provider_call/display.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/execution/provider_call/events.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/execution/provider_call/lifecycle_state.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/execution/provider_call/provider_output.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/execution/provider_call/types.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/execution/resume.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/execution/review_loop/__init__.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/execution/review_loop/audit_round.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/execution/review_loop/drift/__init__.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/execution/review_loop/drift/capture.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/execution/review_loop/drift/comparison.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/execution/review_loop/drift/detection.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/execution/review_loop/drift/events.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/execution/review_loop/drift/recovery.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/execution/review_loop/drift/reserved.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/execution/review_loop/drift/snapshots.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/execution/review_loop/executor_round.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/execution/review_loop/orchestration.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/execution/review_loop/policy.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/execution/review_loop/prompts.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/execution/review_loop/reviewer_round.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/execution/review_loop/rounds.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/execution/review_loop/state.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/execution/review_loop/validation.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/execution/reviews/__init__.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/execution/reviews/consensus.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/execution/reviews/fingerprints.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/execution/reviews/markdown.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/execution/reviews/plain_language.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/execution/reviews/structured.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/execution/reviews/types.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/execution/runtime_context.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/execution/sequential.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/execution/stage_finalize_events.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/execution/stage_tasks.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/execution/workflow/__init__.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/execution/workflow/cleanup.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/execution/workflow/execution_session.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/execution/workflow/node.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/execution/workflow/orchestration.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/execution/workflow/state.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/execution/workspace_files/generated.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/execution/workspace_files/source_resolution.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/workspace/__init__.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/workspace/cleanup_notes.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/workspace/git.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/workspace/plan_nodes.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/workspace/service/__init__.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/workspace/state_selection.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/workspace/worktree/__init__.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/workspace/worktree/attributes.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/workspace/worktree/commit.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/workspace/worktree/policy.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/workspace/worktree/refs.py +0 -0
- {crewplane-0.2.2 → crewplane-0.3.0}/src/crewplane/runtime/workspace/worktree/source_refs.py +0 -0
- {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.
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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>
|
|
@@ -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
|
-
|
|
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
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
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
|
-
|
|
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
|
-
|
|
382
|
-
|
|
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]:
|