clone

an offline map explorer where each world, from a game map to a city's open data, ships as one .atlas file

feat/atlas-next-horizon
atlas / docs / releasing.md
releasing.md 3.0K rendered
1# Native releases23Atlas publishes five portable CLI archives and one desktop package per OS.4The desktop packages own `.atlas` consistently:56| OS | Package | Native registration |7|---|---|---|8| macOS | `Atlas-<version>-darwin-arm64.zip` | exported UTI `dev.felinestatemachine.atlas.volume` |9| Linux | `Atlas-<version>-linux-amd64.deb` | shared MIME `application/vnd.felinestatemachine.atlas` |10| Windows | `Atlas-<version>-windows-amd64-setup.exe` | `Atlas.Volume` per-user file association |1112The metadata lives in `packaging/`; release scripts consume those files rather13than reproducing them in workflow YAML. `make release-packaging` parses and14checks that contract locally.1516## Signing inputs1718Unsigned workflow-dispatch builds exercise the same package recipes. A tagged19release becomes signed when the corresponding GitHub Actions secrets exist:2021| Secret | Purpose |22|---|---|23| `MACOS_CERTIFICATE_P12_BASE64` | base64 Developer ID Application certificate |24| `MACOS_CERTIFICATE_PASSWORD` | certificate password |25| `MACOS_SIGNING_IDENTITY` | exact `codesign` identity |26| `MACOS_NOTARY_KEY_BASE64` | base64 App Store Connect `.p8` key |27| `MACOS_NOTARY_KEY_ID` | App Store Connect key ID |28| `MACOS_NOTARY_ISSUER_ID` | App Store Connect issuer UUID |29| `WINDOWS_CERTIFICATE_BASE64` | base64 Authenticode `.pfx` |30| `WINDOWS_CERTIFICATE_PASSWORD` | certificate password |3132macOS signing uses hardened runtime and timestamping, submits with33`notarytool`, staples the accepted ticket, and recreates the final ZIP. Windows34signs and verifies both `Atlas.exe` and the installer with SHA-256 and a public35timestamp service. No key material is written to the repository or uploaded as36an artifact. A workflow-dispatch macOS preview has no Developer ID identity,37but the completed bundle is ad-hoc signed after its `Info.plist` is installed so38its bundle seal is structurally valid. It is never described as notarized.3940Every desktop matrix job consumes its produced package rather than trusting41archive creation. macOS unpacks and verifies the app seal and UTI, Linux42installs the `.deb` and verifies MIME registration, and Windows installs the43Inno package and reads the per-user ProgID/open command. Each packaged44executable is then launched with a freshly built Sample Region Atlas and must45install the exact bytes into an isolated library.4647## Publication transaction4849Tag publication is deliberately one-way:50511. required unit, compatibility-corpus, browser, and packaging gates pass;522. all platform jobs produce the exact eight allowed assets;533. packaged smoke builds Sample Region online and cache-only, requires54 byte-identical `.atlas` output, and reads the result through `measure`;554. `SHA256SUMS` is generated and verified over the allowlist;565. all nine files upload to a draft release;576. remote names must exactly equal local names and every GitHub asset digest58 must equal its local SHA-256 before the draft becomes public.5960An upload or comparison failure leaves a non-public draft for diagnosis; a61partial public release is never produced.