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

  1. Check the function name for typos — e.g. `success()` not `succes()`.
  2. Compare against the list of supported functions in pkg/exprparser/interpreter.go evaluateFuncCall; replace unsupported functions with supported equivalents.
  3. Upgrade act to the latest release where the function may have been implemented.
  4. 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

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


AI-assisted analysis of nektos/act@4f41128141 (2026-08-15). Data as JSON: /api/errors/d0b14da00fc3bab5. Report an issue: GitHub.