apply resolves a GitHub App unconditionally — a databases-only manifest cannot apply without one #103
Labels
No labels
blocked
blocker:ci-red
blocker:conflict
blocker:drill-pending
blocker:unrequested
bug
claimed
documentation
enhancement
epic
merge-next
needs-triage
ready
release
scope:apply
scope:capture
scope:coolify-api
scope:fleet
scope:manifest
scope:secrets
stale
state:addressing
state:bots-reviewing
state:building
state:needs-human
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: heavy-duty/cast#103
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Found by the 2026-07-19 release drill (two live Coolify 4.1.2 instances).
What happened
A manifest declaring only databases (
applications: {}) against a fresh instance:The plan renders, then preflight dies.
src/cli.ts:1277-1280resolves the server and the GitHub App before building the executor:githubAppNameForthrows when the repo has nogithub_appsbinding — regardless of whether the manifest declares any applications. A GitHub App only matters forPOST /applications/private-github-app; databases and services never touch it.In the drill this blocked the entire A→B promotion until we seeded a placeholder
GithubApprow on both instances and bound a name that is never used — pure ceremony.Why it matters
Infra-only projects (a project that carries the databases/services other projects share) are a real shape, and the first
cast applya new adopter runs is very likely databases-first. Requiring a registered GitHub App — which today involves the browser-manifest registration flow — to create a Redis is a hard onboarding wall.Suggested fix
Resolve the GitHub App lazily: only when
desiredcontains at least one application (mirroring hows3DestinationUuidis already optional). The refusal for application-bearing manifests stays exactly as is.Related observation from the same run:
manifest.yamlrequiresapplications:to be present per environment (empty{}accepted) — if that stays required, the error for an omitted block might point atapplications: {}as the empty form.🤖 Filed from the release-drill session.