# Go parity disposition and Python disposal manifest for SDD scenario S13. # # Every stabilized Python dispatcher/selector/observation behavior and the Node # reference behavior is classified exactly once as absorb | replace | # not-applicable, bound to concrete Go owner source and tests, and asserted to # have zero remaining Python production callers. The disposal block records the # checksum-bound retained source/test fixtures and the Milestone-completion # deletion gate. # # This manifest is validated by apps/agent/internal/taskloop/parity.go and its # tests. Reference and Go source paths are repository-relative and must exist; # disposal checksums must match the actual reference files on disk. schema_version: 1 reference_root: agent-ops/skills/project/orchestrate-agent-task-loop deletion_gate: milestone-completion-transition behaviors: - id: task-scan-dependency-ready reference_sources: - agent-ops/skills/project/orchestrate-agent-task-loop/scripts/dispatch.py - agent-ops/skills/project/orchestrate-agent-task-loop/tests/test_dispatch.py disposition: absorb go_owner: >- Registered-project workflow discovery and explicit-predecessor admission are owned by the standalone workflow projection over the shared manager; numeric order never implies dependency. go_source: - apps/agent/internal/taskloop/workflow.go - apps/agent/internal/taskloop/module.go - packages/go/agenttask/manager.go go_test: - TestManualStartDuplicateManagerLeasePreventsConcurrentInvocation - TestRuntimeFakeProviderPersistedLifecycleRollbackAndRestart invariants: >- Only explicit predecessors gate readiness; unknown, disabled, unselected, malformed, or escaping inputs fail closed. production_caller: go-only - id: parallel-dispatch-scheduling reference_sources: - agent-ops/skills/project/orchestrate-agent-task-loop/scripts/dispatch.py disposition: absorb go_owner: >- Bounded isolated dispatch of dependency-ready siblings is owned by the shared AgentTaskManager scheduler with per-task writable roots. go_source: - packages/go/agenttask/dispatch.go - packages/go/agenttask/manager.go go_test: - TestIsolatedDispatchUsesDistinctTaskRoots - TestManagerOwnsConfinementStartBeforeBindingProviderInvocation invariants: >- Sibling dispatch never derives an implicit dependency from numeric order or write-set overlap and stays within provider concurrency limits. production_caller: go-only - id: canonical-workspace-parallel-write reference_sources: - agent-ops/skills/project/orchestrate-agent-task-loop/scripts/dispatch.py disposition: replace go_owner: >- Direct parallel writes to the canonical workspace are replaced by pinned base snapshots and per-task copy-on-write overlays; only the integration owner mutates the canonical base. go_source: - packages/go/agentworkspace/overlay.go - packages/go/agentworkspace/snapshot.go - apps/agent/internal/taskloop/integration.go go_test: - TestIntegrationDelegatesCleanConflictRetentionAndQueueContinuation invariants: >- Parallel task processes cannot write canonical files, shared Git index/ref, or another task layer; review PASS change sets integrate in dispatch-ordinal order. production_caller: go-only - id: shared-checkout-write-claim reference_sources: - agent-ops/skills/project/orchestrate-agent-task-loop/scripts/dispatch.py - agent-ops/skills/project/orchestrate-agent-task-loop/scripts/dispatcher_observation.py disposition: replace go_owner: >- The shared-checkout PLAN write-claim compatibility path is replaced by the normalized PlanWriteSet parsed from the single Modified Files Summary and by workspace isolation; claims are not converted into logical dependencies. go_source: - apps/agent/internal/taskloop/workflow.go - packages/go/agentworkspace/snapshot.go go_test: - TestRuntimeFakeProviderPersistedLifecycleRollbackAndRestart invariants: >- Write-set rows are literal, bounded, and containment-checked; glob, directory, out-of-workspace, missing, or duplicate targets fail closed. production_caller: go-only - id: restart-reconciliation-recovery reference_sources: - agent-ops/skills/project/orchestrate-agent-task-loop/scripts/dispatch.py disposition: absorb go_owner: >- Checkpoint-first restart reconciliation and opaque process/session recovery are owned by the shared manager and the host RecoveryInspector. go_source: - packages/go/agenttask/reconcile.go - apps/agent/internal/taskloop/recovery.go go_test: - TestRecoverStoppedDispatchStartsFreshAttempt - TestCommandAdapterFakeProviderPersistedLifecycleRollbackAndRestart invariants: >- Malformed checkpoint/route/locator states become typed blockers, never a silent reset or duplicated live work. production_caller: go-only - id: review-convergence reference_sources: - agent-ops/skills/project/orchestrate-agent-task-loop/scripts/dispatch.py disposition: absorb go_owner: >- Worker, self-check, and official-review sequencing plus WARN/FAIL/ USER_REVIEW follow-up are owned by the shared review ports and the host review adapter. go_source: - packages/go/agenttask/review.go - apps/agent/internal/taskloop/review.go go_test: - TestReviewWarnCreatesFollowupAttempt - TestReviewUserReviewDefersOnlyOneTask invariants: >- A worker exit code or completion phrase alone never marks a task review-ready or completed; review runs only after submission gates pass. production_caller: go-only - id: work-log-archive reference_sources: - agent-ops/skills/project/orchestrate-agent-task-loop/scripts/dispatch.py disposition: absorb go_owner: >- Per-task loop/attempt/locator project logs and exactly-once terminal archive reconciliation are owned by the host project-log sink and store. go_source: - apps/agent/internal/projectlog/sink.go - apps/agent/internal/projectlog/store.go go_test: - TestSinkMapsEveryEventType - TestS12LoopParallelArchiveMatrix invariants: >- Archive and cleanup run only after verified terminal closure; WORK_LOG or heartbeat change alone is never counted as review progress. production_caller: go-only - id: failure-classification-budget reference_sources: - agent-ops/skills/project/orchestrate-agent-task-loop/scripts/dispatch.py disposition: absorb go_owner: >- Typed failure classification, per-stage failure budgets, and the non-retryable exhaustion blocker are owned by the shared failure policy and manager. go_source: - packages/go/agentpolicy/failure_policy.go - packages/go/agenttask/manager.go go_test: - TestFailureBudgetPersistsAndStopsReviewRework - TestDecideContinuationRetryFailoverAndBlockers invariants: >- A generic failure is never escalated as a quota failure; budgets do not reset after cooldown. production_caller: go-only - id: observation-banner-output reference_sources: - agent-ops/skills/project/orchestrate-agent-task-loop/scripts/dispatcher_observation.py - agent-ops/skills/project/orchestrate-agent-task-loop/tests/test_dispatcher_observation.py disposition: replace go_owner: >- Observation banners and event formatting are replaced by the host project-log record projection and the command presentation adapter. go_source: - apps/agent/internal/projectlog/record.go - apps/agent/internal/command/service.go go_test: - TestRecordValidationMatrix invariants: >- Presentation output carries no credentials, raw private paths, or unbounded child output. production_caller: go-only - id: ordered-target-selection reference_sources: - agent-ops/skills/project/orchestrate-agent-task-loop/scripts/select_execution_target.py - agent-ops/skills/project/orchestrate-agent-task-loop/scripts/execution_target_policy.py - agent-ops/skills/project/orchestrate-agent-task-loop/tests/test_select_execution_target.py - agent-ops/skills/project/orchestrate-agent-task-loop/tests/test_select_execution_target.py.orig disposition: absorb go_owner: >- First-match ordered target selection and persisted route history are owned by the host config selector over the shared policy evaluator. go_source: - apps/agent/internal/taskloop/module.go - packages/go/agentpolicy/failure_policy.go go_test: - TestConfigSelectorPersistsOrderedPolicyAndSuppliesQuotaBackedFailover - TestEvaluatorFirstMatchWins invariants: >- Exactly one provider/model is exposed while ordered candidates and reasons are retained; a corrupt route errors instead of silently reselecting. production_caller: go-only - id: static-provider-model-capacity-tables reference_sources: - agent-ops/skills/project/orchestrate-agent-task-loop/scripts/execution_target_policy.py - agent-ops/skills/project/orchestrate-agent-task-loop/scripts/select_execution_target.py - agent-ops/skills/project/orchestrate-agent-task-loop/tests/test_execution_target_policy.py disposition: replace go_owner: >- Hard-coded provider/model identities and per-provider capacity numbers are replaced by the versioned provider catalog and the ordered SelectionPolicy in runtime configuration; production surfaces carry no static route table. go_source: - packages/go/agentconfig/runtime_config.go - apps/agent/internal/taskloop/module.go go_test: - TestConfigSelectorContinuationUsesExactFailureRuleContext invariants: >- Route, model, and capacity facts come only from catalog/policy revisions; no production skill or rule owns a static provider/model/capacity table. production_caller: go-only - id: quota-probe-failover-promotion reference_sources: - agent-ops/skills/project/orchestrate-agent-task-loop/scripts/execution_target_policy.py - agent-ops/skills/project/orchestrate-agent-task-loop/scripts/select_execution_target.py disposition: absorb go_owner: >- Quota probing, runtime quota observation, and bounded failover/promotion are owned by the shared quota policy and continuation decision. go_source: - packages/go/agentpolicy/quota.go - apps/agent/internal/taskloop/provider.go go_test: - TestProviderFailureObservationFeedsCommonContinuationIdentity - TestNormalizeQuotaObservationMarksUnsupportedSchemaAndMalformedIdentityCorrupt invariants: >- Only a typed exhausted target enters failover; available/unknown quota stays a completion-evidence recovery on the same target. production_caller: go-only - id: node-runtime-consumer reference_sources: [] disposition: absorb go_owner: >- Node consumes the shared runtime through the protobuf runtime bridge and keeps no second provider or AgentTaskManager implementation. go_source: - apps/node/internal/node/runtime_bridge.go go_test: - TestRunRequestFromProtoPreservesWireFields - TestRunEventToProtoPreservesLegacyValues invariants: >- Node preserves the existing Edge-Node wire and provider semantics with no duplicate runtime implementation. production_caller: go-only disposal: state: retained procedure: >- Keep every reference file below as an unchanged, zero-caller fixture while state is retained. At the Milestone-completion transition, verify retained hashes and the repository cutover search, delete exactly this inventory, change state to disposed, then re-run parity and cutover verification. The disposed state requires every recorded file to be absent and discovery to find no retained Python fixture; partial or mixed states fail. reference_files: - path: agent-ops/skills/project/orchestrate-agent-task-loop/scripts/dispatch.py sha256: 66a03838b44df6b03c2c051e99ae6cf2ba311a99a0b7c4c98dbe041ab3def47a disposition: replace covered_by: - task-scan-dependency-ready - parallel-dispatch-scheduling - canonical-workspace-parallel-write - shared-checkout-write-claim - restart-reconciliation-recovery - review-convergence - work-log-archive - failure-classification-budget - path: agent-ops/skills/project/orchestrate-agent-task-loop/scripts/dispatcher_observation.py sha256: 654d5f27fbd750fe14215b30a2dcfc0ba2911ca3cc65c9636434a9a1182b5e1d disposition: replace covered_by: - shared-checkout-write-claim - observation-banner-output - path: agent-ops/skills/project/orchestrate-agent-task-loop/scripts/execution_target_policy.py sha256: 98435d4602e8aaef13a28c2872bf37cc918eef5385584c4964d15182bae3b03d disposition: replace covered_by: - ordered-target-selection - static-provider-model-capacity-tables - quota-probe-failover-promotion - path: agent-ops/skills/project/orchestrate-agent-task-loop/scripts/select_execution_target.py sha256: 8d425a5f355bbf4a9a769036ef17892c53de135df5a4cc3765534336c656cf4d disposition: replace covered_by: - ordered-target-selection - static-provider-model-capacity-tables - quota-probe-failover-promotion - path: agent-ops/skills/project/orchestrate-agent-task-loop/tests/test_dispatch.py sha256: 8b59f955e29076607174986aa2df07a0738fafd49ad6c09e894f79ba6a35bb36 disposition: not-applicable covered_by: - task-scan-dependency-ready - path: agent-ops/skills/project/orchestrate-agent-task-loop/tests/test_dispatcher_observation.py sha256: e6567a4574f6d19bb8cc9d1cd312f088774a4cebe16f4b1ec33fa6c860e3b215 disposition: not-applicable covered_by: - observation-banner-output - path: agent-ops/skills/project/orchestrate-agent-task-loop/tests/test_execution_target_policy.py sha256: c82706de70257a169587a350a7b5123f4f60fab6e0fb97263f1b7505f38a7c54 disposition: not-applicable covered_by: - static-provider-model-capacity-tables - path: agent-ops/skills/project/orchestrate-agent-task-loop/tests/test_select_execution_target.py sha256: 9943aede0d93824781e5e2f19b57cadffadb566d45387cc984eddc7460a1a3a7 disposition: not-applicable covered_by: - ordered-target-selection - path: agent-ops/skills/project/orchestrate-agent-task-loop/tests/test_select_execution_target.py.orig sha256: 1f87fd69525a073a24695451935b5892d756d9219863f3d875885ee0138e2010 disposition: not-applicable covered_by: - ordered-target-selection