This document defines the release procedure for CorridorKey. The goal is a repeatable build and packaging flow that produces correctly versioned artifacts from the curated runtime roots without manual file edits.
Release packaging and release messaging serve different purposes. Packaging defines what artifacts are built. Release messaging defines what support is claimed. Claims must match packaged and validated product tracks, not every backend hook present in the codebase.
CorridorKey follows Semantic Versioning (MAJOR.MINOR.PATCH).
- MAJOR: breaking changes such as incompatible OFX parameter changes, removed hardware support, or major structural rewrites.
- MINOR: backward-compatible features such as new models, new quality options, or performance improvements.
- PATCH: backward-compatible fixes such as crash fixes, UI fixes, or corrected defaults.
Every release must bump the root CMakeLists.txt VERSION. That root CMake
version is the single Windows release version source. Runtime GUI metadata is
synchronized from it by the Windows packaging scripts.
Two distinct identifier kinds exist and must not be confused. Both are derived mechanically from Git state; neither uses a hand-maintained counter file.
| Kind | Who sees it | How it is produced | When it changes |
|---|---|---|---|
| Published tag | GitHub Releases consumers, auto-updater | vX.Y.Z-<platform>.N, written by the publishing pipeline |
Only when a release is published to GitHub |
| Local build label | OFX panel, CLI --version, runtime-server log filename, dist artifact filenames |
Current PROJECT_VERSION plus platform/source identity from git describe --tags --dirty --match "v*-<platform>.*", plus -bYYYYMMDDTHHMMSSfffZ |
Every build invocation; the source suffix also changes every commit and flips to -dirty on uncommitted changes |
This split follows the pattern used by the Linux kernel, Go, Rust nightly, Kubernetes, and most projects that ship a binary carrying a version string. The published tag is the rare, human-curated event; the local label is the always-on, self-maintaining identifier that answers "which source and build attempt is loaded in my Resolve right now?" without ever inflating the release list.
Published tag format. Every tag pushed to GitHub uses this shape:
- Windows prerelease:
vX.Y.Z-win.N - macOS prerelease:
vX.Y.Z-mac.N - Linux prerelease:
vX.Y.Z-linux.N - Stable (all platforms):
vX.Y.Zwith no suffix
The platform identifier (win, mac, linux) is required on every
prerelease tag. A suffix-only tag like v0.7.5-22 is not valid and will
be rejected by the publishing pipeline. The auto-updater in
version_check.cpp filters releases by
this identifier so a Windows user on v0.7.5-win.22 never receives a
macOS prerelease and vice versa. Stable releases without a suffix apply
to all platforms universally.
Per-platform counters. Each platform maintains its own independent
counter N. Windows and macOS iterate at whatever cadence their track
demands; they do not share or coordinate the counter. N is the count
of published prereleases for that X.Y.Z-<platform> cycle — it is
never incremented by a local build, so it grows slowly and predictably
(typically 1 to 5 per cycle, matching how Kubernetes, Node.js, and
Python number their RCs).
Local build label format. When a build is produced without
-DisplayVersionLabel, the pipeline anchors the visible label to the current
PROJECT_VERSION, then appends source identity from
git describe --tags --dirty --match "v*-<platform>.*" and
-bYYYYMMDDTHHMMSSfffZ. If the closest published prerelease tag belongs to
the same X.Y.Z, the local label keeps that tag counter. If the project has
already moved to a new X.Y.Z before the first published prerelease for that
cycle, the local label uses <platform>.0 to mean "unpublished local build
for this project version"; it never shows the previous X.Y.Z as its visible
version. Concrete examples for a Windows build:
| Git state | Derived label |
|---|---|
PROJECT_VERSION=0.8.1, clean checkout at exactly v0.8.1-win.1 |
0.8.1-win.1-b20260522T010203004Z |
PROJECT_VERSION=0.8.1, 3 commits past v0.8.1-win.1, clean |
0.8.1-win.1-3-gabc1234-b20260522T010203004Z |
PROJECT_VERSION=0.8.1, same as above, with uncommitted changes |
0.8.1-win.1-3-gabc1234-dirty-b20260522T010203004Z |
PROJECT_VERSION=0.8.2, 3 commits past previous tag v0.8.1-win.1, clean |
0.8.2-win.0-3-gabc1234-b20260522T010203004Z |
The label reads directly as a statement about product version, repo state, and
build attempt: 0.8.2-win.0-3-gabc1234-b20260522T010203004Z means "a local
unpublished Windows build for project version 0.8.2, three commits past the
nearest Windows prerelease tag, at commit abc1234, built at
20260522T010203004Z". Two rebuilds of the same commit share the same source
identity but must produce different labels. The label identifies both the
source and the build attempt, so the installer filename and the host panel can
be matched without relying on file hashes.
Counter advancement rule (absolute). N advances only inside the
-PublishGithub code path of the canonical release pipeline. There is
no other mechanism — no manual edit to a version file, no
-DisplayVersionLabel override that bumps state, no local task that
writes a new tag. The next N is computed as
max(existing-N-for-this-X.Y.Z-platform) + 1, from the tags already on
the remote. First prerelease of a new X.Y.Z cycle starts at .1.
Dirty-tree rule (absolute). The pipeline refuses to publish when
git describe --dirty reports -dirty, or when there are staged but
uncommitted changes. Publication requires a clean, committed,
pushed-or-pushable HEAD. This closes the loophole where a label baked
from an uncommitted working tree could reach users and be
unreproducible from Git.
-DisplayVersionLabel override. The flag remains for the narrow
case where the operator needs to force a specific label string, for
example when cutting a bespoke build for a single tester or reproducing
a historical label. It is not the normal flow; the normal flow is
letting the pipeline derive the label and build reference. Using
-DisplayVersionLabel does not publish anything and does not advance
N.
Measurement ledger. Published prereleases must be recorded in OPTIMIZATION_MEASUREMENTS.md with the measured hot-path numbers at the time of cut. Unpublished local builds do not go in the ledger — they are ephemeral by definition and their labels contain the commit sha, so any measurement taken from one is already traceable to the exact source.
A published tag is immutable. Once a release is pushed to GitHub, its assets must never be replaced, re-uploaded, or re-pointed to a different commit. A build that needs to be redone gets a new tag with the next counter value. This rule is absolute: the SemVer comparator in version_check.cpp trusts the tag name as ground truth, so mutating a published tag's assets breaks every installed client that cached a stale URL from it.
Stable releases are the only clean-label published artifacts. A stable
Windows release uses vX.Y.Z, CorridorKey_vX.Y.Z_Windows_online_Setup.exe,
and panel/CLI version X.Y.Z. Published prereleases keep the visible
X.Y.Z-win.N identifier; if a prerelease build is redone after publication,
immutability requires the next N.
This also forbids hosting multiple platforms' assets under a single
shared tag (for example, Windows -win.22 alongside macOS -mac.10
under one v0.7.5 release). Each platform-qualified tag owns exactly
its platform's assets.
The canonical Windows release pipeline calls gh release create with
these flags, derived from the tag shape:
- Tag with
-<platform>.Nsuffix →--prerelease - Tag with no suffix →
--latest
Stable release vX.Y.Z is published only after every active platform
track has shipped its final prerelease for that X.Y.Z cycle.
Because Windows, macOS, and Linux are cut on independent timelines and each platform's users download from its own tag, the lifecycle rules below are absolute. Breaking any of them can invalidate a download link that a user on a different platform is actively relying on.
Cross-platform non-interference (absolute). Publishing, deleting,
renaming, or editing a release or tag on one platform must never touch
a release or tag on another platform. The publishing pipeline's only
write path is gh release create (plus gh release edit on the tag it
just created, for retitling). It must not call gh release delete or
git push --delete <tag> on any tag whose platform identifier differs
from the one being published. This is defense-in-depth against a
single-track operator accidentally wiping downloads for the other two
tracks.
Same-platform supersession is manual and conservative. When
vX.Y.Z-<platform>.N+1 ships, the prior vX.Y.Z-<platform>.N is not
deleted by the pipeline. The operator may manually delete a superseded
prerelease only when (a) a strictly newer vX.Y.Z-<platform>.M with
M > N already exists on the same platform and X.Y.Z, and (b) the
older build is known broken or obsolete. Absent both conditions, keep
the release — the release list is also an audit log.
Known-broken prereleases may be deleted. A prerelease that shipped
a reproducible fatal defect (for example, the v0.7.5-21 Windows build
that failed to load in Resolve due to missing NPP runtime DLLs) may be
deleted to prevent new downloads of a guaranteed-broken artifact. The
deletion must be explicit, logged in the commit or PR that replaces it,
and must not touch any other platform's tags.
Stable does not erase its prereleases. When stable vX.Y.Z ships,
the vX.Y.Z-win.*, vX.Y.Z-mac.*, and vX.Y.Z-linux.* prereleases
stay. Users on a prerelease are migrated to stable by the auto-updater
via SemVer precedence (stable outranks any prerelease of the same
X.Y.Z), so deleting the prereleases provides no functional benefit
and costs historical traceability.
Mutation is forbidden on any published tag. See the "Tag and release immutability" subsection above. This applies regardless of platform, age, or supersession state. A broken tag gets deleted (under the rules above) and replaced with a new tag — never mutated in place.
Artifact names must expose both the version and the backend-specific hardware path so users can choose the correct installer without ambiguity.
- All artifacts include the version number and target OS.
- Backend-bound Windows artifacts include the backend in the filename.
- Do not reuse a generic filename for a backend-specific build.
The OFX product name in legacy artifact filenames is CorridorKey_OFX (not
CorridorKey_Resolve). The plugin is a host-agnostic OFX bundle and runs in
both DaVinci Resolve and Foundry Nuke; the filename must not imply a single
host. Modern Windows online installers use
CorridorKey_v<label>_Windows_online_Setup.exe. Legacy Windows installer
artifacts use the suffix _Install.exe (not _Installer.exe).
Generated by the canonical Windows release wrapper, which delegates to the packaging scripts internally.
- TensorRT RTX:
CorridorKey_v<label>_Windows_online_Setup.exe - DirectML:
CorridorKey_OFX_vX.Y.Z_Windows_DirectML_Install.exe
- Apple Silicon:
CorridorKey_OFX_vX.Y.Z_macOS_AppleSilicon.dmg
Linux is an experimental product track. Packaging emits two installer wrappers
around the same validated CorridorKey.ofx.bundle payload, one per
distribution family, so each user installs through the idiomatic package
manager of the host distribution.
- Debian package (Ubuntu 22.04 / 24.04 LTS):
CorridorKey_OFX_vX.Y.Z_Linux_RTX.deb - RPM package (Rocky Linux / RHEL 9):
CorridorKey_OFX_vX.Y.Z_Linux_RTX.rpm
Both artifacts share the same embedded CorridorKey.ofx.bundle,
bundle_validation.json, and model inventory. They differ only in how they
install the bundle under /usr/OFX/Plugins/ and how they manage the
/usr/local/bin/corridorkey symlink.
Release assets are installers only. Portable archives (.zip for Windows,
.tar.gz for Linux) are not produced or published. Every supported
platform has exactly one installer artifact per track, matching the
filenames above. A user on an unsupported distro or locked-down Windows
host is not a target; do not add fallback archives to accommodate them.
Releases must be built through the canonical repo wrapper so version synchronization, packaged runtime selection, artifact naming, and validation stay consistent.
The canonical Windows pipeline auto-stages every dependency that can be
downloaded from a pinned URL. The table below lists what the operator
still has to install manually; everything else is fetched on demand by
scripts\windows.ps1 -Task prepare-rtx from a clean clone.
| Tool | Expected location / detection | Notes |
|---|---|---|
| Git for Windows | on PATH |
auto-discovered by the helper scripts as a fallback when not on PATH |
| Visual Studio 2022 | Community, Pro, or Enterprise with the "Desktop development with C++" workload and the Windows 10/11 SDK | vcvars64.bat must be locatable under C:\Program Files\Microsoft Visual Studio\2022\*; the pipeline injects the MSVC dev shell on demand |
| CUDA Toolkit 12.9 | default location C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.9 |
or pass -CudaHome <path> through -ForwardArguments |
| vcpkg | C:\tools\vcpkg with VCPKG_ROOT pointing at it |
pinned baseline is in vcpkg-configuration.json; every shell that calls the pipeline must export VCPKG_ROOT |
| Python 3.12 | default per-user install from python.org | auto-discovered by Resolve-CorridorKeyPython312Path; the pin lives in Get-CorridorKeyWindowsRtxBuildContract.required_python_version |
| uv | %USERPROFILE%\.local\bin\uv.exe (default installer path) |
auto-discovered via Resolve-CorridorKeyUvPath; install once with irm https://astral.sh/uv/install.ps1 | iex |
| Inno Setup 6 | ISCC.exe under %LOCALAPPDATA%\Programs\Inno Setup 6\, C:\Program Files (x86)\Inno Setup 6\, C:\Program Files\Inno Setup 6\, or on PATH |
required for modern `-Flavor online |
| NSIS 3.x | default install at C:\Program Files (x86)\NSIS\ |
required only for the legacy OFX installer path used when no modern -Flavor is selected |
What the pipeline handles for the operator:
- TensorRT-RTX SDK: auto-downloaded from the pinned URL in
Get-CorridorKeyWindowsRtxBuildContract.tensorrt_rtx_download_urland extracted intovendor\TensorRT-RTX-<version>\on firstprepare-rtx. No manual staging needed. - OpenFX SDK: auto-cloned at the pinned tag from
AcademySoftwareFoundation/openfxintovendor\openfx\. - ONNX Runtime source: bootstraps
vendor\onnxruntime-src\at the pinned ref when absent. - vcpkg eigen3 archive (blocked by Cloudflare on gitlab):
scripts\vcpkg_asset_fetch.ps1is wired in as a vcpkgX_VCPKG_ASSET_SOURCES=x-script,...that transparently redirects thelibeigen/eigen/<commit>fetch to the byte-identicaleigen-mirror/eigenGitHub mirror. - Models: the four FP16 runtime artifacts under
models\(corridorkey_fp16_512/1024/1536/2048.onnx) are the reuse-path source of truth. If all expected files are present the pipeline skips regeneration entirely; if one or more are missing the pipeline exports them frommodels\CorridorKey.pthviauv run python export_onnx.py.
If any manual row above is not satisfied, stop and fix it. Do not invent workarounds from outside the canonical pipeline; they will diverge from what the pipeline produces and from what users install. See docs/WINDOWS_BUILD.md section 3 for the troubleshooting index of every failure mode the auto-stage paths have been validated against.
Windows has two curated runtime roots and one canonical release entrypoint:
vendor\onnxruntime-windows-rtx- curated TensorRT RTX runtimevendor\onnxruntime-windows-dml- curated DirectML runtimescripts\windows.ps1- canonical Windows build and release entrypoint
Do not use global ONNX Runtime installations or
vendor\onnxruntime-universal as a fallback path. The release flow must
resolve one of the curated runtime roots explicitly.
The canonical Windows release-track command is:
scripts\windows.ps1 -Task release -Version X.Y.Z -Flavor online
That canonical command generates the online Windows RTX host package by
default. Experimental Windows tracks must be requested explicitly:
scripts\windows.ps1 -Task release -Version X.Y.Z -Flavor online -Track dmlscripts\windows.ps1 -Task release -Version X.Y.Z -Flavor online -Track all
The top-level Windows suite installer is produced through package-suite
after the runtime, OFX, and Adobe package roots exist. The suite installer is
the component selection surface for runtime/CLI core, GUI, host plugins, Green,
and Blue.
The wrapper also supports build, prepare-rtx, package-ofx,
package-runtime, and sync-version for local workflow needs, but they are
all part of the same entrypoint. Lower-level scripts are internal delegates
for debugging the wrapper and should not be treated as alternate release
procedures.
The Windows wrapper tasks are intentionally different:
build- compile the binaries only
certify-rtx-artifacts- certify an already existing Windows RTX model set and write the certified
artifact manifest without regenerating the
.onnxfiles from the checkpoint
- certify an already existing Windows RTX model set and write the certified
artifact manifest without regenerating the
package-ofx- package Windows installers from an already certified model set. Without
-Flavor, the task emits the legacy NSIS installer. With-Flavor online|offline, the task emits the selected modern Inno Setup installer and skips the legacy NSIS wrapper; see "Modern installer (Inno Setup)" below for the flavor semantics.
- package Windows installers from an already certified model set. Without
package-adobe- package the Adobe Common Plug-ins MediaCore payload from an Adobe-enabled
build. The task uses the modern Inno Setup installer flow and defaults to
the online flavor unless
-Flavor offlineis selected.
- package the Adobe Common Plug-ins MediaCore payload from an Adobe-enabled
build. The task uses the modern Inno Setup installer flow and defaults to
the online flavor unless
package-runtime- package the portable Windows RTX runtime/GUI bundle and ZIP. DirectML portable runtime packaging is not implemented.
package-suite- package the top-level online/offline Windows suite installer. Runtime/CLI core is fixed, while GUI, host plugins, Green, and Blue are optional components.
release- package the official Windows release tracks from the currently staged, validated inputs
regen-rtx-release- regenerate the Windows RTX artifacts from the checkpoint, certify them on the active RTX host, write the certified artifact manifest, and then package the Windows RTX installer
Authoring lives under scripts/installer/:
corridorkey.iss.template- Inno Setup 6 source consumed by ISCC. Shared OFX/Adobe host-surface metadata, online Components/Types, offline complete-pack behavior, and modern Windows 11-themed wizard (WizardStyle=modern dynamic windows11).build_installer.ps1- PowerShell driver that expands the template and invokes ISCC.exe. Readsdistribution_manifest.jsonfor pack URLs and SHA256 hashes.build_distribution_manifest.py- regeneratesdistribution_manifest.jsonfrom authoritative Hugging Face state.stage_offline_payload.ps1- downloads every "ready" pack file intodist/_offline_payload/for the OFFLINE flavor build.
Two flavors are produced from the SAME template via the Flavor
preprocessor define:
| Flavor | Size | Network at install time | When to use |
|---|---|---|---|
online |
~85 MB | Required | Default. Stub installer downloads selected packs from Hugging Face with SHA256 verification. Recommended setup preselects every available pack; custom setup can leave only runtime/CLI core selected. |
offline |
~7 GB | None | Air-gapped or low-bandwidth installs. Every available pack is pre-bundled inside the .exe, and the same component choices decide what is installed. |
Local release validation builds use the online flavor. The offline
flavor is produced only when validating the no-network installer path or
serving an environment that cannot download packs at install time. Windows
GitHub releases publish the online flavor only; the release pipeline rejects
-PublishGithub unless -Flavor online is selected.
Component selection is consistent across transports. The online flavor downloads selected packs, while the offline flavor bundles the pack bytes and uses the selected components to decide what is installed. Custom setup can install runtime/CLI core only, Green only, Blue only, or Recommended (Green + Blue). The same model-pack behavior applies to OFX and Adobe installers. The suite installer also exposes the Tauri GUI as an optional desktop component that points at the shared runtime root.
The modern installer treats selected model packs and the blue runtime DLL pack as immutable caches keyed by the manifest SHA256. When a selected pack file already matches the manifest, upgrades preserve it and skip the download or copy while still refreshing plugin binaries. When a selected pack file is missing or invalid, the installer replaces that file from the verified source. Packs that are not selected are removed from the install tree.
Producing local installer flavors:
# Online (small stub, downloads packs)
.\scripts\windows.ps1 -Task package-ofx -Track rtx -Flavor online \
-DisplayVersionLabel <label>
.\scripts\windows.ps1 -Task package-adobe -Track rtx -Flavor online \
-DisplayVersionLabel <label>
# Offline (self-contained)
.\scripts\windows.ps1 -Task package-ofx -Track rtx -Flavor offline \
-DisplayVersionLabel <label>The offline command is for local/private distribution only. Do not upload offline installers to GitHub releases.
When a modern flavor is selected, the wrapper stages and validates the OFX bundle, then produces only the chosen Inno Setup installer. The legacy NSIS installer is not emitted for modern local validation builds.
Pack source-of-truth lives in scripts/installer/distribution_manifest.json,
which records the Hugging Face URL, SHA256, and size of every shipped
artifact. The Inno Setup [Code] block uses Inno Setup 6.1+'s built-in
CreateDownloadPage API (no third-party plugin) which natively verifies
each download against the manifest's SHA256 and aborts on mismatch.
The supported repo-local runtime locations are only
vendor\onnxruntime-windows-rtx and vendor\onnxruntime-windows-dml.
- Prepare the curated RTX runtime when it is not already staged:
.\scripts\windows.ps1 -Task prepare-rtx
- Run the canonical Windows release flow:
.\scripts\windows.ps1 -Task release -Version X.Y.Z -Flavor online
- Only request experimental Windows tracks intentionally:
.\scripts\windows.ps1 -Task release -Version X.Y.Z -Flavor online -Track dml .\scripts\windows.ps1 -Task release -Version X.Y.Z -Flavor online -Track all
Scripts validate the runtime root. If -OrtRoot does not map to the expected
curated runtime track, packaging aborts.
For Windows RTX, package-ofx is not a model regeneration command. It is a
strict packaging command that expects a certified artifact set. The RTX
packaging flow now requires:
- the packaged
corridorkey_fp16_*.onnxand*_ctx.onnxfiles - a matching
artifact_manifest.jsonwritten from the certification report
If that manifest is absent or does not match the packaged RTX artifacts, packaging fails intentionally. This prevents the project from generating a new installer from stale or manually copied RTX models.
Every one of the workarounds below has produced a regression in production. They are listed here so contributors (human or AI) stop reinventing them.
- Do not call
scripts\build.ps1,scripts\prepare_windows_rtx_release.ps1, orscripts\release_pipeline_windows.ps1directly. They are internal delegates. Always go throughscripts\windows.ps1 -Task .... Direct calls skip version-metadata sync, track resolution, and validation that the wrapper applies. - Do not create git worktrees that shadow
vendor\. A worktree inherits a trackedvendor\with.gitkeepstubs, and runninggit worktree remove --forceon a worktree containing a Windows junction into the mainvendor\has, in practice, followed the junction and erased the real binaries. If a second working copy is needed, usegit worktree add -B <branch> <path>without touchingvendor\and stage the curated runtimes separately for that worktree. - Do not skip the quality gate on the release pipeline. Running
scripts\windows.ps1 -Task releasewith-SkipTestsforwarded through-ForwardArgumentsis a debug convenience only. Any build intended for a user — even an internal pre-release — must pass the quality gate. - Do not touch the render hot path without measuring. Any change
under
src/plugins/ofx/,src/core/inference_session.cpp,src/core/engine.cpp,src/core/gpu_prep.cpp,src/core/gpu_resize.cpp, orsrc/post_process/must be measured against thephase_8_gpu_preparebaseline recorded indocs/OPTIMIZATION_MEASUREMENTS.md. Usescripts/run_corpus.shthenscripts/compare_benchmarks.py; reject the change ifavg_latency_msorort_runregresses by more than 10%.
The display label plumbs a human-readable version string into every
user-visible surface on Windows. It flows through CMake into
include/corridorkey/version.hpp
(CORRIDORKEY_DISPLAY_VERSION_STRING), which the OFX panel, the
corridorkey --version CLI, and the runtime-server log filename
(host_plugin_runtime_server_v<label>.log) all read. The packaging scripts
also bake the label into the dist artifact names when present:
CorridorKey_v<label>_Windows_online_Setup.exe,
CorridorKey_OFX_v<label>_Windows_RTX\\.
The label is produced by these mechanisms, in priority order:
-DisplayVersionLabel <string>explicitly passed. Override for narrow cases (bespoke tester build, reproducing a historical label). The wrapper validates the label shape before build, and packaging validates that the staged CLI reports the same label throughcorridorkey --version.- Publication flow (
-Task release -PublishGithub). The pipeline computes the next canonical tagvX.Y.Z-win.Nand uses that, after enforcing the dirty-tree rule. - Default local build flow (every local
buildor unpublishedreleasewithout-DisplayVersionLabel). Anchored to the currentPROJECT_VERSION, then suffixed with Windows source identity fromgit describe --tags --dirty --match "v*-win.*"and a-bYYYYMMDDTHHMMSSfffZbuild reference. Before the first published prerelease of a newX.Y.Zcycle, local builds useX.Y.Z-win.0-...so they cannot look like the previous product version. - Local
package-ofxwithout-DisplayVersionLabel. Reuses the display label already embedded in the built CLI. Packaging an existing build must not mint a new label, because the installer filename must match the panel version already compiled into the payload.
The full derivation rules, dirty-tree rejection, and counter advancement
semantics are documented in section 1 "Pre-release labels". On Windows,
published prerelease labels must be of the form X.Y.Z-win.N; published
stable labels are the clean X.Y.Z form. Local labels are free to be the
longer project-version-plus-source form ending in
-bYYYYMMDDTHHMMSSfffZ, including win.0, -<count>-g<sha>, and
-dirty when present.
When a label override is used for a local installer, the binaries and the
installer must carry the same label. Build with that label first, then package
with that same label. package-ofx validates the staged bundle before it emits
an installer and fails when the installer label differs from the packaged CLI
label. This keeps the installer filename, OFX panel, CLI version output, and
runtime-server log filename aligned.
Use the following commands according to the state you have:
- You only need to build binaries:
.\scripts\windows.ps1 -Task build -Preset release
- You already have a certified RTX artifact set and only want the installers:
.\scripts\windows.ps1 -Task package-ofx -Version X.Y.Z -Track rtx
- You already have a local Windows RTX model set and need to certify it
before packaging:
.\scripts\windows.ps1 -Task certify-rtx-artifacts -Version X.Y.Z
- You need to regenerate and certify the RTX ladder from the checkpoint:
.\scripts\windows.ps1 -Task regen-rtx-release -Version X.Y.Z
Windows build and release artifacts may be packaged with a partial model set when some packaged artifacts are intentionally absent or temporarily unavailable.
- Missing packaged models do not block bundle or installer generation by themselves.
- Packaging must emit explicit inventory and validation reports for every generated Windows distribution artifact.
- OFX bundles must include
model_inventory.json. - Windows OFX release folders must include
bundle_validation.json. - Missing packaged models must remain explicit in generated reports and must surface as normal runtime or plugin errors when the missing quality is requested.
- Invalid packaged models that are present still fail validation. Partial model coverage is allowed; silently shipping broken artifacts is not.
Windows RTX now ships as a single installer that replaces the same OFX bundle path during installation.
Windows RTXpackages the public green FP16 ONNX ladder through2048pxand the single dynamic blue TorchScript artifact. INT8 ONNX and CPU rendering have been retired from the official Windows RTX installer.Autocontinues to respect the safe quality ceiling of the active GPU tier.- Manual fixed quality may attempt a higher packaged rung directly and then follow the established runtime failure path if that quality cannot execute.
The Windows RTX installer must pass packaged doctor validation before it is
considered releasable.
macOS has one curated runtime root and one canonical release entrypoint:
vendor/onnxruntime/— vendored Apple Silicon ONNX Runtime dylibscripts/release_pipeline_macos.sh— canonical macOS build, package, and publish entrypoint
The canonical macOS release command is:
scripts/release_pipeline_macos.sh --display-label X.Y.Z-mac.NPassing --display-label bakes the label into version.hpp
(CORRIDORKEY_DISPLAY_VERSION_STRING), the CLI --version output, the
OFX panel, the runtime-server log filename, and the DMG filename
(CorridorKey_Resolve_vX.Y.Z-mac.N_macOS_AppleSilicon.dmg). The label
must match X.Y.Z-mac.N and its X.Y.Z core must equal
CMakeLists.txt PROJECT_VERSION; the pipeline refuses to proceed
otherwise.
Other flags supported by the wrapper:
--skip-tests— debug convenience; any build intended for a user must pass the quality gate, same rule as Windows.--clean-only— sanitizebuild/release-macos-portable,build/debug-macos-portable, anddist/then exit.--publish-github— after the build, package, and validation gates pass, invokescripts/publish_github_release.shwith the produced DMG. Requires--display-label. Looks for release notes atbuild/release_notes/v<label>.mdby default, or at--notes-file PATHwhen provided.--github-repo OWNER/REPO— override the publish target.
Linux is the experimental track. It has one canonical wrapper:
scripts/linux.sh --task release --version X.Y.Z [--display-label X.Y.Z-linux.N]
The --display-label and --publish-github flags follow the same
contract as macOS: label shape is X.Y.Z-linux.N, core must match
--version, and publishing reuses
scripts/publish_github_release.sh with a notes file at
build/release_notes/v<label>.md. Linux emits two installer assets per
release (.deb and .rpm); both go up under the same tag.
scripts/publish_github_release.sh is the single bash helper that both
the macOS and Linux pipelines hand off to for GitHub publication. It
enforces, in this order, the same rules that
Publish-CorridorKeyGithubRelease enforces on Windows:
--display-labelmust parse asX.Y.Z-<platform>.Nand its core must match--version. NakedX.Y.Ztags are treated as stable and mapped to--latest; labels with a suffix are mapped to--prerelease.- Working tree must be clean:
git diff,git diff --cached, andgit ls-files --others --exclude-standardmust all be empty. The helper refuses to publish from a dirty checkout because the label baked into the artifact would otherwise be unreproducible from Git. - Release notes file must exist, be non-empty, and contain all four
sections:
## Overview,## Changelog,## Assets & Downloads,## Installation Instructions. Any missing section aborts the publish with a pointer to section 5 of this document. - The target tag
v<label>must not already exist on the remote. Tag immutability is absolute (section 1, "Tag and release immutability"). - Every declared
--assetmust exist on disk. - Title is constructed from the platform:
... (Windows),... (macOS) - Apple Silicon, or... (Linux). The prerelease state is carried by the--prereleaseflag, not by the title string.
--dry-run prints the exact gh release create command the helper
would run without invoking it. Use it as a final sanity check before
letting the real publish fire.
Release names, GitHub release text, installer labels, and download guidance must match the support matrix. A packaged track may exist without being an officially supported hardware family.
- The Windows
RTXartifact is the supported Windows track for NVIDIA RTX 30 series and newer. - The canonical public Windows release-track flow produces the Windows RTX online package unless another track is requested explicitly.
- The Windows
DirectMLartifact is an experimental Windows track. It must not be published by default or described as official support for all AMD, Intel, or RTX 20 series hardware. - Apple Silicon is the official macOS track.
- The
Linux RTXartifacts (.tar.gz,.deb,.rpm) are experimental. Release copy must state the Experimental designation and must not imply parity with the Windows RTX track. All three Linux artifacts share the same validated bundle and are part of the same experimental track; they differ only as distribution wrappers. - Do not turn a backend name into a broad hardware promise. When in doubt,
point users to
help/SUPPORT_MATRIX.md.
GitHub release titles must stay consistent so users can identify the platform
and artifact type quickly. Release notes are mandatory and follow the
template below. Every canonical pipeline
(scripts\release_pipeline_windows.ps1 on Windows,
scripts/release_pipeline_macos.sh on macOS, scripts/linux.sh on
Linux) refuses to publish a release without a notes file containing
the required sections, so there is no path to shipping a placeholder
like "Auto-published by ...".
Before publishing, write the notes to build/release_notes/v<tag>.md
(for example build/release_notes/v0.8.1-win.1.md or
build/release_notes/v0.8.1-mac.1.md). When the publish flag is
passed through the platform wrapper, the pipeline picks that file up
automatically if it exists at the convention path; otherwise point to
it explicitly:
- Windows:
scripts\windows.ps1 -Task release -Version X.Y.Z -Flavor online -ForwardArguments '-PublishGithub','-NotesFile','<path>' - macOS:
scripts/release_pipeline_macos.sh --display-label X.Y.Z-mac.N --publish-github --notes-file <path> - Linux:
scripts/linux.sh --task release --version X.Y.Z --display-label X.Y.Z-linux.N --publish-github --notes-file <path>
This release track ships the OFX plugin used by DaVinci Resolve and
Foundry Nuke. Standalone OFX packages may include a colocated corridorkey
CLI for host-plugin support, but the suite installer owns the fixed
runtime/CLI core. The Tauri GUI is shipped either as an optional suite
component or in the portable Runtime/GUI bundle.
The host-coverage qualifier [Nuke & Resolve] precedes the platform
qualifier on every OFX release title, regardless of platform combination.
This makes the host coverage explicit at a glance and matches the
host-agnostic artifact name (CorridorKey_OFX_*). The single space
between the closing bracket and the opening parenthesis is intentional:
without it, Markdown renderers (and the
scripts/check_docs_consistency.py linter) would interpret the title
as an inline link and treat the platform name as a target path, turning
every example into a broken local link.
- Windows only:
CorridorKey OFX vX.Y.Z [Nuke & Resolve] (Windows) - macOS only:
CorridorKey OFX vX.Y.Z [Nuke & Resolve] (macOS) - Apple Silicon - Linux only:
CorridorKey OFX vX.Y.Z [Nuke & Resolve] (Linux) - Windows and macOS:
CorridorKey OFX vX.Y.Z [Nuke & Resolve] (Windows & macOS) - Windows and Linux:
CorridorKey OFX vX.Y.Z [Nuke & Resolve] (Windows & Linux) - Windows, macOS, and Linux:
CorridorKey OFX vX.Y.Z [Nuke & Resolve] (Windows, macOS & Linux)
This release track ships the Tauri-based desktop GUI defined in
src/gui. The historical name "Runtime" is preserved on the release
title and on the portable Windows asset filename
(CorridorKey_Runtime_v<label>_<Platform>_<Track>.zip). The product
surface is the GUI plus the local runtime package; suite installs may
instead install the GUI as an optional component that points at the shared
runtime root.
- Windows only:
CorridorKey Runtime vX.Y.Z (Windows) - macOS only:
CorridorKey Runtime vX.Y.Z (macOS) - Linux only:
CorridorKey Runtime vX.Y.Z (Linux) - Windows and macOS:
CorridorKey Runtime vX.Y.Z (Windows & macOS) - Windows, macOS, and Linux:
CorridorKey Runtime vX.Y.Z (Windows, macOS & Linux)
Use the following release description template:
## Overview
[A concise 1-2 sentence description of what this release introduces.]
## Changelog
### Added
- [Feature A]
- [Feature B]
### Changed
- [Modification A]
### Fixed
- [Bugfix A]
## Assets & Downloads
### Windows
- **NVIDIA RTX 30 Series or newer:** Download `CorridorKey_v<label>_Windows_online_Setup.exe`.
- Include the Windows DirectML track only when the release intentionally contains `CorridorKey_OFX_vX.Y.Z_Windows_DirectML_Install.exe`.
- Do not describe the DirectML installer as official support for every AMD, Intel, or RTX 20 series GPU family. Refer readers to `help/SUPPORT_MATRIX.md` for the real support designation.
### macOS
- Include this section only when the release contains a macOS installer.
- **Apple Silicon (M-Series):** Download `CorridorKey_OFX_vX.Y.Z_macOS_AppleSilicon.dmg`.
### Linux
- Include this section only when the release contains a Linux artifact.
- **Ubuntu 22.04 / 24.04 LTS (experimental):** Download `CorridorKey_OFX_vX.Y.Z_Linux_RTX.deb`.
- **Rocky Linux / RHEL 9 (experimental):** Download `CorridorKey_OFX_vX.Y.Z_Linux_RTX.rpm`.
- Do not describe the Linux artifacts as official support. Refer readers to `help/SUPPORT_MATRIX.md` for the real support designation. A proprietary NVIDIA driver 555 or newer is required; the CUDA Toolkit is not required.
## Installation Instructions
1. Close DaVinci Resolve if it is running.
2. Run the downloaded installer.
3. The installer automatically overwrites the previous version.
4. Launch DaVinci Resolve and load the plugin from the OpenFX Library.
## Uninstallation
To remove the plugin, go to **Windows Settings > Apps > Installed apps**, search
for "CorridorKey Resolve OFX", and click Uninstall.
## Known Issues
- [List any currently tracked critical issues the user might face.]
- [If there are no known issues, omit this section entirely.]