Skip to content

release(mcp): decide and publish Darwin archives without overstating host support #2739

Description

@Rul1an

Measured current state

Reconciled on origin/main 3dd32b8f452f48d7aac736b781a68ccc3417edc4 and published release v5.5.2 / d813af0e52f2846d3e5f47a53c042aa169304dc3.

The absence is currently deliberate and internally consistent:

  • scripts/ci/release_asset_contract.sh marks both Darwin assay-mcp-server targets unsupported;
  • .github/workflows/release.yml builds MCP-server archives only in build-mcp-server-linux;
  • docs/reference/release.md renders both Darwin rows as unsupported;
  • docs/data/product-capabilities.v0.json and generated support docs claim only Linux MCP-server archives.

A credential-free Phase-A run for #2684 verified the published macOS arm64 CLI asset, then installed exact assay-mcp-server =5.5.2 --locked from crates.io because no Darwin MCP-server release archive exists. That satisfies #2684's published-package boundary, but it requires a Rust toolchain and minutes of compilation. It does not make the route good general-user DX.

Decision before implementation

Choose and record one posture before changing the matrix:

  1. keep Darwin MCP-server archives unsupported and retain the crates.io route; or
  2. publish them as manual_step assets with an explicit Gatekeeper disposition.

A GitHub/Sigstore attestation is not Apple code signing or notarization. A quarantined, unnotarized download may be blocked when a GUI host spawns it even though a local cargo-built binary runs. Do not add release rows without deciding either:

  • Developer ID signing and notarization, including the new CI credential boundary; or
  • an explicit manual-step limitation and documented quarantine handling.

Smallest bounded implementation if option 2 is chosen

  1. RED contract: change only the two Darwin MCP rows in release_installability_matrix() from unsupported to manual_step with their exact archive names. Existing release-contract tests must fail because no producer exists.
  2. Producer: extend/rename the MCP build job with x86_64-apple-darwin and aarch64-apple-darwin, preserving the Linux packaging/checksum/attestation contract.
  3. Generated truth: regenerate the release matrix and product-capability/support surfaces. New claims begin with the next release; never backfill v5.5.2.
  4. Host observation: before installer promotion or host-support wording, run a release(host proof): drive Codex discovery and one Assay tool on published v5.5.2 #2684-style macOS host journey against the downloaded archive itself.

Acceptance criteria

  • The notarization/manual-step posture is explicitly recorded before producer work.
  • Contract RED is demonstrated before the producer makes it green.
  • Both Darwin archives and .sha256 sidecars are covered by the same bounded release preflight and attestation policy as Linux MCP archives.
  • Generated docs match the shared contract exactly.
  • A downloaded-asset macOS host observation is retained and independently reviewed before any host-support claim.
  • MCPB-on-Darwin remains a separate decision.

Priority and release disposition

P2 / post-MVP. This does not block the current Codex launch proof: #2684 explicitly admits a published package and the exact crates.io route is provenance-bound. The next implementation belongs in v5.5.3 or a later release because v5.5.2 is immutable.

Non-claims

Publishing an archive does not prove installation, Gatekeeper compatibility, editor discovery, skill discovery, MCP startup, or tool invocation. This issue does not claim user demand, acceptable general-audience cargo-install DX, a need for MCPB on macOS, or anything about Windows.

Metadata

Metadata

Assignees

No one assigned

    Labels

    cluster:release-integrityRelease-prep surface and the release-blocking gate that guards itdxProject phase/areahorizon:post-mvpValid follow-up deferred until MVP; re-enter on the issue-specific triggerpriority:P2Near-term production hardening after active CI blockers; not automatically an MVP blockersize:MAI-assisted: about a day. Several components, a new mechanism, or a decision to take.

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions