Summary
harness delete artifact_version <registry/artifact/version> always fails with a 500 when
<version> is a content digest (sha256:...), which is the only version identifier
harness list artifact_version / harness get artifact_version return for Docker artifacts
pushed via docker buildx (no tag-based version lookup is exposed by get/list either —
attempting <registry>/<artifact>/<tag-name> as the version segment 404s instead).
$ harness delete artifact_version "<registry>/<artifact>/sha256:<64-hex-digest>" --level org --org <ORG> --force
API error 500: failed to delete artifact version: failed to parse digest: unknown algorithm prefix "sh"
The error string (unknown algorithm prefix "sh") strongly suggests the backend is
mis-splitting the digest string on its : — "sha256" becomes "sh" plus a leftover
remainder, rather than "sha256" + "<hex>".
This affects any Docker artifact version whose only "version" identifier is a content
digest — i.e. essentially every image pushed via docker buildx build --push without
disable_retag/dockerspec-style extra tags, since harness list artifact_version names
the version by digest, not by tag.
Steps to reproduce
- Push any Docker image to a Harness Artifact Registry (native
har-backed registry, DOCKER package type), e.g. via docker buildx build --push or a Harness CI BuildAndPushDockerRegistry step.
harness list artifact_version <registry>/<artifact> --level org --org <ORG> --all --format json — confirm the pushed version is listed only by its digest (name field = sha256:...), with its tag(s) under metadata.tags.
harness get artifact_version "<registry>/<artifact>/sha256:<digest>" --level org --org <ORG> — succeeds, returns the version metadata correctly.
harness delete artifact_version "<registry>/<artifact>/sha256:<digest>" --level org --org <ORG> --force — fails with the 500 above.
Debug output (--debug) shows the CLI constructs and sends this request:
DELETE /har/api/v1/registry/<ACCOUNT_ID>/<ORG>/<registry>/+/artifact/<artifact>/+/version/sha256:<digest>?accountIdentifier=<ACCOUNT_ID>&orgIdentifier=<ORG>
→ 500 {"failed to delete artifact version: failed to parse digest: unknown algorithm prefix \"sh\""}
I also tried URL-encoding the colon in the version segment (sha256%3A<digest>) client-side —
same result, since the CLI (or the server) appears to normalize/decode it back to a literal
: before constructing the request.
Expected behavior
harness delete artifact_version should successfully delete a version identified by its
content digest, exactly as returned by harness list artifact_version / accepted by
harness get artifact_version.
Workaround used
Bypassed the CLI/har module entirely and used the standard OCI Distribution / Docker
Registry v2 HTTP API directly against the same registry endpoint:
# 1. Get a delete-scoped bearer token (reusing existing local `docker login` credentials
# for the registry host, read from ~/.docker/config.json)
TOKEN=$(curl -s -u "<user>:<pass>" \
"https://<registry-host>/v2/token?service=harness-artifact-registry&scope=repository:<account>/<registry>/<artifact>:pull,push,delete" \
| jq -r .token)
# 2. Delete the manifest by digest via the standard registry API
curl -X DELETE -H "Authorization: Bearer $TOKEN" \
"https://<registry-host>/v2/<account>/<registry>/<artifact>/manifests/sha256:<digest>"
# -> 202 Accepted
This confirms the underlying registry itself supports manifest deletion by digest just fine —
the bug is specifically in the har CLI plugin's (or its backend API's) request path/digest
handling for the delete artifact_version verb.
Environment
harness CLI version: 3.6.2
har plugin version: 0.9.3 (us-docker.pkg.dev/... — bundled plugin, not separately installed)
- OS/Arch: darwin/arm64
Summary
harness delete artifact_version <registry/artifact/version>always fails with a 500 when<version>is a content digest (sha256:...), which is the only version identifierharness list artifact_version/harness get artifact_versionreturn for Docker artifactspushed via
docker buildx(no tag-based version lookup is exposed byget/listeither —attempting
<registry>/<artifact>/<tag-name>as the version segment 404s instead).The error string (
unknown algorithm prefix "sh") strongly suggests the backend ismis-splitting the digest string on its
:—"sha256"becomes"sh"plus a leftoverremainder, rather than
"sha256"+"<hex>".This affects any Docker artifact version whose only "version" identifier is a content
digest — i.e. essentially every image pushed via
docker buildx build --pushwithoutdisable_retag/dockerspec-style extra tags, sinceharness list artifact_versionnamesthe version by digest, not by tag.
Steps to reproduce
har-backed registry,DOCKERpackage type), e.g. viadocker buildx build --pushor a Harness CIBuildAndPushDockerRegistrystep.harness list artifact_version <registry>/<artifact> --level org --org <ORG> --all --format json— confirm the pushed version is listed only by its digest (namefield =sha256:...), with its tag(s) undermetadata.tags.harness get artifact_version "<registry>/<artifact>/sha256:<digest>" --level org --org <ORG>— succeeds, returns the version metadata correctly.harness delete artifact_version "<registry>/<artifact>/sha256:<digest>" --level org --org <ORG> --force— fails with the 500 above.Debug output (
--debug) shows the CLI constructs and sends this request:→
500 {"failed to delete artifact version: failed to parse digest: unknown algorithm prefix \"sh\""}I also tried URL-encoding the colon in the version segment (
sha256%3A<digest>) client-side —same result, since the CLI (or the server) appears to normalize/decode it back to a literal
:before constructing the request.Expected behavior
harness delete artifact_versionshould successfully delete a version identified by itscontent digest, exactly as returned by
harness list artifact_version/ accepted byharness get artifact_version.Workaround used
Bypassed the CLI/
harmodule entirely and used the standard OCI Distribution / DockerRegistry v2 HTTP API directly against the same registry endpoint:
This confirms the underlying registry itself supports manifest deletion by digest just fine —
the bug is specifically in the
harCLI plugin's (or its backend API's) request path/digesthandling for the
delete artifact_versionverb.Environment
harnessCLI version: 3.6.2harplugin version: 0.9.3 (us-docker.pkg.dev/...— bundled plugin, not separately installed)