332 lines
15 KiB
YAML
332 lines
15 KiB
YAML
# 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
|