Accepted workflow name/version pairs collide in the Library
At main 008c9faa (package 0.6.3), the workflow parser accepts arbitrary version strings. Library IDs concatenate workflow:<name>:<version>, and reviews split that ID on the last colon.
Reproduction: drop two valid workflow YAML files into the configured workflows folder: workflow.id: demo with workflow.version: 'release:1', and workflow.id: demo:release with workflow.version: '1'. Both cache rows exist, but both mint workflow:demo:release:1; the Library map keeps just one. The first pair also cannot round-trip its identity to a review: the parser reads name demo:release, version 1.
Two actual SQLite/filesystem/HTTP route and identity regressions fail while 34 controls pass. An unambiguous opaque tuple for versions containing a colon fixes both issues, with all 36 targeted tests passing. Every previously unambiguous ID remains unchanged, including colon-bearing names and literal percent sequences. No workflow validation restriction or SQLite migration is needed.
Accepted workflow name/version pairs collide in the Library
At main
008c9faa(package 0.6.3), the workflow parser accepts arbitrary version strings. Library IDs concatenateworkflow:<name>:<version>, and reviews split that ID on the last colon.Reproduction: drop two valid workflow YAML files into the configured workflows folder:
workflow.id: demowithworkflow.version: 'release:1', andworkflow.id: demo:releasewithworkflow.version: '1'. Both cache rows exist, but both mintworkflow:demo:release:1; the Library map keeps just one. The first pair also cannot round-trip its identity to a review: the parser reads namedemo:release, version1.Two actual SQLite/filesystem/HTTP route and identity regressions fail while 34 controls pass. An unambiguous opaque tuple for versions containing a colon fixes both issues, with all 36 targeted tests passing. Every previously unambiguous ID remains unchanged, including colon-bearing names and literal percent sequences. No workflow validation restriction or SQLite migration is needed.