Skip to content

Release: Fallout.Cli first-publish 403 — package not owned by org on nuget.org #208

Description

@ChrisonSimtian

Symptom

After the Fallout.GlobalTool → Fallout.Cli rename (#206) merged, the release.yml run for that commit (26483553336) failed at the publish step:

error: Response status code does not indicate success: 403
(The specified API key is invalid, has expired, or does not have permission
to access the specified package.).

Specifically on the push of Fallout.Cli.10.3.41.nupkg. Other Fallout.* package pushes in the same run did not fail (they're idempotent via --skip-duplicate, but they also have the right ownership).

Root cause

The first manual web upload of Fallout.Cli.10.3.39-g7885ec5647.nupkg (done pre-merge to satisfy the prefix-reservation gotcha) landed on nuget.org under the personal account, not the org that owns the API key used by release.yml. Result: package ID is reserved, but the org doesn't have push permission for it, so the CI key 403s on subsequent pushes.

This is a known operational footgun of nuget.org's manual-upload flow: the "Package owner" field defaults to the uploading user's profile, not whichever org their API key belongs to. There's no UI prompt to switch ownership at upload time — it requires a follow-up transfer.

Mitigation in progress

nuget.org support has been contacted to transfer ownership of Fallout.Cli to the org.

What to do once support transfers ownership

  1. gh run rerun <release-run-id> --failed on the latest release.yml run for main, OR push any non-docs commit to main to retrigger.
  2. --skip-duplicate means previously-published Fallout.*.10.3.41.nupkgs won't re-push or error; only the missing Fallout.Cli.10.3.41.nupkg push gets retried.
  3. Verify Fallout.Cli appears on nuget.org under the org's account with 10.3.41 listed.

Lesson for next time

When manually web-uploading the FIRST version of a new Fallout.* package (the prefix-reservation gotcha workflow):

  • After upload, explicitly transfer ownership to the org via Manage Package → Owners → Add owner → <org name> (then optionally remove personal account).
  • OR: upload using credentials of the org's service account directly (avoids the transfer step but requires having such credentials handy).
  • Verify on the package page that the listed owner is the org before the next CI push attempt.

Worth adding a one-liner to the existing prefix-gotcha note in docs/dependencies.md or wherever the gotcha is documented.

Refs

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions