26  CI and Github Actions

26.1 Release failure decoder

A release’s Install operator step runs tercenctl operator install against a test Tercen instance, and installation fails at the first stage that goes wrong. Fixing one stage often reveals the next, so read the log of the latest run, find its stage below, and fix it before tagging again.

On the managed setup, the release check runs on the stage instance (the TERCEN_TEST_OPERATOR_URI secret), as a plain test user in the default tenant — not as your own user or team. It can only use what is open to that user: trusted registries and public images.

# Stage Error in the log Cause Fix
1 Source check tercen.forbidden.untrusted.git The GitHub organisation is not in the instance’s tercen.trusted.git Ask the instance admin to add it (below)
2 Image check tercen.forbidden.untrusted.docker The image’s registry namespace (e.g. ghcr.io/myorg/) is not in the instance’s tercen.trusted.docker Ask the admin to add it, or publish the image to a trusted namespace
3 Image pull reading manifest … denied or unable to retrieve auth token: invalid username/password: unauthorized The image is a private ghcr package. These are the errors ghcr returns to an anonymous request for a private package — not a bad password. Make the package public: package page → Package settings → Danger Zone → Change visibility → Public. Verify with the check below.
4 Image pull manifest unknown The tag Tercen asks for was never pushed Check which tag operator.json resolves to (see the container pin rule) and that CI pushed it
5 Test discovery operator.run.test.not.found No tests/ (or test/) folder with a *.json test Add a unit test (Operator Unit Tests)
6 Test comparison task.test.operator.bad.* Computed output differs from the expected files See the entries below

Check that an image is anonymously pullable (what the test instance sees):

IMG=myorg/my_operator            # the ghcr path, without ghcr.io/ and tag
TOKEN=$(curl -s "https://ghcr.io/token?scope=repository:$IMG:pull" \
  | python3 -c "import json,sys; print(json.load(sys.stdin).get('token',''))")
curl -s -o /dev/null -w '%{http_code}\n' -H "Authorization: Bearer $TOKEN" \
  "https://ghcr.io/v2/$IMG/tags/list"
# 200 = public, 403 = private (or missing)
NoteSeen in practice (2026-10)

Three operators in public pamgene/ repositories failed release after release for different reasons in sequence: first stage 2 (ghcr.io/pamgene/ not yet trusted on stage), then stage 3 (the packages had been created private), then stage 5 (no tests/ folder). Each stage only became visible after the previous one was fixed.

26.2 Test not found

operator.run.test.not.found

This error happens when none of the test, tests or workflow_tests have been found at the repository root. For operators, use tests/ — a test/ folder runs the tests without comparing outputs. See Operator Unit Tests.

26.3 Wrong relations

task.test.operator.bad.nRelations

This error happens when there are not as many tables (relations) between the computed and expected outputs.

26.4 Wrong nCols / nRows

task.test.operator.bad.nCols task.test.operator.bad.nRows

This error happens when there are not as many columns or rows between the computed and expected output relations.

26.5 Wrong column names

task.test.operator.bad.column.names

This error happens when the computed and expected output relations do not have the exact same column names.

Maybe you’ve added or renamed a column in the latest version of the operator? In that case, the reference table should be updated accordingly.

26.6 Wrong column type

task.test.operator.bad.column.type

  • Check that .ri and .ci factors are output as integers in your operators.
  • If another factor (for example, a cluster ID), tercen test will expect is to be a double. In that case, you need to provide a schema file. If you use tim to genenerate your test, you can use the XXX argument to the build_test_data function.

26.7 Wrong values

task.test.operator.bad.value

This error occurs when a value is different between the reference table and the computed table. It gives you the row number and both values to help finding the issue.

26.8 Wrong correlation

task.test.operator.bad.correlation

This error occurs when the correlation between the reference table and the computed table values is not high enough.

26.9 Untrusted git

tercen.forbidden.untrusted.git

This error occurs when you try to install an operator from an untrusted GitHub organisation. The organisation in which you develop your operator should be added to your Tercen instance configuration file.