flatpak-index

Evaluating provenance admission

This is a proposal, not an enforced publication policy. Now, tuna-os/docs serves the production catalog; application workflows can write it directly. The owner and publication entry point remain open decisions in #171 and #168. The shared publish-flatpak-index action, the update-flatpak-index action, and vendored update-index.py copies are distinct paths. An admission check in only this repository would not stop the other writers or protect deployment.

Candidate contract

The Frostyard implementation shows how to verify a root attestation and hash child/config bytes. This proposal does not adopt its missing/private-image skip or its blanket self-hosted-runner denial. Producer provenance is not a Flatpak client signature: it does not authenticate the catalog to clients. This document asserts no cosign signature of the current index. Reproducible rebuilds can provide additional evidence but are not a substitute for client trust or provenance verification.

Current partial protection and verification needed

The metadata auditor uses the oci.py registry helper. This helper checks the raw sha256 bytes of digest-addressed manifests and configs before it parses them. A tag passed as a manifest reference remains mutable, and this check does not authenticate it. This is an integrity check against the caller’s digest, not an attestation, an admission gate, or a check on the local OCI layout read by update-index.py. You also must not treat the repair command as an atomic production publisher.

Before you roll out the proposed gate, inventory and migrate all production writers, select and protect the publisher, and agree the per-project policy. Exercise missing/wrong attestations and tampered bytes, valid releases with multiple refs/branches/architectures, and failed updates that leave the prior catalog untouched. Run the complete affected publisher and registry test modules. Then use a disposable Flatpak remote in user scope to run remote-ls and a no-deploy installation against the candidate, but do not publish it. Finally verify the served endpoint after a separately authorized deployment. The local registry tests on their own do not establish this end-to-end behavior.