From 2419d8e43ed6d5e9d47f7a34e7dbf835fb5d8a21 Mon Sep 17 00:00:00 2001 From: ugur Date: Thu, 1 Oct 2026 10:38:12 +0100 Subject: [PATCH] Fix: runs/{term_id}/ must use underscore form, not CURIE, in paths Found via a real CI run (obophenotype/cell-ontology#3765): the colon-form term_id directory (runs/CL:0000037/) made actions/upload-artifact fail outright -- "The path for one of the files in artifact is not valid: /CL:0000037/report.md. Contains the following character: Colon :" #8's cell_id->term_id cleanup reasoned that a colon is a valid POSIX filename character, which is true, but missed that actions/upload-artifact enforces its own stricter path validation (cross-platform/NTFS compatibility) independent of the runner's actual filesystem. Keeps the single term_id field/concept from #8 (no reintroduction of a separate cell_id field) -- only the path construction now calls for the underscore substitution, same as the pre-#8 cell_id convention used for, while the term_id field inside written JSON/markdown content stays in CURIE form. Co-Authored-By: Claude Sonnet 5 --- clara_workflow/agent_instructions.md | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/clara_workflow/agent_instructions.md b/clara_workflow/agent_instructions.md index 98c8dd3..663679e 100644 --- a/clara_workflow/agent_instructions.md +++ b/clara_workflow/agent_instructions.md @@ -35,9 +35,13 @@ Treat this routed payload as the stable consumer contract for PR-triggered CLARA review. Every id downstream of the routing payload is the CURIE form (`term_id`, e.g. -`CL:4033094`), including output paths (`runs/{term_id}/...`). A colon is a -valid POSIX filename character, so this needs no further encoding on the -runner. +`CL:4033094`). Output paths are the exception: `actions/upload-artifact` +rejects colons in artifact paths (cross-platform/NTFS compatibility, enforced +by the upload step, not the runner's own filesystem), so use the underscore +form there -- replace `:` with `_` (`CL:4033094` -> `CL_4033094`) when +constructing `runs/{term_id}/...`. The `term_id` field inside the written +JSON/markdown content itself stays in CURIE form; only the directory and file +*paths* need the substitution. The routing payload contains `targets`. Each target has one of these routes: @@ -94,7 +98,9 @@ Relevant target fields: - Group all targets by `term_id`. - Process each term group independently. -For every processed term, write one output bundle under `runs/{term_id}/`. +For every processed term, write one output bundle under `runs/{term_id}/`, +using the underscore form of `term_id` for the path (e.g. `CL:4033094` -> +`runs/CL_4033094/`) -- see the note above on why. ## Assertion preparation