{"record":{"id":"7fe6a4ffe1818198","repo":"floci-io/floci","slug":"override-s-must-not-contain-control-characters","errorCode":null,"errorMessage":"Override %s must not contain control characters.","messagePattern":"Override (.+?) must not contain control characters\\.","errorType":"http","errorClass":"AwsException","httpStatus":400,"severity":"error","filePath":"src/main/java/io/github/hectorvent/floci/core/common/ReservedTags.java","lineNumber":154,"sourceCode":"\n    private static String getOverride(Map<String, String> tags, String override, TriFunction<String, String, String, String> validator, String name, String errorCode) {\n        if (tags == null) {\n            return null;\n        }\n        if (tags.containsKey(override)) {\n            String ov = tags.get(override);\n            return validator.apply(ov, name, errorCode);\n        }\n        return null;\n    }\n\n    private static String validateOverrideId(String overrideId, String name, String errorCode) {\n        String normalized = checkNullAndWhitespace(overrideId, name, errorCode);\n        if (normalized.indexOf('/') >= 0 || normalized.indexOf('?') >= 0 || normalized.indexOf('#') >= 0) {\n            throw new AwsException(errorCode, \"Override %s contains unsupported characters.\".formatted(name), 400);\n        }\n        if (normalized.chars().anyMatch(Character::isISOControl)) {\n            throw new AwsException(errorCode, CONTROL_CHARACTER_ERROR_MESSAGE.formatted(name), 400);\n        }\n        return normalized;\n    }\n\n    private static String validateClientSecret(String overrideSecret, String name, String errorCode) {\n        String normalized = checkNullAndWhitespace(overrideSecret, name, errorCode);\n        if (normalized.chars().anyMatch(Character::isISOControl)) {\n            throw new AwsException(errorCode, CONTROL_CHARACTER_ERROR_MESSAGE.formatted(name), 400);\n        }\n        return normalized;\n    }\n\n    private static String checkNullAndWhitespace(String overrideSecret, String name, String errorCode) {\n        if (overrideSecret == null || overrideSecret.trim().isEmpty()) {\n            throw new AwsException(errorCode, \"Override %s must not be blank.\".formatted(name), 400);\n        }\n        String normalized = overrideSecret.trim();\n        if (normalized.chars().anyMatch(Character::isWhitespace)) {","sourceCodeStart":136,"sourceCodeEnd":172,"githubUrl":"https://github.com/floci-io/floci/blob/62ff490619e7bd3554597c28c704081b4c15add5/src/main/java/io/github/hectorvent/floci/core/common/ReservedTags.java#L136-L172","documentation":"Thrown after the emulator's inline CodeBuild action polls a build to completion and the final status is anything other than SUCCEEDED (FAILED, FAULT, TIMED_OUT, STOPPED). The message embeds the build id and its terminal status so you can look the build up in the CodeBuild emulator for logs. It fails the pipeline action as ActionExecutionFailed.","triggerScenarios":"Buildspec that exits non-zero; build environment missing dependencies so CodeBuild marks it FAILED; build stopped because the pipeline execution was stop-requested; build timeout in the emulator's CodeBuild service.","commonSituations":"Local emulator images lacking tools the buildspec assumes; unit tests failing inside the build; Docker-based builds failing because the emulator's build environment cannot reach a registry.","solutions":["Fetch the build with BatchGetBuilds using the id from the message and inspect its logs/phases for the failing command","Fix the buildspec (exit codes, missing tools) or the artifact the build consumes","If the build was stopped by a pipeline stop, re-run the pipeline execution after resolving the stop cause"],"exampleFix":"# before\nbuildspec:\n  version: 0.2\n  phases: { build: { commands: [\"npm test\"] } }  # tests exit 1 -> FAILED\n\n# after\nbuildspec:\n  version: 0.2\n  phases: { build: { commands: [\"npm test || echo 'tests skipped locally'\"] } }","handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":"try {\n    client.startPipelineExecution(r -> r.name(pipelineName));\n} catch (ActionExecutionFailedException e) {\n    if (e.getMessage().contains(\"CodeBuild build\")) {\n        String buildId = extractBuildId(e.getMessage());\n        Build b = codebuild.batchGetBuilds(r -> r.ids(buildId)).builds().get(0);\n        logger.error(\"build {} logs: {}\", buildId, b.logs());\n    }\n    throw e;\n}","preventionTips":["Keep buildspecs hermetic and exit-zero only on success; test builds directly in CodeBuild before wiring into the pipeline","Pin build tool versions in the buildspec so emulator environments behave like CI"],"tags":["codepipeline","codebuild","action-failed","build-status"],"backgroundTag":null,"analyzedSha":"62ff490619e7bd3554597c28c704081b4c15add5","analyzedAt":"2026-08-14T14:25:23.764Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}