Provider executor generalization

Provider executor generalization

Status: Implemented by GitHub PR #7

Task execution is provider-neutral. `TaskConfig.provider` selects a `ProviderExecutor` from the static registry; an absent provider and the legacy `claude:` manifest block both resolve to Claude for compatibility.

Built-in providers:

ProviderWorkload-side launcherCredential lease
`claude``agentic-claude-automation``anthropic_api_key` → `ANTHROPIC_API_KEY_FILE`
`dsh``agentic-dsh-automation``openrouter_api_key` → `OPENROUTER_API_KEY_FILE`

The common runner owns working-directory validation, workload-identity setup, process spawning, stdout/stderr streaming, and error normalization. It passes only credential-file references through the control process. Provider wrappers read lease bytes after entering the workload identity, preventing secret values from crossing the control/workload boundary.

The generic wire marker is `__provider_task__`; `__claude_task__` remains accepted for existing management clients. Certificate renewal remains part of the transport lifecycle and is independent of provider execution.

Extension contract

A new provider must supply:

  • a stable registry name and workload-side launcher;
  • provider-specific arguments;
  • credential environment and lease-file mappings;
  • argument, missing-launcher, and output-stream regression tests;
  • an image or loadout that installs the named launcher.

Unsupported providers fail closed. The runner never falls back to a different provider.