{"record":{"id":"d0b14da00fc3bab5","repo":"nektos/act","slug":"todo-s-not-implemented","errorCode":null,"errorMessage":"TODO: '%s' not implemented","messagePattern":"TODO: '(.+?)' not implemented","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"pkg/exprparser/interpreter.go","lineNumber":667,"sourceCode":"\t\tif impl.config.Context == \"job\" {\n\t\t\treturn impl.jobSuccess()\n\t\t}\n\t\tif impl.config.Context == \"step\" {\n\t\t\treturn impl.stepSuccess()\n\t\t}\n\t\treturn nil, fmt.Errorf(\"Context '%s' must be one of 'job' or 'step'\", impl.config.Context)\n\tcase \"failure\":\n\t\tif impl.config.Context == \"job\" {\n\t\t\treturn impl.jobFailure()\n\t\t}\n\t\tif impl.config.Context == \"step\" {\n\t\t\treturn impl.stepFailure()\n\t\t}\n\t\treturn nil, fmt.Errorf(\"Context '%s' must be one of 'job' or 'step'\", impl.config.Context)\n\tcase \"cancelled\":\n\t\treturn impl.cancelled()\n\tdefault:\n\t\treturn nil, fmt.Errorf(\"TODO: '%s' not implemented\", funcCallNode.Callee)\n\t}\n}\n","sourceCodeStart":649,"sourceCodeEnd":670,"githubUrl":"https://github.com/nektos/act/blob/4f411281417e88660bea1c1a1749aa71ae0bd60f/pkg/exprparser/interpreter.go#L649-L670","documentation":"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.","triggerScenarios":"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.","commonSituations":"Workflows written against newer GitHub features run on an older act binary; typos in function names; users expecting bash or JavaScript function syntax inside `${{ }}`.","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."],"exampleFix":"# before\nif: ${{ startsWiths(github.ref, 'refs/tags/') }}\n# after\nif: ${{ startsWith(github.ref, 'refs/tags/') }}","handlingStrategy":"validation","validationCode":"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}\nfunc calleeSupported(expr string) bool { /* extract identifiers followed by '(' and check the map */ return true }","typeGuard":null,"tryCatchPattern":"if err != nil && strings.Contains(err.Error(), \"not implemented\") {\n    // surface a clear message: function X is unsupported by this act version\n}","preventionTips":["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."],"tags":["expression","exprparser","functions","not-implemented"],"backgroundTag":null,"analyzedSha":"4f411281417e88660bea1c1a1749aa71ae0bd60f","analyzedAt":"2026-08-15T09:19:46.307Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}