floci-io/floci · error · AwsException

Override %s contains unsupported characters.

Error message

Override %s contains unsupported characters.

What it means

Thrown by the S3 deploy action when the action's first input artifact is not present in the execution's runtime artifact map. The emulator stores produced artifacts in memory keyed by execution + artifact name; a deploy-style S3 action reads inputArtifacts[0], and if no earlier action in the pipeline produced an artifact with that exact name, the lookup returns null and the action fails with InvalidJobStateException.

Source

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

                }
        }
    }

    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);

View on GitHub (pinned to 62ff490619)

Solutions

  1. Set the deploy action's inputArtifacts[0].name to exactly the outputArtifacts name declared by the upstream action
  2. Confirm the upstream (usually Source) action succeeded and declared that output artifact
  3. Search the whole pipeline definition for the artifact name to catch typos between stages

Example fix

# before
- Name: Source
  Actions: [{ Name: src, OutputArtifacts: [{ Name: SourceOut }], ... }]
- Name: Deploy
  Actions: [{ Name: copy, InputArtifacts: [{ Name: source_out }], ... }]  # name mismatch

# after
- Name: Deploy
  Actions: [{ Name: copy, InputArtifacts: [{ Name: SourceOut }], ... }]
Defensive patterns

Strategy: validation

Validate before calling

Set<String> produced = new HashSet<>();
for (StageDeclaration s : pipeline.stages()) {
    for (ActionDeclaration a : s.actions()) {
        a.outputArtifacts().forEach(o -> produced.add(o.name()));
        for (InputArtifact in : a.inputArtifacts()) {
            if (!produced.contains(in.name())) {
                throw new IllegalStateException(
                    "Action " + a.name() + " consumes undeclared artifact " + in.name());
            }
        }
    }
}

Prevention

When it happens

Trigger: A Deploy-category S3 action whose inputArtifacts[0].name does not match any outputArtifacts name of an upstream action; the upstream source action failed or was skipped so nothing was stored; typo in the artifact name between stages.

Common situations: Hand-written pipeline JSON where output/in artifact names drift; adding a deploy stage that forgets to declare its input artifact link; renaming an artifact in the source stage but not downstream.

Related errors


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