CheckpointManager was never wired into PlanExecutor — the CLI factory
constructed PlanExecutor without a checkpoint_manager (defaulted to
None), silently skipping all checkpoint hooks.
Fix:
- Register CheckpointManager as Singleton in DI container
- Resolve container singleton in _get_plan_executor() and pass to
PlanExecutor constructor
- Bridge infra→domain: _try_create_checkpoint() now persists
last_checkpoint_id on the plan via _commit_plan(), raises PlanError
if persistence fails
- Default checkpointable=True for writable+sandboxable resources and
write-capable tools (model_validators on ResourceCapabilities and
ToolCapability)
- Validate that non-writable/non-sandboxable resources cannot be
checkpointable (ValueError guard)
- Add post-execute A2A facade notification using plan.status to avoid
duplicate execute→execute transition errors
Tests:
- 10 Behave scenarios covering DI wiring, singleton identity, checkpoint
creation, plan metadata update, rollback, graceful fallback, no-arg
constructor, capability defaults (positive + 2 negative)
- Updated consolidated_resource, consolidated_skill, and Robot
helper_skill_flatten for new checkpointable defaults
ISSUES CLOSED: #1253