Step 1
Profile Pipeline Lookup
Profile defines which steps run per action. Type-scoped: tries "start:bug" first, falls back to "start".
profile.pipelines["start:bug"]
?? profile.pipelines["start"]
→
Step 2
Registry Resolution
Each step name resolved via ValidationStepRegistry. Parameterized: "StatusTransition:IN_PROGRESS" splits into factory + param.
registry.create(
"StatusTransition:IN_PROGRESS",
deps)
→
Step 3
Pipeline Execution
Runs ALL steps regardless of failures. Each step wrapped in try/catch. Single failure doesn't stop others.
canProceed = no error-severity
failures
→
Result
ValidationResult
Aggregated: canProceed, failedSteps[], warnedSteps[], executionTime, suggestions[].
{ canProceed: false,
failedSteps: 1,
details: [...] }
Source-Status Guards (3)
RefineFromBacklog
ReadyFromRefinementOrBacklog
StartFromReadyForDev
Generic Transition + Task-State Guards (7)
StatusTransition
AlreadyCompleted
AlreadyBlocked
NotBlocked
Blocked
AlreadyDone
BackwardTransition
Field Requirements (5)
BaseTaskFields
AcceptanceCriteria
EffortEstimation
DependencyIdentification
WaveAssignment
Quality Gates (3)
PRReview
TestCoverage
SecurityScan
Service-Injected (4)
EpicIntegrity
Dependency
ImplementationReadiness
SubtaskCompletion
Constraints (4)
AISuitability
RiskLevel
FastTrack
ApprovalRequirement
Profile-Driven Generic (7)
SourceStatus
ContainerAssignment
ContainerIntegrity
ContainerSingularity
CircuitBreaker
SpecCompleteness
ContextCompleteness
Fail-safe execution: Every step runs regardless of prior failures. A dependency check failing doesn't skip the security scan. The full picture is always available — not just the first error.
Plugin-ready architecture: ValidationStepRegistry is already a plugin system. Register a factory by name, reference it in a profile pipeline. Adding "CodeRabbitReview" to the approve pipeline = zero engine changes.