refactor: Phase 2 - Extract executor implementations
Created executor package with extracted job execution logic:
1. internal/worker/executor/local.go (104 lines)
- LocalExecutor implements JobExecutor interface
- Execute() method for local bash script execution
- generateScript() helper for creating experiment scripts
2. internal/worker/executor/container.go (229 lines)
- ContainerExecutor implements JobExecutor interface
- Execute() method for podman container execution
- EnvironmentPool interface for image caching
- Tracking tool provisioning (MLflow, TensorBoard, Wandb)
- Volume and cache setup
- selectDependencyManifest() helper
3. internal/worker/executor/runner.go (131 lines)
- JobRunner orchestrates execution
- ExecutionMode enum (Auto, Local, Container)
- Run() method with directory setup and executor selection
- finalize() for success/failure handling
Key design decisions:
- Executors depend on interfaces (ManifestWriter, not Worker)
- JobRunner composes both executors
- No direct Worker dependencies in executor package
- SetupJobDirectories reused from execution package
Build status: Compiles successfully