blob: de76baf58270967d8863a5b549b98d86b8d05457 [file] [view]
<!--
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied. See the License for the
specific language governing permissions and limitations
under the License.
-->
# Product release checklist
The IPMC-approved source archive on ASF distribution infrastructure is the Apache release. The
`Release` workflow is Maka's convenience-artifact distribution entry point. Desktop and CLI/TUI are
built from the exact IPMC-approved ASF source candidate commit. They share that source commit, the
root product version, one convenience tag, one GitHub Release, one Draft decision, and one distribution
gate. The workflow creates no Draft until every required artifact job succeeds.
Phase 1 requires:
- signed and notarized Apple Silicon and Intel macOS Desktop artifacts;
- the unsigned Windows x64 Desktop installer and ZIP;
- the unsigned x64 and arm64 Linux AppImage and deb;
- the signed, notarized, relocatable Apple Silicon CLI/TUI ZIP;
- checksums generated after each artifact reaches its final form.
The convenience Desktop artifacts must not contain a Git runtime, a bundled-Git manifest, or Git/Dugite
redistribution notices. The retired Git executable-backed managed-workspace path must not be restored;
future workspace execution requires a separately reviewed Gitoxide production composition before admission/T1.
The first product release also requires the exact `maka-agent@<version>` npm package. The product
tag and Draft must exist before npm staging, but the Draft must remain unpublished until npm is
public, Finalize has verified it, and Desktop acceptance has exercised remote Runtime Host setup.
## One-time repository setup
Create a protected GitHub Environment named `release`, require the appropriate reviewers, and
configure:
- `CSC_LINK`: base64-encoded Developer ID Application `.p12`;
- `CSC_KEY_PASSWORD`: password for that `.p12`;
- `APPLE_API_KEY`: raw contents of an App Store Connect API `.p8` key;
- `APPLE_API_KEY_ID`: App Store Connect API key ID;
- `APPLE_API_ISSUER`: App Store Connect API issuer ID.
The checked-in release configuration pins Maka's Apple Team ID to `FABM2QUA8Q`. Confirm every
replacement `CSC_LINK` belongs to that team before changing credentials; changing the pinned Team
ID requires its own reviewed product-release change.
Windows remains unsigned until an Authenticode policy and certificate are added. Release secrets
must never be exposed to fork or ordinary pull-request jobs.
Before the first product release, confirm the checked-in `.asf.yaml` has reconciled the live repository:
- the `Immutable release tags` ruleset blocks updates, force-pushes, and deletions of `v*` tags;
- the `release` Environment accepts only its declared source-candidate tag pattern and requires a
reviewer other than the triggering user;
- `npm-publication`, `nightly`, and `product-release` accept only `main`; `product-release` requires
a reviewer other than the triggering user. `npm-publication` and `nightly` have no GitHub approval
gate because scheduled npm and Desktop Nightly publication is automatic; formal npm publication
still requires human 2FA approval after staging.
These controls close the check-to-upload and check-to-stage windows. Finalize uses GitHub Actions
OIDC rather than a stored signing key to attest every convenience artifact. Keep the Release in
Draft while assets and acceptance are incomplete; Desktop rejects downloaded updates whose exact
bytes and expected filename are not covered by that protected workflow identity.
## Create the complete Draft
1. Confirm the podling and Incubator PMC votes have both passed for one immutable source candidate.
Record both result URLs and independently verify its signed annotated
`v<version>-incubating-rc<rc>` tag.
2. Confirm that tag resolves to a commit on `main`, required CI is green for that exact commit, and
root `package.json` contains a product version that has never been released.
3. Confirm `apps/desktop/package.json` and `packages/cli/package.json` exactly match the root
version, and the CLI manifest exposes only the `maka` command.
4. Dispatch `Release` from the exact approved candidate tag and supply the same tag as
`source_reference_tag`. A rerun must use that same tag; never select current `main` instead.
5. Confirm `release-identity`, every Desktop matrix entry, `cli-macos-arm64`, and
`publish` pass. A skipped or failed required job must prevent Draft creation.
6. Confirm one Draft named `v<version>` targets the approved source SHA, identifies the ASF source
reference in its notes, is not marked as a GitHub prerelease or Latest while it remains a Draft,
and contains exactly the release asset names
reported by `node scripts/product-release-artifacts.mjs list`. That list covers all three Desktop
platforms and update metadata, the standalone CLI/TUI, and their required checksums.
7. Inspect the CLI ZIP. It must contain `bin/maka`, `RELEASE.json`, `DISCLAIMER-WIP`, `LICENSE`, `NOTICE`,
`THIRD_PARTY_NOTICES.txt`, the pinned Node license, and no `bin/maka-agent`.
8. Confirm `RELEASE.json` records the Draft's product version and source SHA, Apple Team ID
`FABM2QUA8Q`, the official Node
URL/archive/digest, npm version, workspace and production dependency closures, dependency
patches, Mach-O inventory, and `developer-id-notarized` signing state. Its final Node
entitlements must retain the required hardened-runtime capabilities and omit
`com.apple.security.get-task-allow`, as required by Apple's
[notarization guidance](https://developer.apple.com/documentation/security/resolving-common-notarization-issues).
9. Inspect every Desktop resource tree and confirm `git/`, `bundled-git.json`, `licenses/git/`, and
`licenses/dugite/` are absent.
If the publish job created the product tag or Draft but failed before every asset was uploaded,
rerun `Release` from the same approved ASF source candidate tag with the same
`source_reference_tag` input. Existing Draft assets must exactly
match the newly verified bytes; the retry keeps matching assets and uploads only missing ones. If an
asset conflicts or is unexpected, inspect and remove it manually while the Release is still a Draft,
then rerun. If only the tag exists, the retry creates the missing Draft.
## Publish and verify the npm channel
Follow [the npm release runbook](../docs/cli-npm-release.md) against the exact product tag and Draft:
1. Record the successful **Release** workflow run ID and attempt that built the Draft assets. Run
**npm publication** with `channel=formal` from `main` and record its successful run ID and
attempt.
2. Inspect the staged tarball and provenance, then approve that exact stage with npm 2FA.
3. Run **Finalize product release** from `main`. Its first job verifies the public package
bytes, provenance, signature, and release dist-tag.
4. Install the exact public version on each release platform and complete the npm acceptance steps.
Keep the GitHub Release in Draft throughout this sequence. The final workflow job waits at the
`product-release` Environment. Approve it only after every npm and cross-machine acceptance check
has passed. It verifies the live Draft digests against the immutable publication record from the
exact successful Release run, creates Sigstore provenance and an offline
`Maka-<version>-attestation.sigstore.json` bundle, then publishes the convenience Release and makes a
stable release Latest in the same GitHub operation. Do not publish or
change the Latest designation manually. A failed or rejected npm candidate requires a new product
version; never publish the Draft to work around npm state.
## Acceptance on another Mac
Run this section twice: once on an Apple Silicon Mac with the `mac-arm64` DMG, and once on an Intel
Mac with the `mac-x64` DMG. The CLI/TUI ships for Apple Silicon only, so steps 4 to 7 belong to the
Apple Silicon pass.
Download the DMG, CLI ZIP, and their checksum files through a browser from the Draft. Do not move
artifacts directly from the workflow runner; the browser path supplies the real quarantine
boundary.
1. Run `shasum -a 256 -c` for the DMG and CLI ZIP.
2. Install and launch the Desktop app from Finder. Confirm there is no unidentified-developer or
damaged-app warning.
3. Run `spctl --assess --type execute --verbose=4 /Applications/Maka.app` and confirm a Developer
ID origin.
4. Extract the CLI ZIP without clearing quarantine. Run `bin/maka --version` and `bin/maka --help`.
Keep the Mac online for this first Gatekeeper assessment: the notarized ZIP cannot carry a
stapled ticket, so macOS may retrieve it from Apple.
5. Create an external link, for example `ln -s "$PWD/bin/maka" /tmp/maka-release-acceptance`, and
confirm the linked command reports the same version and help output.
6. Start `bin/maka` with no arguments and confirm the TUI renders, accepts input, and exits cleanly.
7. Exercise one non-interactive `bin/maka run`, one deterministic `bin/maka eval run`, and one streaming
tool-call path against the packaged artifact.
8. Configure a Desktop model connection, send one prompt, and run one representative file-tool
task. Confirm the documented Computer Use limitation remains accurate.
9. Add a clean remote Runtime Host from the packaged Desktop app. Confirm setup installs the exact
public `maka-agent@<version>` package and the remote session completes one model turn.
## Acceptance on a Windows x64 machine
Download the installer, Windows Desktop ZIP, and both checksum files through a browser from the same Draft.
1. Verify both SHA-256 checksums in PowerShell.
2. Expand the ZIP and launch its Maka executable once to confirm the portable artifact starts.
3. Run the installer and confirm the expected unsigned-publisher SmartScreen flow.
4. Launch Maka from the Start menu, configure a model connection, send one prompt, and run one representative file-tool task.
5. Run one terminal task and confirm packaged `node-pty` behavior.
6. Confirm the documented Computer Use limitation remains accurate.
7. Add a clean remote Runtime Host from the packaged Desktop app. Confirm setup installs the exact
public `maka-agent@<version>` package and the remote session completes one model turn.
## Acceptance on a Linux machine
Run this section twice: once on x64 with the `x86_64` AppImage and the `amd64` deb, and once on
arm64 with the `arm64` pair. Download both distributables and their checksum files through a browser
from the same Draft.
1. Run `sha256sum -c` for the AppImage and the deb.
2. `chmod +x` the AppImage and launch it once to confirm the portable artifact starts.
3. Install the deb with `sudo apt install ./Maka-<version>-linux-<arch>.deb` and launch Maka from the
desktop launcher entry.
4. Configure a model connection, send one prompt, and run one representative file-tool task.
5. Run one terminal task and confirm packaged `node-pty` behavior.
6. Confirm the documented Computer Use limitation remains accurate: Computer Use is not offered on
Linux.
7. Add a clean remote Runtime Host from the packaged Desktop app. Confirm setup installs the exact
public `maka-agent@<version>` package and the remote session completes one model turn.
Immediately before approving the `product-release` Environment, reverify that the approved ASF
candidate tag and convenience `v<version>` tag still resolve to the same recorded commit. Approve
only after npm verification and every independent-machine acceptance pass. If any required artifact, npm step, or
acceptance step fails, keep the Draft unpublished, fix the issue, increment the root product
version, and run the full workflow again. Never replace an existing release identity.
After Finalize publishes the convenience Release, download its attestation bundle and verify each
installer or archive independently:
```sh
gh attestation verify path/to/Maka-<version>-mac-arm64.zip \
--bundle path/to/Maka-<version>-attestation.sigstore.json \
--repo apache/maka \
--signer-workflow apache/maka/.github/workflows/release-cli-finalize.yml
```
Desktop performs the same trust decision before exposing a downloaded update for installation.