nektos/act · error
TODO: '%s' not implemented
Error message
TODO: '%s' not implemented
What it means
Thrown when an expression calls a function that the interpreter's evaluateFuncCall switch does not recognize. Only a fixed set of GitHub Actions functions (contains, startsWith, endsWith, format, join, toJSON, fromJSON, hashFiles, always, success, failure, cancelled) plus context-dependent status functions are implemented; anything else hits the default branch with the TODO message.
Source
Thrown at pkg/exprparser/interpreter.go:667
if impl.config.Context == "job" {
return impl.jobSuccess()
}
if impl.config.Context == "step" {
return impl.stepSuccess()
}
return nil, fmt.Errorf("Context '%s' must be one of 'job' or 'step'", impl.config.Context)
case "failure":
if impl.config.Context == "job" {
return impl.jobFailure()
}
if impl.config.Context == "step" {
return impl.stepFailure()
}
return nil, fmt.Errorf("Context '%s' must be one of 'job' or 'step'", impl.config.Context)
case "cancelled":
return impl.cancelled()
default:
return nil, fmt.Errorf("TODO: '%s' not implemented", funcCallNode.Callee)
}
}
View on GitHub (pinned to 4f41128141)
Solutions
- Check the function name for typos — e.g. `success()` not `succes()`.
- Compare against the list of supported functions in pkg/exprparser/interpreter.go evaluateFuncCall; replace unsupported functions with supported equivalents.
- Upgrade act to the latest release where the function may have been implemented.
- Move the logic into a run step (bash) if the expression language cannot express it.
Example fix
# before
if: ${{ startsWiths(github.ref, 'refs/tags/') }}
# after
if: ${{ startsWith(github.ref, 'refs/tags/') }} Defensive patterns
Strategy: validation
Validate before calling
supported := map[string]bool{"contains": true, "startswith": true, "endswith": true, "format": true, "join": true, "tojson": true, "fromjson": true, "hashfiles": true, "always": true, "success": true, "failure": true, "cancelled": true}
func calleeSupported(expr string) bool { /* extract identifiers followed by '(' and check the map */ return true } Try / catch
if err != nil && strings.Contains(err.Error(), "not implemented") {
// surface a clear message: function X is unsupported by this act version
} Prevention
- Cross-check every function call in if:/env:/with: against the supported list before committing workflows.
- Upgrade act when adopting newly released GitHub expression functions.
- Prefer moving complex logic into run steps rather than exotic expression functions.
When it happens
Trigger: Using a newer GitHub Actions function that act has not implemented yet (e.g. a recently added builtin), misspelling a function name like `${{ succes() }}`, or calling custom/namespaced functions that do not exist in GitHub Actions expressions at all.
Common situations: Workflows written against newer GitHub features run on an older act binary; typos in function names; users expecting bash or JavaScript function syntax inside `${{ }}`.
Related errors
- Compare not implemented for types: left: %+v, right: %+v
- Unable to compare incompatibles types '%s' and '%s'
- Invalid glob option %s, available option: '--follow-symbolic
- failed to insert node %v into mapping %v unexpected type %v
AI-assisted analysis of nektos/act@4f41128141 (2026-08-15).
Data as JSON: /api/errors/d0b14da00fc3bab5.
Report an issue: GitHub.