Skip to content

release(native): establish platform code signing, notarization, artifact identity & rollback trust #574

Description

@qnbs

v1.29 release-truth disposition — 2026-09-29

The only current v1.29 blocker discovered under this owner was a truth bug, not missing signing implementation: Help claimed macOS/Windows installers were code-signed even though the release pipeline currently provides Tauri updater signatures, not Apple Developer ID/notarization or Windows Authenticode.

#904 removed that overclaim across the affected locales and also corrected the desktop data/log path shown for manual backups. Resulting main a67354841c54a73a6ddb8785bac2273762499aa2 has green CI/CD + CodeQL and exact-SHA READY Production.

Therefore:

  • v1.29 does not claim OS-native installer signing/notarization;
  • this issue remains open and post-release;
  • release evidence must preserve the distinction:
source/tag identity
!= Tauri updater Minisign signature
!= macOS Developer ID + notarization
!= Windows Authenticode

Do not pull Developer ID/notarization/Authenticode implementation into v1.29 unless a new independently evidenced release blocker appears.

#906 owns future packaged functional qualification; it does not replace this artifact-trust/signing owner.


Context

WorldScript Studio's desktop release pipeline already has meaningful integrity controls, but it currently stops short of OS-native trust for downloaded installers.

Current release evidence and documentation distinguish these layers correctly:

Git commit/tag signature
        ≠
GitHub build provenance / attestation
        ≠
Tauri updater Minisign signature
        ≠
macOS Developer ID + notarization
        ≠
Windows Authenticode signature

The updater path already verifies per-platform Tauri updater artifacts with the configured Minisign public key. Current v1.28.x release evidence nevertheless states explicitly that platform code-signing and notarization remain separate claims. docs/TAURI-CI.md documents macOS APPLE_* requirements and says Windows Authenticode still requires a CA-issued certificate. docs/TAURI-UPDATER.md likewise documents the intended macOS/Windows signing inputs but the normal release pipeline does not yet make these guarantees authoritative.

The binding native roadmap also requires packaged identity, signing/update trust, rollback and installer evidence before native stable admission.

No current open issue owns this cross-platform release-trust remainder end to end.

Related but distinct:

Goal

Establish one explicit, testable native-release trust contract for supported desktop platforms:

SOURCE / TAG IDENTITY
        ↓
TRUSTED CI BUILD
        ↓
ARTIFACT IDENTITY + PROVENANCE
        ↓
OS-NATIVE SIGNATURE / NOTARIZATION WHERE APPLICABLE
        ↓
UPDATER SIGNATURE + MANIFEST CONSISTENCY
        ↓
INSTALL / UPDATE / ROLLBACK VERIFICATION

The objective is not simply to make Gatekeeper/SmartScreen warnings disappear. It is to make every release artifact's identity, signing authority, update relationship, revocation/rotation behavior and recovery path explicit.


1. Current release-trust inventory

Before changing CI, inventory every produced desktop artifact and its existing trust layer.

At minimum record for each current platform/artifact:

Linux:
  .deb
  .rpm
  .AppImage

Windows:
  .msi
  .exe / NSIS bundle where produced

macOS:
  .dmg
  .app.tar.gz updater payload

Cross-platform:
  latest.json
  updater .sig files
  GitHub provenance/attestations if/when present
  release checksums/digests if present

For every artifact capture:

Artifact Built by OS-native signature Updater signature Provenance Verification command Current gap

Do not call an installer "signed" solely because a different updater archive has a Minisign .sig file.


2. macOS Developer ID signing + notarization

Define and implement the production macOS release path using the current Apple-supported model.

Required properties:

  • Developer ID signing identity is explicit;
  • credentials exist only in the release job that needs them;
  • hardened-runtime/entitlement requirements are reviewed rather than copied blindly;
  • all executable code in the distributed app bundle is signed consistently;
  • notarization is submitted and reaches an accepted terminal result before publication is called successful;
  • notarization ticket is stapled where applicable;
  • the published .dmg and updater bundle are independently verified after packaging;
  • CI records non-sensitive verification evidence (codesign, spctl, notarization/stapling status) without dumping certificate/private material;
  • failure to sign/notarize a release that claims these guarantees is fail-closed.

A locally usable unsigned developer build may remain possible, but it must be visibly distinct from a production release artifact.

Credential policy

Inventory and minimize the currently documented APPLE_* secret surface.

Prefer modern short-lived/notarization credentials where upstream tooling supports them; if long-lived credentials remain necessary, document:

owner
scope
rotation procedure
revocation procedure
recovery procedure

Never expose Apple credentials to pull-request-controlled code.


3. Windows Authenticode signing

Define and implement an evidence-backed Windows signing path.

Required decisions/evidence:

  • certificate source/type appropriate to the project and distribution model;
  • secure CI access mechanism for the private signing key or signing service;
  • SHA-256 signing;
  • trusted timestamping so signatures remain valid after certificate expiry where the platform contract permits;
  • .msi and .exe/NSIS artifacts covered as applicable;
  • post-build signtool verify or equivalent verification against the published bytes;
  • subject/publisher identity documented truthfully;
  • renewal/rotation/revocation procedure;
  • no certificate/private-key material exposed to normal PR jobs.

SmartScreen reputation is not itself a cryptographic acceptance criterion. Document it as a distribution UX consideration rather than pretending code signing guarantees immediate reputation.


4. Linux artifact trust policy

Linux desktop distribution has no single universal Authenticode/Gatekeeper equivalent.

Define an explicit policy for the formats WorldScript publishes rather than making a vague "all installers signed" claim.

Evaluate, as applicable:

Do not introduce redundant signature layers with no documented verifier/user path.


5. Updater trust remains a separate layer

Preserve the current Tauri updater signature model as an independent control.

Explicitly prove:

latest.json identifies the intended release
        ↓
URL selects the intended artifact
        ↓
artifact bytes match the signature
        ↓
configured public key rejects modified/foreign payloads
        ↓
installation/relaunch occurs only after verification

Test both positive and negative cases.

Required negative cases include:

  • modified updater payload;
  • wrong signature;
  • wrong manifest signature/entry where applicable;
  • release manifest pointing at the wrong platform/architecture;
  • stale/older release offered unexpectedly;
  • missing asset;
  • interrupted download;
  • key mismatch after a planned rotation.

Do not conflate updater Minisign with macOS/Windows platform signatures in UI or docs.


6. Signing-key lifecycle and emergency response

Every signing authority must have a documented lifecycle.

For each key/certificate define:

PURPOSE
OWNER
STORAGE / CI ACCESS MODEL
ROTATION TRIGGER
EXPIRY
REVOCATION PROCEDURE
COMPROMISE RESPONSE
PUBLIC-KEY / CERTIFICATE UPDATE PROCEDURE
OLD-RELEASE VERIFICATION CONSEQUENCES

At minimum cover:

Updater-key rotation

A rotation must not strand already-installed clients.

Design the transition explicitly before replacing the embedded updater public key. If the updater architecture only trusts one key at a time, define the necessary bridge-release sequence and recovery behavior.

A compromised updater key is a security event, not an ordinary dependency bump.


7. Release artifact identity and manifest coherence

Create one release evidence manifest or equivalent machine-verifiable record tying together:

release tag
source commit SHA
workflow/run identity
application version
platform + architecture
artifact filename
artifact SHA-256
OS signing identity/status where applicable
updater signature presence/status
provenance/attestation reference

The exact serialization format is implementation-defined, but duplicate sources of truth should be avoided.

latest.json, GitHub Release assets and the actual uploaded bytes must be checked for exact agreement.

Do not generate hashes before a later signing/notarization step mutates the artifact.


8. Reproducibility and rebuild evidence

This issue does not require immediate bit-for-bit reproducible desktop binaries on every OS, but it must make the level of reproducibility explicit.

Inventory nondeterministic inputs:

Classify release reproducibility as one of:

SOURCE_REPRODUCIBLE
DEPENDENCY_GRAPH_REPRODUCIBLE
BUILD_ENVIRONMENT_PINNED
FUNCTIONALLY_REBUILDABLE
BIT_FOR_BIT_REPRODUCIBLE
NOT_YET_PROVEN

Do not claim deterministic/reproducible binaries without evidence.

Where bit-for-bit comparison is impossible due to signatures/timestamps, compare stable pre-signing payloads or normalized components only if this produces meaningful assurance.

#529 remains the provenance/SBOM owner; #570/#572/#573 own the underlying toolchain determinism.


9. Rollback / bad-release response

Define a safe response to a signed but defective release.

At minimum answer:

  • can latest.json be rolled back safely?;
  • does the updater permit downgrade, and should it?;
  • how are incompatible persisted-data/schema migrations handled?;
  • how is a bad artifact withdrawn without breaking already-installed clients?;
  • when is a replacement patch release required instead of manifest rollback?;
  • how do platform signatures/notarization behave for withdrawn releases?;
  • how are release notes/status pages/docs corrected?;

Data compatibility outranks release convenience. Never downgrade automatically across a persisted-data format boundary that the older version cannot safely read.

Coordinate project/schema compatibility with #553 and protected-data migration with #445.


10. CI trust boundary / least privilege

Release-signing jobs are privileged code-execution environments.

Required properties:

  • secrets are unavailable to ordinary pull-request jobs;
  • release workflow inputs are validated;
  • release only builds from admitted tags/refs according to policy;
  • actions remain SHA-pinned;
  • signing occurs only after required source/CI gates;
  • artifacts passed into a privileged signer have a trusted provenance/identity path;
  • no PR-controlled artifact can be substituted into the signing step;
  • environments/approvals are used where appropriate;
  • logs/artifacts cannot leak signing material.

Coordinate generalized GitHub Actions trusted-execution concerns with #506/#510 rather than inventing a separate workflow-policy engine here.


11. Qt migration relationship

This contract must survive the Tauri→Qt transition.

Separate:

PRODUCT RELEASE TRUST CONTRACT
        = durable

TAURI PACKAGING IMPLEMENTATION
        = transitional

QT PACKAGING IMPLEMENTATION
        = future adapter to the same contract

Do not defer OS signing/notarization merely because Tauri is transitional: current users download current installers today.

Conversely, do not build a Tauri-specific signing abstraction that Qt cannot replace cleanly.

Before Qt Stable, the Qt packaging lane must prove equivalent or stronger:

  • artifact identity;
  • native code signing/notarization;
  • updater/update trust if Qt uses an updater;
  • rollback/revocation;
  • least-privilege CI;
  • packaged verification.

12. Documentation truth

After implementation, reconcile:

Use precise vocabulary:

SIGNED UPDATER PAYLOAD
AUTHENTICODE-SIGNED INSTALLER
APPLE-DEVELOPER-ID-SIGNED APP
NOTARIZED / STAPLED
PROVENANCE-ATTESTED BUILD

Never collapse them into generic "signed".


Acceptance criteria

Non-goals

Activity

  1. qnbs commented on Sep 11, 2026

    @qnbs
    OwnerAuthor

    2026-09-11 release-trust addendum — SAST evidence at the tagged SHA, without redundant tag-trigger theatre

    Fresh workflow inspection shows .github/workflows/codeql.yml currently runs on:

    pull_request → main
    push → main
    weekly schedule
    

    and does not run directly on release tags. At the same time, ci.yml does run on tags.

    This should be treated as a release-evidence question, not automatically as a demand to add another expensive duplicate CodeQL run.

    Required trust property

    For every native release tag, the release pipeline should be able to prove:

    release tag
    → exact source commit SHA
    → that SHA is admitted main/release source
    → required CI passed on that SHA
    → CodeQL/SAST passed on that same source SHA (or an explicitly equivalent analyzed tree)
    → packaging/signing starts from that admitted source
    

    If the release tag is created only from a main commit with terminal exact-SHA CodeQL evidence, a second tag-triggered CodeQL run may provide little unique signal. Prefer verifying/referencing the existing exact-SHA result in release admission/evidence rather than adding redundant SAST solely for optics.

    If the current release process cannot reliably prove that relation — e.g. a tag can point at source without qualifying CodeQL evidence — then add the smallest fail-closed release admission necessary, which may be a tag-triggered analysis or an explicit exact-SHA verification gate.

    Acceptance refinement

    The machine-readable/native release evidence owned by #574 should record or link the security-analysis admission for the source SHA alongside:

    • tag/SHA/version;
    • CI identity;
    • artifact hashes;
    • platform signing/notarization state;
    • updater signature state;
    • provenance/attestation.

    Do not describe CodeQL on tag itself as the security objective; SAST-qualified exact source identity is the objective.

    This remains separate from #529's SBOM/provenance work and from OS-native signing/notarization.

  2. qnbs commented on Sep 22, 2026

    @qnbs
    OwnerAuthor

    2026-09-22 housekeeping — v1.28.8 supplies partial release-trust evidence, not OS-native signing closure

    The successful v1.28.8 release materially advances this issue's evidence baseline:

    • annotated tag v1.28.8 is GitHub-verified with a valid SSH signature;
    • the tag resolves to exact release commit 868d66bc9e1e378a6937d426bca2727fafa0d963;
    • source admission was performed from exact-SHA main CI/CD + CodeQL evidence before tag creation;
    • the tag-triggered Tauri release workflow completed for Ubuntu, Windows and macOS;
    • the published GitHub Release contains the expected Linux/Windows/macOS ARM artifacts, updater .sig files and latest.json;
    • post-release repository truth was synchronized separately without moving the immutable release tag.

    This is useful evidence for:

    SOURCE / TAG IDENTITY
    exact-SHA release admission
    updater artifact/signature publication
    release asset ↔ version/tag consistency
    

    It does not prove or satisfy by implication:

    Keep #574 OPEN / P1 until those platform/native trust criteria are evidenced explicitly. Coordinate any user-facing wording with #549 so "signed" never collapses tag signature, updater Minisign, Authenticode and Apple notarization into one claim.

    Historical text embedded in the immutable v1.28.8 tag message reflects the tracker state at tag time; later issue-state changes do not justify moving or rewriting the tag.

  3. qnbs commented on Sep 23, 2026

    @qnbs
    OwnerAuthor

    User-facing trust overclaim found during 2026-09-23 issue housekeeping

    Current locales/en/help.json → help.docs.tauriDesktop.content presently describes:

    .dmg for macOS (code-signed)
    .msi / .exe for Windows (code-signed)
    

    That wording is stronger than the evidence currently admitted by this issue.

    As already recorded here, v1.28.8 establishes verified source/tag identity and Tauri updater-signature publication, but does not by itself prove:

    • macOS Developer ID signing + notarization + stapling;
    • Windows Authenticode + timestamping.

    Therefore this Help wording is a concrete #574/#549 truth consumer that must be corrected now, without waiting for #574 implementation, so users are not told a platform trust property that is not yet evidenced.

    When #574 eventually lands OS-native signing, update the Help copy from the machine-/release-evidence authority rather than reintroducing a generic “signed” statement.

    Cross-owner:

  4. added a commit that references this issue on Sep 29, 2026
  5. qnbs commented on Sep 29, 2026

    @qnbs
    OwnerAuthor

    #904 merged — user-facing signing overclaim corrected

    GH #904 merged normally to main at a67354841c54a73a6ddb8785bac2273762499aa2. The Help surface no longer claims macOS/Windows installers have OS-native code signing, and the reviewed desktop data/log-path corrections are included.

    This closes the narrow v1.29 truth-consumer blocker identified under #574/#549; it does not close this issue. Apple Developer ID signing/notarization/stapling, Windows Authenticode/timestamping, machine-readable artifact trust evidence and the broader native-signing lifecycle remain post-release work under #574.

    Vercel Production is READY on exact a67354841...; resulting-main CI/CD + CodeQL still require terminal proof before candidate freeze.

  6. qnbs commented on Sep 29, 2026

    @qnbs
    OwnerAuthor

    The user-facing overclaim recorded above is fixed by #904 (merged a6735484). help.docs.tauriDesktop.content no longer calls the macOS/Windows installers code-signed in any of the 17 affected locales. This issue remains open as the implementation owner for real OS-native signing, notarization and Authenticode; once that lands, the Help copy should be re-derived from release evidence.

  7. qnbs commented on Sep 30, 2026

    @qnbs
    OwnerAuthor

    v1.30.0 boundary — 2026-10-01

    Release owner #926 targets the complete desktop at-rest encryption authority.

    This signing/notarization owner remains separate. Do not falsely block v1.30.0 on OS-native signing/notarization unless a fresh distribution policy/security requirement explicitly makes it a prerequisite; equally, do not claim Apple notarization/Developer ID or Windows Authenticode unless actually implemented and proven.

    Artifact identity/rollback evidence that is already available should still be reused by #926/#924 where relevant.

  8. added 2 commits that reference this issue on Oct 10, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions