Choose the prerelease identity and download coordinates #30

Closed
opened 2026-10-16 09:16:42 +00:00 by phg · 1 comment
Owner

Parent: Plan the signed IODD Tool prerelease
Type: grilling
Mode: HITL
Blocked by: Verify standard Homebrew lifecycle compatibility, Establish mise-driven local prerelease mechanics

Question

Which concrete version/build identity, bundle/component identities, Forgejo prerelease tag and asset coordinates, tap repository and fully qualified cask token will govern the first signed evaluation prerelease?

Use the mechanics research and check existing bundle/worker trust identities before proposing changes. The development build's hardcoded version is evidence, not an accepted release choice. Keep IODD Tool branding, one immutable final DMG shared by direct download and Homebrew, explicit Git-URL tap setup, and the agreed arm64/macOS restrictions. Clarify the limited-evaluation/prerelease presentation and how users obtain the exact intended cask without inventing stable-release promotion policy.

Resolve through live discussion with phg. Record concrete identifiers/coordinates and any compatibility consequences, or explicit prerequisites for choosing them. Do not create a tap/release, change bundle identifiers or publish assets in this ticket.

Parent: [Plan the signed IODD Tool prerelease](https://git.s1q.dev/phg/iodd-tool/issues/27) Type: grilling Mode: HITL Blocked by: [Verify standard Homebrew lifecycle compatibility](https://git.s1q.dev/phg/iodd-tool/issues/28), [Establish mise-driven local prerelease mechanics](https://git.s1q.dev/phg/iodd-tool/issues/29) ## Question Which concrete version/build identity, bundle/component identities, Forgejo prerelease tag and asset coordinates, tap repository and fully qualified cask token will govern the first signed evaluation prerelease? Use the mechanics research and check existing bundle/worker trust identities before proposing changes. The development build's hardcoded version is evidence, not an accepted release choice. Keep IODD Tool branding, one immutable final DMG shared by direct download and Homebrew, explicit Git-URL tap setup, and the agreed arm64/macOS restrictions. Clarify the limited-evaluation/prerelease presentation and how users obtain the exact intended cask without inventing stable-release promotion policy. Resolve through live discussion with phg. Record concrete identifiers/coordinates and any compatibility consequences, or explicit prerequisites for choosing them. Do not create a tap/release, change bundle identifiers or publish assets in this ticket.
phg self-assigned this 2026-10-16 09:50:28 +00:00
Author
Owner

Resolution — first evaluation prerelease identity and public coordinates

Resolved through live discussion with phg on 16 October 2026. phg selected the version, public access, exact release coordinates, preserved product identity, fixed published bytes, tap coordinates, numeric bundle/build values and DMG signing identifier below. This is the planning answer for Choose the prerelease identity and download coordinates, under Plan the signed IODD Tool prerelease.

Release identity and presentation

  • Full release version: 0.1.0-beta.1.
  • Forgejo tag: v0.1.0-beta.1.
  • Release title: IODD Tool 0.1.0-beta.1 — Evaluation prerelease; set Forgejo's prerelease flag.
  • Application bundle: IODD Tool.app, retaining IODD Tool branding.
  • App CFBundleShortVersionString: 0.1.0.
  • App CFBundleVersion: 2.
  • The full 0.1.0-beta.1 label belongs in prerelease presentation; numeric bundle fields must not obscure its beta status. Use separate display metadata for full prerelease presentation rather than inserting the beta suffix into Apple's numeric version fields. The existing app inherits the default About UI, so showing the full beta identity there needs an explicit display-metadata integration in the implementation handoff.
  • “Limited evaluation” describes release maturity and intended use, not an invitation-only access restriction. Downloads and the tap are public. Release notes and installation guidance must describe this as an evaluation prerelease.
  • Preserve the accepted arm64 / macOS 15 minimum and every qualification, signing, notarization, stapling, final-download Gatekeeper and lifecycle gate. Prerelease wording waives none of them.

Build-number prerequisite: build 2 is the selected first-public-prerelease value, deliberately distinct from the development script's build 1. Before signing, inventory previously distributed builds and confirm that 2 exceeds them. If a previously distributed build is 2 or higher, stop and return for a revised build-number decision; do not silently pick another value. Empty hosted release/tag lists do not establish that no development build was ever distributed. The tag's source commit and actual release-candidate freeze remain with Set the qualification freeze and evidence handoff.

Bundle and signing identities

Preserve this identity family:

  • App bundle/signing identifier: dev.s1q.iodd-tool; app executable IODDTool.
  • Ordinary worker signing identifier: dev.s1q.iodd-tool.worker; bundled executable Contents/Helpers/IODDWorker.
  • Lifecycle signing identifier: dev.s1q.iodd-tool.lifecycle; bundled executable Contents/Helpers/IODDLifecycle.
  • DMG signing identifier: dev.s1q.iodd-tool.dmg.

Keep the accepted Developer ID signed-peer checks and common publisher-team relationship. Concrete signing identity/Team ID references and the private credential handoff belong to Define the mise release stages and signing handoff; no new Team ID, credential or trust bypass is selected here. There is one application installation identity for this effort, without a separately installable beta channel or a beta-suffixed bundle name.

Preserving these identifiers matters beyond branding: the inspected code uses exact app/worker/lifecycle signing identifiers, exact app identity for recovery-export ancestor protection, a shared lifecycle namespace and the exact cask token. Merely adding a beta bundle suffix would not isolate those namespaces. The inspected signature requirements do not pin a release version or binary hash; preserving the identity family does not by itself establish IPC compatibility or qualify an upgrade/downgrade route.

Public release and final DMG

  • Release repository: phg/iodd-tool.
  • Asset filename: iodd-tool-0.1.0-beta.1-arm64.dmg.
  • Exact planned download URL: https://git.s1q.dev/phg/iodd-tool/releases/download/v0.1.0-beta.1/iodd-tool-0.1.0-beta.1-arm64.dmg.

After phg reported making the repository public, an unauthenticated read of the repository API succeeded and returned private: false on 16 October 2026. No agent visibility change was performed. This verifies current repository access, not an asset that has yet to be published.

Direct download and Homebrew must use one identical final Developer ID signed, notarized and stapled DMG. Compute and record SHA-256 only after the final byte-changing operation; the cask must use that exact URL and digest, with independent downloaded-byte verification at the accepted gate.

Once published, the release tag/source target and DMG asset are fixed. Do not replace the asset in place or move the tag to another candidate. Any changed distributed DMG requires a new prerelease version and new coordinates. Forgejo permits release/asset edits, so the release procedure must enforce this policy and reconcile existing remote state rather than treating a versioned URL as an immutability guarantee. Unpublished candidate preparation, stage receipts and retry mechanics remain with the mise/freeze handoff decisions.

Homebrew coordinates and obtaining the intended cask

  • Planned public tap repository/Git URL: https://git.s1q.dev/phg/homebrew-tap.git.
  • Tap name: phg/tap.
  • Cask token: iodd-tool.
  • Fully qualified cask: phg/tap/iodd-tool.
  • First published cask recipe version: 0.1.0-beta.1, pointing at the exact final DMG URL and SHA-256 above. Do not use version :latest or sha256 :no_check.

The intended setup and install command forms are:

brew tap phg/tap https://git.s1q.dev/phg/homebrew-tap.git
brew info --cask phg/tap/iodd-tool
brew install --cask phg/tap/iodd-tool

The explicit Git URL is required for this Forgejo tap; a one-argument tap command assumes GitHub. Installation guidance must show the fully qualified token and the intended 0.1.0-beta.1 recipe. Subsequent documented upgrade/reinstall/uninstall/zap commands must likewise use phg/tap/iodd-tool. A fully qualified name selects the tap's recipe; it does not freeze that recipe's version forever. Record the actual published tap commit with release evidence once it exists.

No iodd-tool@beta token is selected: it conflicts with the inspected exact-token-root policy. Creation of the chosen tap, write access and verification that its Git endpoint is anonymously cloneable remain execution prerequisites; the read-only name check found no accessible existing repository, which is not a guarantee of creation authority.

These are naming and download decisions. The standard-cask lifecycle route remains unresolved with Agree the manual and Homebrew lifecycle handoff, following Verify standard Homebrew lifecycle compatibility. These command forms do not establish that a published or qualified cask already exists.

Evidence and implementation handoff

The development version was inspected as evidence and was not adopted implicitly. Read-only source observations used local Git objects:

  • Historical main: b8334e758a8fb11d61b7af8d3ed6f0f632a4216b.
  • Inspected integration: 381442f79cd5736fceaffa15d5f1edacb1ca8842.
  • Inspected lifecycle: 44b4247d83811ce4232b1f04f65021adf590116d.

At these snapshots scripts/build-app.sh:17–23 contains app naming/identity and hardcoded development 0.1.0 / 1. At the lifecycle snapshot, Sources/IODDCore/NativeCodeSigning.swift:6–18, NativeWorker.swift:79–127,348–362 and NativeAppLifecycleIO.swift:14–20 show the exact signing-identifier/common-team checks. NativeRecoveryExportDestination.swift:52–58 protects app ancestors by bundle identifier, and NativeCaskRootPolicy.swift:29–30,94–95 requires token iodd-tool.

The same lifecycle snapshot expects the signed lifecycle helper but does not yet declare/package its executable product (Package.swift:7–13, scripts/build-app.sh:6–12). This is a commit-specific implementation prerequisite, not a claim about every live branch. The eventual integrated candidate must contain and correctly sign all three components. Sources/IODDTool/App.swift:121–144 has no custom About/version presentation at the inspected integration and lifecycle snapshots. These observations select no candidate and supply no runtime qualification.

Primary references: Apple marketing-version field, Apple build-version field, Apple About application-version display, Homebrew custom-URL tap setup. Release mechanics and final-byte limitations are retained in Establish mise-driven local prerelease mechanics.

Only this decision ticket is resolved. No app/source changes, build, signing, notarization, tap/release creation or asset publication occurred. Existing lifecycle, mise and qualification handoff tickets already own the remaining questions; this decision introduces no additional fog or child ticket. Ordinary stable-release promotion policy remains outside this map.

## Resolution — first evaluation prerelease identity and public coordinates Resolved through live discussion with phg on 16 October 2026. phg selected the version, public access, exact release coordinates, preserved product identity, fixed published bytes, tap coordinates, numeric bundle/build values and DMG signing identifier below. This is the planning answer for [Choose the prerelease identity and download coordinates](https://git.s1q.dev/phg/iodd-tool/issues/30), under [Plan the signed IODD Tool prerelease](https://git.s1q.dev/phg/iodd-tool/issues/27). ### Release identity and presentation - Full release version: **`0.1.0-beta.1`**. - Forgejo tag: **`v0.1.0-beta.1`**. - Release title: **`IODD Tool 0.1.0-beta.1 — Evaluation prerelease`**; set Forgejo's prerelease flag. - Application bundle: **`IODD Tool.app`**, retaining IODD Tool branding. - App `CFBundleShortVersionString`: **`0.1.0`**. - App `CFBundleVersion`: **`2`**. - The full `0.1.0-beta.1` label belongs in prerelease presentation; numeric bundle fields must not obscure its beta status. Use separate display metadata for full prerelease presentation rather than inserting the beta suffix into Apple's numeric version fields. The existing app inherits the default About UI, so showing the full beta identity there needs an explicit display-metadata integration in the implementation handoff. - “Limited evaluation” describes release maturity and intended use, not an invitation-only access restriction. Downloads and the tap are public. Release notes and installation guidance must describe this as an evaluation prerelease. - Preserve the accepted **arm64 / macOS 15 minimum** and every qualification, signing, notarization, stapling, final-download Gatekeeper and lifecycle gate. Prerelease wording waives none of them. **Build-number prerequisite:** build 2 is the selected first-public-prerelease value, deliberately distinct from the development script's build 1. Before signing, inventory previously distributed builds and confirm that 2 exceeds them. If a previously distributed build is 2 or higher, stop and return for a revised build-number decision; do not silently pick another value. Empty hosted release/tag lists do not establish that no development build was ever distributed. The tag's source commit and actual release-candidate freeze remain with [Set the qualification freeze and evidence handoff](https://git.s1q.dev/phg/iodd-tool/issues/33). ### Bundle and signing identities Preserve this identity family: - App bundle/signing identifier: **`dev.s1q.iodd-tool`**; app executable `IODDTool`. - Ordinary worker signing identifier: **`dev.s1q.iodd-tool.worker`**; bundled executable `Contents/Helpers/IODDWorker`. - Lifecycle signing identifier: **`dev.s1q.iodd-tool.lifecycle`**; bundled executable `Contents/Helpers/IODDLifecycle`. - DMG signing identifier: **`dev.s1q.iodd-tool.dmg`**. Keep the accepted Developer ID signed-peer checks and common publisher-team relationship. Concrete signing identity/Team ID references and the private credential handoff belong to [Define the mise release stages and signing handoff](https://git.s1q.dev/phg/iodd-tool/issues/32); no new Team ID, credential or trust bypass is selected here. There is one application installation identity for this effort, without a separately installable beta channel or a beta-suffixed bundle name. Preserving these identifiers matters beyond branding: the inspected code uses exact app/worker/lifecycle signing identifiers, exact app identity for recovery-export ancestor protection, a shared lifecycle namespace and the exact cask token. Merely adding a beta bundle suffix would not isolate those namespaces. The inspected signature requirements do not pin a release version or binary hash; preserving the identity family does not by itself establish IPC compatibility or qualify an upgrade/downgrade route. ### Public release and final DMG - Release repository: **[phg/iodd-tool](https://git.s1q.dev/phg/iodd-tool)**. - Asset filename: **`iodd-tool-0.1.0-beta.1-arm64.dmg`**. - Exact planned download URL: **`https://git.s1q.dev/phg/iodd-tool/releases/download/v0.1.0-beta.1/iodd-tool-0.1.0-beta.1-arm64.dmg`**. After phg reported making the repository public, an unauthenticated read of [the repository API](https://git.s1q.dev/api/v1/repos/phg/iodd-tool) succeeded and returned `private: false` on 16 October 2026. No agent visibility change was performed. This verifies current repository access, not an asset that has yet to be published. Direct download and Homebrew must use **one identical final Developer ID signed, notarized and stapled DMG**. Compute and record SHA-256 only after the final byte-changing operation; the cask must use that exact URL and digest, with independent downloaded-byte verification at the accepted gate. Once published, the release tag/source target and DMG asset are fixed. Do not replace the asset in place or move the tag to another candidate. Any changed distributed DMG requires a new prerelease version and new coordinates. Forgejo permits release/asset edits, so the release procedure must enforce this policy and reconcile existing remote state rather than treating a versioned URL as an immutability guarantee. Unpublished candidate preparation, stage receipts and retry mechanics remain with the mise/freeze handoff decisions. ### Homebrew coordinates and obtaining the intended cask - Planned public tap repository/Git URL: **`https://git.s1q.dev/phg/homebrew-tap.git`**. - Tap name: **`phg/tap`**. - Cask token: **`iodd-tool`**. - Fully qualified cask: **`phg/tap/iodd-tool`**. - First published cask recipe version: **`0.1.0-beta.1`**, pointing at the exact final DMG URL and SHA-256 above. Do not use `version :latest` or `sha256 :no_check`. The intended setup and install command forms are: ```sh brew tap phg/tap https://git.s1q.dev/phg/homebrew-tap.git brew info --cask phg/tap/iodd-tool brew install --cask phg/tap/iodd-tool ``` The explicit Git URL is required for this Forgejo tap; a one-argument tap command assumes GitHub. Installation guidance must show the fully qualified token and the intended `0.1.0-beta.1` recipe. Subsequent documented upgrade/reinstall/uninstall/zap commands must likewise use `phg/tap/iodd-tool`. A fully qualified name selects the tap's recipe; it does not freeze that recipe's version forever. Record the actual published tap commit with release evidence once it exists. No `iodd-tool@beta` token is selected: it conflicts with the inspected exact-token-root policy. Creation of the chosen tap, write access and verification that its Git endpoint is anonymously cloneable remain execution prerequisites; the read-only name check found no accessible existing repository, which is not a guarantee of creation authority. These are naming and download decisions. The standard-cask lifecycle route remains unresolved with [Agree the manual and Homebrew lifecycle handoff](https://git.s1q.dev/phg/iodd-tool/issues/31), following [Verify standard Homebrew lifecycle compatibility](https://git.s1q.dev/phg/iodd-tool/issues/28). These command forms do not establish that a published or qualified cask already exists. ### Evidence and implementation handoff The development version was inspected as evidence and was not adopted implicitly. Read-only source observations used local Git objects: - Historical main: `b8334e758a8fb11d61b7af8d3ed6f0f632a4216b`. - Inspected integration: `381442f79cd5736fceaffa15d5f1edacb1ca8842`. - Inspected lifecycle: `44b4247d83811ce4232b1f04f65021adf590116d`. At these snapshots `scripts/build-app.sh:17–23` contains app naming/identity and hardcoded development `0.1.0` / `1`. At the lifecycle snapshot, `Sources/IODDCore/NativeCodeSigning.swift:6–18`, `NativeWorker.swift:79–127,348–362` and `NativeAppLifecycleIO.swift:14–20` show the exact signing-identifier/common-team checks. `NativeRecoveryExportDestination.swift:52–58` protects app ancestors by bundle identifier, and `NativeCaskRootPolicy.swift:29–30,94–95` requires token `iodd-tool`. The same lifecycle snapshot expects the signed lifecycle helper but does not yet declare/package its executable product (`Package.swift:7–13`, `scripts/build-app.sh:6–12`). This is a commit-specific implementation prerequisite, not a claim about every live branch. The eventual integrated candidate must contain and correctly sign all three components. `Sources/IODDTool/App.swift:121–144` has no custom About/version presentation at the inspected integration and lifecycle snapshots. These observations select no candidate and supply no runtime qualification. Primary references: [Apple marketing-version field](https://developer.apple.com/documentation/bundleresources/information-property-list/cfbundleshortversionstring), [Apple build-version field](https://developer.apple.com/documentation/bundleresources/information-property-list/cfbundleversion), [Apple About application-version display](https://developer.apple.com/documentation/appkit/nsapplication/aboutpaneloptionkey/applicationversion), [Homebrew custom-URL tap setup](https://docs.brew.sh/Taps.html). Release mechanics and final-byte limitations are retained in [Establish mise-driven local prerelease mechanics](https://git.s1q.dev/phg/iodd-tool/issues/29). Only this decision ticket is resolved. No app/source changes, build, signing, notarization, tap/release creation or asset publication occurred. Existing lifecycle, mise and qualification handoff tickets already own the remaining questions; this decision introduces no additional fog or child ticket. Ordinary stable-release promotion policy remains outside this map.
phg closed this issue 2026-10-16 09:59:11 +00:00
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
phg/iodd-tool#30
No description provided.