Skip to content

Release verification gate

Broad Composer tests and preflights take a shared lease on the host release verification gate. Full release verification takes its exclusive lease. An ordinary broad command started during a release prints a waiting message and runs after the release finishes; the lease remains held while its command runs. A release child can proceed only with the current live owner’s token.

Use the checkout’s own ./capell Composer and test entrypoints for Docker verification. Its Python 3 bridge holds the host lease for the Compose invocation and disables the duplicate container lease for that command. A container temporary directory cannot see the host’s gate. Calling Composer directly inside a container coordinates only that container’s filesystem and does not provide host-wide exclusion. The bridge fails before dispatch if Python 3 or its lock file is unavailable.

Focused single-file wrapper tests and direct native single-file Pest runs remain unaffected. Named PHP stage locks also keep their existing behaviour. To make an explicit diagnostic exception for a broad command, set CAPELL_NO_RELEASE_LOCK=1 for that invocation. CAPELL_NO_LOCK=1 bypasses named stage locks but does not bypass the release gate. The App pre-merge runner’s --ignore-release-lock option applies the same explicit exception to its children.

The default gate is capell-release-verification.lock in the host temporary directory. CAPELL_RELEASE_VERIFICATION_LOCK_PATH selects an absolute path; use the same path in the verifier and its ordinary command invocations. Do not delete a live gate file: replacing its inode would defeat exclusion. Owner tokens and lock paths describe scheduling and do not change immutable lane evidence keys.