floci-io/floci · warning · AwsException

Override %s must not contain whitespace.

Error message

Override %s must not contain whitespace.

What it means

Thrown by the manual-approval wait loop when the approval action ends in the 'Failed' status; the exception message is the action's summary, which for approvals is typically set by RetryStageExecution/approval rejection or by whatever transition set status to Failed. The emulator blocks the execution thread, polling until the action leaves InProgress, then converts a Failed terminal state into ActionExecutionFailed.

Source

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

        }
        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)) {
            throw new AwsException(errorCode, "Override %s must not contain whitespace.".formatted(name), 400);
        }
        return normalized;
    }


    private static boolean isReserved(String key) {
        return key != null && key.startsWith(RESERVED_PREFIX);
    }
}

View on GitHub (pinned to 62ff490619)

Solutions

  1. Treat this as the expected terminal outcome of a rejected approval — inspect the action's summary in GetPipelineState/execution details for who/why
  2. If the rejection is unexpected, re-run the pipeline execution and approve via the recorded approval token
  3. For automated emulator tests, either approve the token or assert the ActionExecutionFailed as the rejection signal
Defensive patterns

Strategy: try-catch

Try / catch

try {
    client.startPipelineExecution(r -> r.name(name));
} catch (ActionExecutionFailedException e) {
    if ("Waiting for approval.".contains(e.getMessage()) || e.getMessage().contains("approval")) {
        // expected rejection path; assert summary instead of failing the test
    }
}

Prevention

When it happens

Trigger: An approval action rejected via the approval flow (the emulator sets the stage action to Failed with a rejection summary); approval marked failed programmatically; an external update to the action's status to Failed while waiting.

Common situations: A human or automation rejecting a deployment gate in tests; pipelines left waiting on approval that a cleanup script then fails; stop/abandon paths that record a failure summary.

Related errors


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