func (m *WorkflowInvocation) TaskInvocation(id string) (*TaskInvocation, bool) {
	ti, ok := m.Status.Tasks[id]
	return ti, ok
}
TODO how do we know which tasks are not being run
package types
import (
	"github.com/fission/fission-workflows/pkg/types/typedvalues"
	"github.com/golang/protobuf/proto"
)
const (
	InputMain    = "default"
	InputBody    = "body"
	InputHeaders = "headers"
	InputQuery   = "query"
	InputMethod  = "method"
	InputParent  = "_parent"
	typedValueShortMaxLen = 32
	WorkflowAPIVersion    = "v1"
	TypeWorkflow   = "workflow"
	TypeInvocation = "invocation"
	TypeTaskRun    = "taskrun"
)
var invocationFinalStates = []WorkflowInvocationStatus_Status{
	WorkflowInvocationStatus_ABORTED,
	WorkflowInvocationStatus_SUCCEEDED,
	WorkflowInvocationStatus_FAILED,
}
var taskFinalStates = []TaskInvocationStatus_Status{
	TaskInvocationStatus_FAILED,
	TaskInvocationStatus_ABORTED,
	TaskInvocationStatus_SKIPPED,
	TaskInvocationStatus_SUCCEEDED,
}
func (m *Error) Error() string {
	return m.Message
}
func (m *WorkflowInvocation) ID() string {
	return m.GetMetadata().GetId()
}
func (m *WorkflowInvocation) Copy() *WorkflowInvocation {
	return proto.Clone(m).(*WorkflowInvocation)
}
func (m *WorkflowInvocation) Type() string {
	return TypeInvocation
}
func (m *WorkflowInvocation) Workflow() *Workflow {
	return m.GetSpec().GetWorkflow()
}