Skip to content

Commit bf66e80

Browse files
jvoganclaude
andauthored
Fix red CI: lowercase GHCR tags; stop gating release check on local Tier A (#6)
Three workflows were failing on main. Build GeneCluster runner image / Build GeneCluster Superpowers image: Both derived IMAGE_NAME from ${{ github.repository_owner }} ("BioSymphony"), producing tags like ghcr.io/BioSymphony/... which GHCR rejects with "repository name must be lowercase". Compute IMAGE_NAME in a new "Normalize image name" step via ${OWNER,,}, and lowercase the Superpowers DEFAULT_BASE_IMAGE owner the same way so it can pull the runner base image. Public release check (runs on every push + PR): make public-audit -> capability ran capability_probe.py, which exits 1 unless Tier A local tooling (PyMOL/ChimeraX GUIs, conda, the ValarTTS server on :8787) is present. A hosted runner never has these, so the gate could not pass in CI. Add a --no-fail (report-only) flag to the probe and pass it from the `capability` Make target; direct invocation without the flag keeps the exit-1 local-readiness signal. Verified: `make public-release-check` now exits 0 locally (101 unit tests pass, all audits clean). The image-build workflows trigger on push to main (and their own paths), so they re-run on merge. Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
1 parent b1f02a8 commit bf66e80

4 files changed

Lines changed: 30 additions & 4 deletions

File tree

.github/workflows/build-genecluster-runner.yml

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,8 @@ permissions:
1919

2020
env:
2121
REGISTRY: ghcr.io
22-
IMAGE_NAME: ${{ github.repository_owner }}/genecluster-runner
22+
# IMAGE_NAME is computed (lowercased) in the "Normalize image name" step below.
23+
# GHCR rejects tags containing uppercase characters and the owner is "BioSymphony".
2324

2425
jobs:
2526
build:
@@ -29,6 +30,12 @@ jobs:
2930
digest: ${{ steps.build.outputs.digest }}
3031

3132
steps:
33+
- name: Normalize image name
34+
# GHCR repository names must be lowercase; github.repository_owner is "BioSymphony".
35+
env:
36+
OWNER: ${{ github.repository_owner }}
37+
run: echo "IMAGE_NAME=${OWNER,,}/genecluster-runner" >> "$GITHUB_ENV"
38+
3239
- name: Checkout
3340
uses: actions/checkout@v6
3441

.github/workflows/build-genecluster-superpowers.yml

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,8 @@ permissions:
3939

4040
env:
4141
REGISTRY: ghcr.io
42-
IMAGE_NAME: ${{ github.repository_owner }}/genecluster-superpowers
42+
# IMAGE_NAME is computed (lowercased) in the "Normalize image name" step below.
43+
# GHCR rejects tags containing uppercase characters and the owner is "BioSymphony".
4344

4445
jobs:
4546
build:
@@ -49,6 +50,12 @@ jobs:
4950
digest: ${{ steps.build.outputs.digest }}
5051

5152
steps:
53+
- name: Normalize image name
54+
# GHCR repository names must be lowercase; github.repository_owner is "BioSymphony".
55+
env:
56+
OWNER: ${{ github.repository_owner }}
57+
run: echo "IMAGE_NAME=${OWNER,,}/genecluster-superpowers" >> "$GITHUB_ENV"
58+
5259
- name: Checkout
5360
uses: actions/checkout@v6
5461

@@ -79,7 +86,7 @@ jobs:
7986
BASE_IMAGE_INPUT: ${{ inputs.base_runner_image }}
8087
GITHUB_REPOSITORY_OWNER: ${{ github.repository_owner }}
8188
run: |
82-
DEFAULT_BASE_IMAGE="${REGISTRY}/${GITHUB_REPOSITORY_OWNER}/genecluster-runner:v0.1"
89+
DEFAULT_BASE_IMAGE="${REGISTRY}/${GITHUB_REPOSITORY_OWNER,,}/genecluster-runner:v0.1"
8390
{
8491
echo "args<<EOF"
8592
echo "BASE_IMAGE=${BASE_IMAGE_INPUT:-$DEFAULT_BASE_IMAGE}"

Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ skill-audit:
2222
PYTHONDONTWRITEBYTECODE=1 python3 -B skills/biosymphony/scripts/biosymphony_public_skill_audit.py --skill-root skills/biosymphony
2323

2424
capability:
25-
PYTHONDONTWRITEBYTECODE=1 python3 -B skills/biosymphony/scripts/capability_probe.py --json
25+
PYTHONDONTWRITEBYTECODE=1 python3 -B skills/biosymphony/scripts/capability_probe.py --json --no-fail
2626

2727
artifact-scan:
2828
PYTHONDONTWRITEBYTECODE=1 python3 -B skills/biosymphony/scripts/genecluster_preflight.py \

skills/biosymphony/scripts/capability_probe.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,16 @@ def conda_envs(conda_path: str | None) -> dict[str, Any]:
9292
def main() -> int:
9393
parser = argparse.ArgumentParser(description="Probe local BioSymphony capability tiers.")
9494
parser.add_argument("--json", action="store_true", help="Emit machine-readable JSON.")
95+
parser.add_argument(
96+
"--no-fail",
97+
action="store_true",
98+
help=(
99+
"Report-only: always exit 0 even when Tier A is not locally ready. "
100+
"Used by `make capability` so CI (which lacks local GUI apps / tooling / "
101+
"the ValarTTS server) does not fail. Direct invocation without this flag "
102+
"keeps the exit-1 signal for local readiness checks."
103+
),
104+
)
95105
args = parser.parse_args()
96106

97107
path_commands = {cmd: shutil.which(cmd) for cmd in PATH_COMMANDS}
@@ -173,6 +183,8 @@ def main() -> int:
173183
if missing_mods:
174184
print("Missing Python modules: " + ", ".join(missing_mods))
175185

186+
if args.no_fail:
187+
return 0
176188
return 0 if tier_a_ready else 1
177189

178190

0 commit comments

Comments
 (0)