floci-io/floci · error · AwsException

Override %s must not contain control characters.

Error message

Override %s must not contain control characters.

What it means

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.

Source

Thrown at src/main/java/io/github/hectorvent/floci/core/common/ReservedTags.java:154

    private static String getOverride(Map<String, String> tags, String override, TriFunction<String, String, String, String> validator, String name, String errorCode) {
        if (tags == null) {
            return null;
        }
        if (tags.containsKey(override)) {
            String ov = tags.get(override);
            return validator.apply(ov, name, errorCode);
        }
        return null;
    }

    private static String validateOverrideId(String overrideId, String name, String errorCode) {
        String normalized = checkNullAndWhitespace(overrideId, name, errorCode);
        if (normalized.indexOf('/') >= 0 || normalized.indexOf('?') >= 0 || normalized.indexOf('#') >= 0) {
            throw new AwsException(errorCode, "Override %s contains unsupported characters.".formatted(name), 400);
        }
        if (normalized.chars().anyMatch(Character::isISOControl)) {
            throw new AwsException(errorCode, CONTROL_CHARACTER_ERROR_MESSAGE.formatted(name), 400);
        }
        return normalized;
    }

    private static String validateClientSecret(String overrideSecret, String name, String errorCode) {
        String normalized = checkNullAndWhitespace(overrideSecret, name, errorCode);
        if (normalized.chars().anyMatch(Character::isISOControl)) {
            throw new AwsException(errorCode, CONTROL_CHARACTER_ERROR_MESSAGE.formatted(name), 400);
        }
        return normalized;
    }

    private static String checkNullAndWhitespace(String overrideSecret, String name, String errorCode) {
        if (overrideSecret == null || overrideSecret.trim().isEmpty()) {
            throw new AwsException(errorCode, "Override %s must not be blank.".formatted(name), 400);
        }
        String normalized = overrideSecret.trim();
        if (normalized.chars().anyMatch(Character::isWhitespace)) {

View on GitHub (pinned to 62ff490619)

Solutions

  1. Fetch the build with BatchGetBuilds using the id from the message and inspect its logs/phases for the failing command
  2. Fix the buildspec (exit codes, missing tools) or the artifact the build consumes
  3. If the build was stopped by a pipeline stop, re-run the pipeline execution after resolving the stop cause

Example fix

# before
buildspec:
  version: 0.2
  phases: { build: { commands: ["npm test"] } }  # tests exit 1 -> FAILED

# after
buildspec:
  version: 0.2
  phases: { build: { commands: ["npm test || echo 'tests skipped locally'"] } }
Defensive patterns

Strategy: try-catch

Try / catch

try {
    client.startPipelineExecution(r -> r.name(pipelineName));
} catch (ActionExecutionFailedException e) {
    if (e.getMessage().contains("CodeBuild build")) {
        String buildId = extractBuildId(e.getMessage());
        Build b = codebuild.batchGetBuilds(r -> r.ids(buildId)).builds().get(0);
        logger.error("build {} logs: {}", buildId, b.logs());
    }
    throw e;
}

Prevention

When it happens

Trigger: 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.

Common situations: 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.

Related errors


AI-assisted analysis of floci-io/floci@62ff490619 (2026-08-14). Data as JSON: /api/errors/7fe6a4ffe1818198. Report an issue: GitHub.