Files
pulse/internal/mutationregistry/manifest.json
T
rcourtman 3c778e2b26 Restore one-click Docker container updates through the typed action plane
v6.1.0-rc.1 retired the legacy update endpoints before a replacement
existed, so the UI's Update button failed with an internal-jargon 410
(issue #1564). This lands the replacement end to end: update_container
is a typed agentexec operation with its own strict codec, durable
receipts, and a request digest bound to the image digest the plan
observed; the unified agent bridges execution to the Docker module's
existing pull/backup/recreate/verify/rollback implementation (which now
reports rollback attempt and outcome); and the container action
executor plans, dispatches, and reconciles the operation with declared
backup/rollback compensation truth. Containers advertise an
admin-approval update capability while an image update with a stated
current digest is detected. The legacy endpoints stay retired but
return actionable copy.

Proven live against a Colima daemon: single-container update, the
issue-1564 shared-network-namespace update, and the full UI journey
(Update button, governed review, approve, run) all completed with the
namespace preserved and the backup retained.
2026-07-14 12:19:04 +01:00

54 lines
20 KiB
JSON

[
{"id":"admin.agent.deployment","origin":"api","resource_class":"pulse_administration","resource_kind":"agent-enrollment","capability":"deploy_agent","entrypoint":"agentexec deploy_install/deploy_cancel","disposition":"administrative_exception","approval_floor":"admin","delivery":"administrative_transaction","verification":"administrative","rollback":"unsupported","residual_owners":["task_12_final_governance"]},
{"id":"admin.inventory.docker-runtime","origin":"api","resource_class":"pulse_administration","resource_kind":"docker-runtime-record","capability":"manage_inventory","entrypoint":"/api/agents/docker/runtimes/* metadata and enrollment","disposition":"administrative_exception","approval_floor":"admin","delivery":"administrative_transaction","verification":"administrative","rollback":"unsupported","residual_owners":["task_12_final_governance"]},
{"id":"admin.inventory.kubernetes-cluster","origin":"api","resource_class":"pulse_administration","resource_kind":"kubernetes-cluster-record","capability":"manage_inventory","entrypoint":"/api/agents/kubernetes/clusters/* metadata and enrollment","disposition":"administrative_exception","approval_floor":"admin","delivery":"administrative_transaction","verification":"administrative","rollback":"unsupported","residual_owners":["task_12_final_governance"]},
{"id":"admin.patrol.control-settings","origin":"api","resource_class":"pulse_administration","resource_kind":"patrol-config","capability":"set_patrol_control","entrypoint":"PUT /api/ai/patrol/autonomy","disposition":"administrative_exception","approval_floor":"admin","delivery":"administrative_transaction","verification":"administrative","rollback":"unsupported","residual_owners":["task_12_final_governance"]},
{"id":"admin.pulse.self-update","origin":"api","resource_class":"pulse_administration","resource_kind":"pulse-server","capability":"self_update","entrypoint":"POST /api/updates/apply and /api/updates/rollback","disposition":"administrative_exception","approval_floor":"admin","delivery":"administrative_transaction","verification":"administrative","rollback":"unsupported","residual_owners":["task_12_final_governance"]},
{"id":"action.api.decision","origin":"api","resource_class":"customer_infrastructure","resource_kind":"unified-resource","capability":"decide_action","entrypoint":"POST /api/actions/{id}/decision","disposition":"lifecycle","lifecycle_executor":"internal/actionlifecycle.Service.Decide","approval_floor":"admin","delivery":"committed_lifecycle_before_transport","verification":"required","rollback":"task_10_truth_and_compensation","residual_owners":["task_10_truth_and_compensation"]},
{"id":"action.api.execute","origin":"api","resource_class":"customer_infrastructure","resource_kind":"unified-resource","capability":"execute_action","entrypoint":"POST /api/actions/{id}/execute","disposition":"lifecycle","lifecycle_executor":"internal/actionlifecycle.Service.Execute","approval_floor":"admin","delivery":"committed_lifecycle_before_transport","verification":"required","rollback":"task_10_truth_and_compensation","residual_owners":["task_07_durable_delivery","task_10_truth_and_compensation"]},
{"id":"action.api.plan","origin":"api","resource_class":"customer_infrastructure","resource_kind":"unified-resource","capability":"plan_action","entrypoint":"POST /api/actions/plan","disposition":"lifecycle","lifecycle_executor":"internal/actionlifecycle.Service.PlanWithOptions","approval_floor":"policy_or_admin","delivery":"committed_lifecycle_before_transport","verification":"required","rollback":"task_10_truth_and_compensation","residual_owners":["task_10_truth_and_compensation"]},
{"id":"assistant.docker.control","origin":"model","resource_class":"customer_infrastructure","resource_kind":"app-container","capability":"start_stop_restart","entrypoint":"pulse_docker action=control","disposition":"retired_denied","approval_floor":"admin","delivery":"denied_before_transport","verification":"denied","rollback":"denied","residual_owners":["task_05_typed_lifecycle_migration"]},
{"id":"assistant.docker.update","origin":"model","resource_class":"customer_infrastructure","resource_kind":"app-container","capability":"update_container","entrypoint":"pulse_docker action=update","disposition":"retired_denied","approval_floor":"admin","delivery":"denied_before_transport","verification":"denied","rollback":"denied","residual_owners":["task_07_durable_delivery","task_10_truth_and_compensation"]},
{"id":"assistant.file.append","origin":"model","resource_class":"customer_infrastructure","resource_kind":"remote-file","capability":"append_file","entrypoint":"pulse_file_edit action=append","disposition":"retired_denied","approval_floor":"admin","delivery":"denied_before_transport","verification":"denied","rollback":"denied","residual_owners":["retired_no_replacement"]},
{"id":"assistant.file.write","origin":"model","resource_class":"customer_infrastructure","resource_kind":"remote-file","capability":"write_file","entrypoint":"pulse_file_edit action=write","disposition":"retired_denied","approval_floor":"admin","delivery":"denied_before_transport","verification":"denied","rollback":"denied","residual_owners":["retired_no_replacement"]},
{"id":"assistant.guest.control","origin":"model","resource_class":"customer_infrastructure","resource_kind":"vm_or_system-container","capability":"start_stop_shutdown_restart","entrypoint":"pulse_control type=guest","disposition":"retired_denied","approval_floor":"admin","delivery":"denied_before_transport","verification":"denied","rollback":"denied","residual_owners":["use_assistant_resource_action"]},
{"id":"assistant.kubernetes.delete-pod","origin":"model","resource_class":"customer_infrastructure","resource_kind":"kubernetes-pod","capability":"delete_pod","entrypoint":"pulse_kubernetes type=delete_pod","disposition":"retired_denied","approval_floor":"admin","delivery":"denied_before_transport","verification":"denied","rollback":"denied","residual_owners":["task_07_durable_delivery","task_10_truth_and_compensation"]},
{"id":"assistant.kubernetes.exec","origin":"model","resource_class":"customer_infrastructure","resource_kind":"kubernetes-pod","capability":"exec","entrypoint":"pulse_kubernetes type=exec","disposition":"retired_denied","approval_floor":"admin","delivery":"denied_before_transport","verification":"denied","rollback":"denied","residual_owners":["retired_arbitrary_command_boundary"]},
{"id":"assistant.kubernetes.restart","origin":"model","resource_class":"customer_infrastructure","resource_kind":"kubernetes-deployment","capability":"rollout_restart","entrypoint":"pulse_kubernetes type=restart","disposition":"retired_denied","approval_floor":"admin","delivery":"denied_before_transport","verification":"denied","rollback":"denied","residual_owners":["task_07_durable_delivery","task_10_truth_and_compensation"]},
{"id":"assistant.kubernetes.scale","origin":"model","resource_class":"customer_infrastructure","resource_kind":"kubernetes-deployment","capability":"scale","entrypoint":"pulse_kubernetes type=scale","disposition":"retired_denied","approval_floor":"admin","delivery":"denied_before_transport","verification":"denied","rollback":"denied","residual_owners":["task_07_durable_delivery","task_10_truth_and_compensation"]},
{"id":"assistant.raw-command","origin":"model","resource_class":"customer_infrastructure","resource_kind":"agent-target","capability":"raw_command","entrypoint":"pulse_control type=command","disposition":"retired_denied","approval_floor":"admin","delivery":"denied_before_transport","verification":"denied","rollback":"denied","residual_owners":["retired_arbitrary_command_boundary"]},
{"id":"assistant.resource-action","origin":"model","resource_class":"customer_infrastructure","resource_kind":"unified-resource","capability":"advertised_resource_action","entrypoint":"pulse_control type=resource","disposition":"lifecycle","lifecycle_executor":"internal/actionlifecycle.Service.PlanWithOptions","approval_floor":"policy_or_admin","delivery":"committed_lifecycle_before_transport","verification":"required","rollback":"task_10_truth_and_compensation","residual_owners":["task_10_truth_and_compensation"]},
{"id":"assistant.truenas.app-control","origin":"model","resource_class":"customer_infrastructure","resource_kind":"truenas-app","capability":"start_stop_restart","entrypoint":"pulse_control type=resource adapter=truenas","disposition":"retired_denied","approval_floor":"admin","delivery":"denied_before_transport","verification":"denied","rollback":"denied","residual_owners":["task_07_durable_delivery","task_10_truth_and_compensation"]},
{"id":"docker.api.runtime-stop","origin":"api","resource_class":"customer_infrastructure","resource_kind":"docker-runtime","capability":"stop_agent","entrypoint":"DELETE /api/agents/docker/runtimes/*","disposition":"retired_denied","approval_floor":"admin","delivery":"denied_before_transport","verification":"denied","rollback":"denied","residual_owners":["task_07_durable_delivery","task_10_truth_and_compensation"]},
{"id":"docker.api.update-all","origin":"api","resource_class":"customer_infrastructure","resource_kind":"docker-host","capability":"update_all_containers","entrypoint":"POST /api/agents/docker/runtimes/*/update-all","disposition":"retired_denied","approval_floor":"admin","delivery":"denied_before_transport","verification":"denied","rollback":"denied","residual_owners":["task_07_durable_delivery","task_10_truth_and_compensation"]},
{"id":"docker.api.update-container","origin":"api","resource_class":"customer_infrastructure","resource_kind":"app-container","capability":"update_container","entrypoint":"POST /api/agents/docker/containers/update","disposition":"retired_denied","approval_floor":"admin","delivery":"denied_before_transport","verification":"denied","rollback":"denied","residual_owners":["task_07_durable_delivery","task_10_truth_and_compensation"]},
{"id":"legacy.api.run-command","origin":"legacy","resource_class":"customer_infrastructure","resource_kind":"agent-target","capability":"raw_command","entrypoint":"POST /api/ai/run-command","disposition":"retired_denied","approval_floor":"admin","delivery":"denied_before_transport","verification":"denied","rollback":"denied","residual_owners":["retired_compatibility_response_only"]},
{"id":"legacy.enterprise.remediation-approve","origin":"legacy","resource_class":"customer_infrastructure","resource_kind":"remediation-plan","capability":"approve_raw_steps","entrypoint":"enterprise remediation approve endpoint","disposition":"retired_denied","approval_floor":"admin","delivery":"denied_before_transport","verification":"denied","rollback":"denied","residual_owners":["read_only_historical_import"]},
{"id":"legacy.enterprise.remediation-execute","origin":"legacy","resource_class":"customer_infrastructure","resource_kind":"remediation-plan","capability":"execute_raw_steps","entrypoint":"enterprise remediation execute endpoint","disposition":"retired_denied","approval_floor":"admin","delivery":"denied_before_transport","verification":"denied","rollback":"denied","residual_owners":["read_only_historical_import"]},
{"id":"legacy.enterprise.remediation-rollback","origin":"legacy","resource_class":"customer_infrastructure","resource_kind":"remediation-plan","capability":"execute_raw_rollback","entrypoint":"enterprise remediation rollback endpoint","disposition":"retired_denied","approval_floor":"admin","delivery":"denied_before_transport","verification":"denied","rollback":"denied","residual_owners":["read_only_historical_import"]},
{"id":"legacy.model.run-command","origin":"legacy","resource_class":"customer_infrastructure","resource_kind":"agent-target","capability":"raw_command","entrypoint":"run_command provider alias","disposition":"retired_denied","approval_floor":"admin","delivery":"denied_before_transport","verification":"denied","rollback":"denied","residual_owners":["retired_compatibility_response_only"]},
{"id":"patrol.typed-action","origin":"job","resource_class":"customer_infrastructure","resource_kind":"unified-resource","capability":"advertised_resource_action","entrypoint":"patrol_propose_action -> OrchestratorActionBroker","disposition":"lifecycle","lifecycle_executor":"internal/actionlifecycle.Service","approval_floor":"policy_or_admin","delivery":"committed_lifecycle_before_transport","verification":"required","rollback":"task_10_truth_and_compensation","residual_owners":["task_10_truth_and_compensation"]},
{"id":"resource.docker.container-lifecycle","origin":"api","resource_class":"customer_infrastructure","resource_kind":"app-container","capability":"start_stop_restart","entrypoint":"docker.container.lifecycle","disposition":"lifecycle","lifecycle_executor":"dockerContainerActionExecutor","approval_floor":"admin","delivery":"committed_lifecycle_before_transport","verification":"required","rollback":"task_10_truth_and_compensation","residual_owners":["task_10_truth_and_compensation"]},
{"id":"resource.docker.container-update","origin":"api","resource_class":"customer_infrastructure","resource_kind":"app-container","capability":"update_container","entrypoint":"docker.container.update","disposition":"lifecycle","lifecycle_executor":"dockerContainerActionExecutor","approval_floor":"admin","delivery":"committed_lifecycle_before_transport","verification":"required","rollback":"task_10_truth_and_compensation","residual_owners":["task_10_truth_and_compensation"]},
{"id":"resource.host.package-cache-cleanup","origin":"api","resource_class":"customer_infrastructure","resource_kind":"agent","capability":"clean_package_cache","entrypoint":"host.storage_cleanup","disposition":"lifecycle","lifecycle_executor":"hostStorageCleanupActionExecutor","approval_floor":"policy_or_admin","delivery":"committed_lifecycle_before_transport","verification":"required","rollback":"unsupported"},
{"id":"resource.host.package-update","origin":"api","resource_class":"customer_infrastructure","resource_kind":"agent","capability":"install_os_updates","entrypoint":"host.package_updates","disposition":"lifecycle","lifecycle_executor":"hostUpdateActionExecutor","approval_floor":"policy_or_admin","delivery":"committed_lifecycle_before_transport","verification":"required","rollback":"task_10_truth_and_compensation","residual_owners":["task_10_truth_and_compensation"]},
{"id":"resource.proxmox.guest-lifecycle","origin":"api","resource_class":"customer_infrastructure","resource_kind":"vm_or_system-container","capability":"start_shutdown_reboot_stop","entrypoint":"proxmox.vm.lifecycle/proxmox.ct.lifecycle","disposition":"lifecycle","lifecycle_executor":"proxmoxGuestActionExecutor","approval_floor":"admin","delivery":"committed_lifecycle_before_transport","verification":"required","rollback":"task_10_truth_and_compensation","residual_owners":["task_10_truth_and_compensation"]},
{"id":"transport.agent.docker-container-lifecycle","origin":"transport","resource_class":"customer_infrastructure","resource_kind":"app-container","capability":"start_stop_restart","entrypoint":"agentexec docker_container_lifecycle","disposition":"lifecycle","lifecycle_executor":"dockerContainerActionExecutor","approval_floor":"admin","delivery":"committed_lifecycle_before_transport","verification":"required","rollback":"task_10_truth_and_compensation","residual_owners":["task_10_truth_and_compensation"]},
{"id":"transport.agent.docker-container-update","origin":"transport","resource_class":"customer_infrastructure","resource_kind":"app-container","capability":"update_container","entrypoint":"agentexec docker_container_update","disposition":"lifecycle","lifecycle_executor":"dockerContainerActionExecutor","approval_floor":"admin","delivery":"committed_lifecycle_before_transport","verification":"required","rollback":"task_10_truth_and_compensation","residual_owners":["task_10_truth_and_compensation"]},
{"id":"transport.agent.host-package-cache-cleanup","origin":"transport","resource_class":"customer_infrastructure","resource_kind":"agent","capability":"clean_package_cache","entrypoint":"agentexec host_storage_cleanup","disposition":"lifecycle","lifecycle_executor":"hostStorageCleanupActionExecutor","approval_floor":"policy_or_admin","delivery":"committed_lifecycle_before_transport","verification":"required","rollback":"unsupported"},
{"id":"transport.agent.host-package-update","origin":"transport","resource_class":"customer_infrastructure","resource_kind":"agent","capability":"install_os_updates","entrypoint":"agentexec host_update","disposition":"lifecycle","lifecycle_executor":"hostUpdateActionExecutor","approval_floor":"policy_or_admin","delivery":"committed_lifecycle_before_transport","verification":"required","rollback":"task_10_truth_and_compensation","residual_owners":["task_10_truth_and_compensation"]},
{"id":"transport.agent.raw-command","origin":"transport","resource_class":"customer_infrastructure","resource_kind":"agent-target","capability":"executor_owned_command","entrypoint":"agentexec execute_command","disposition":"lifecycle","lifecycle_executor":"dockerContainerActionExecutor/proxmoxGuestActionExecutor","approval_floor":"admin","delivery":"committed_lifecycle_before_transport","verification":"required","rollback":"task_10_truth_and_compensation","residual_owners":["task_10_truth_and_compensation"]},
{"id":"transport.agent.deploy-cancel","origin":"transport","resource_class":"pulse_administration","resource_kind":"agent-enrollment","capability":"deploy_agent","entrypoint":"agentexec deploy_cancel","disposition":"administrative_exception","approval_floor":"admin","delivery":"administrative_transaction","verification":"administrative","rollback":"unsupported","residual_owners":["task_12_final_governance"]},
{"id":"transport.agent.deploy-install","origin":"transport","resource_class":"pulse_administration","resource_kind":"agent-enrollment","capability":"deploy_agent","entrypoint":"agentexec deploy_install","disposition":"administrative_exception","approval_floor":"admin","delivery":"administrative_transaction","verification":"administrative","rollback":"unsupported","residual_owners":["task_12_final_governance"]},
{"id":"transport.agent.deploy-preflight","origin":"transport","resource_class":"pulse_administration","resource_kind":"agent-enrollment","capability":"deploy_agent","entrypoint":"agentexec deploy_preflight","disposition":"administrative_exception","approval_floor":"admin","delivery":"administrative_transaction","verification":"administrative","rollback":"unsupported","residual_owners":["task_12_final_governance"]},
{"id":"transport.docker.runtime-stop","origin":"transport","resource_class":"customer_infrastructure","resource_kind":"docker-runtime","capability":"stop_agent","entrypoint":"docker command stop","disposition":"retired_denied","approval_floor":"admin","delivery":"denied_before_transport","verification":"denied","rollback":"denied","residual_owners":["task_07_durable_delivery","task_10_truth_and_compensation"]},
{"id":"transport.docker.update-all","origin":"transport","resource_class":"customer_infrastructure","resource_kind":"docker-host","capability":"update_all_containers","entrypoint":"docker command update_all","disposition":"retired_denied","approval_floor":"admin","delivery":"denied_before_transport","verification":"denied","rollback":"denied","residual_owners":["task_07_durable_delivery","task_10_truth_and_compensation"]},
{"id":"transport.docker.update-container","origin":"transport","resource_class":"customer_infrastructure","resource_kind":"app-container","capability":"update_container","entrypoint":"docker command update_container","disposition":"retired_denied","approval_floor":"admin","delivery":"denied_before_transport","verification":"denied","rollback":"denied","residual_owners":["task_07_durable_delivery","task_10_truth_and_compensation"]}
]