Introduce a "PR mode" for attestations
Les mainteneurs répondent en général sous 1 jour
Évaluation
Cette issue n'a pas encore été évaluée.
Description
Context / problem
When an attestation runs as part of a pull request / merge request, Chainloop today treats it the same as a build on main/a release. That causes two side-effects we don't want for PR builds:
- Latest promotion — PR builds get promoted to the project's "latest" version. The current workaround is manually passing
--mark-latest=false, but that flag was really meant to express "this is a PR build". We're overloading a low-level flag to express a higher-level concept. - Findings processing — policy violations from a PR build get processed (and later re-processed) as if they were findings from a real merge/release build. We want PR-originated attestations to be tagged so downstream consumers can choose not to (re)process them.
The underlying insight: the real concept we want is "PR mode", and both behaviors above should flow from that single signal rather than being manually wired via --mark-latest.
Decision (simplified)
After discussion, we're simplifying the original proposal. Instead of adding a new field on the WorkflowRun ent schema or tagging the policy evaluation object, we'll set a top-level annotation on the attestation. This keeps the change minimal and decouples the PR signal from the policy evaluation pipeline.
Well-known annotation key: chainloop.dev/is-pull-request with value "true".
This leverages the existing annotations map on the Attestation proto (crafting_state.proto), which already flows through the rendering pipeline — no proto schema changes, no DB migration, no codegen churn.
Detection — auto-detect + explicit override
- Auto-detect from the CI runner environment (already implemented in
DetectPRContext/prmetadata.go):- GitHub Actions:
GITHUB_EVENT_NAME=pull_request(orpull_request_target). - GitLab:
CI_PIPELINE_SOURCE=merge_request_event/CI_MERGE_REQUEST_IID. - Dagger: delegates to the parent CI env vars.
- GitHub Actions:
- Explicit
--pr/--pr=falseflag onchainloop attestation initoverrides auto-detection (zero-config in CI, escapable for edge cases / self-hosted / generic runner).
Behavior when in PR mode (by default)
- Skip latest promotion — default to
mark-latest=false. An explicitly-passed--mark-latest=truestill wins (respect explicit user intent). This replaces the manual--mark-latest=falseworkaround. - Set the
chainloop.dev/is-pull-request=trueannotation on the attestation so downstream consumers (e.g. findings processing) can detect PR-originated attestations and skip (re)processing.
Scope split
- OSS (this issue): capture & propagate the PR signal as a top-level annotation on the attestation; wire
--prflag andmark-latestdefault behavior. - SaaS (downstream): findings processing/reprocessing reads the annotation and decides whether to process. Not in scope for this issue.
Relevant code pointers
- PR detection (existing):
pkg/attestation/crafter/prmetadata.go(DetectPRContext),pkg/attestation/crafter/collector_prmetadata.go. - Runner env vars:
pkg/attestation/crafter/runners/githubaction.go,gitlabpipeline.go,daggerpipeline.go. - CLI flags:
app/cli/cmd/attestation_init.go(--mark-latest). - Attestation proto (annotations map):
pkg/attestation/crafter/api/attestation/v1/crafting_state.proto(Attestation.annotations, field 5). - Crafter init (where annotation would be set):
pkg/attestation/crafter/crafter.go(initialCraftingState). - Action layer:
app/cli/pkg/action/attestation_init.go.
🤖 Posted by Maximus bot (Claude Code) on behalf of @migmartri
- Langage dominant
- Go
- Étoiles
- 582
- Forks
- 61
- Merge moyen
- 12 h 47 min
- PR mergées (30 j)
- 137
Préparer son environnement
- Aucun Dockerfile ni fichier Docker Compose
- Aucun modèle de pull request
- Lire le guide de contribution
Par où commencer
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- Ouvrez une pull request qui référence le numéro de l'issue.
Autres issues de chainloop-dev/chainloop
-
feature-parity trace-provider
Difficulté 2/5 1-3 heures Accessibilité débutants 70/100
chainloop-dev/chainloop#3802 ·
Les mainteneurs répondent en général sous 1 jour
-
bug trace-provider
Difficulté 4/5 3-5 jours Accessibilité débutants 48/100
chainloop-dev/chainloop#3803 ·
Les mainteneurs répondent en général sous 1 jour
-
feat(trace): support GitHub Copilot (CLI and VS Code) in Chainloop TracePeut-être pris @migmartri l’a pris aujourd’hui. OuverteFeature spec trace-provider
chainloop-dev/chainloop#3800 · 1 commentaire · 1 personne assignée ·
Les mainteneurs répondent en général sous 1 jour
-
Allow enabling policy enforcement at the workflow contract levelPeut-être pris @migmartri l’a pris il y a 10 jours. Ouvertecomponent/backend new-policy spec
chainloop-dev/chainloop#3762 · 1 commentaire · 1 personne assignée ·
Les mainteneurs répondent en général sous 1 jour
-
chainloop component/CLI performance trace-provider
Difficulté 4/5 3-5 jours Accessibilité débutants 62/100
chainloop-dev/chainloop#3756 ·
Les mainteneurs répondent en général sous 1 jour
Toutes les issues de chainloop-dev/chainloop
Issues similaires
-
GitHub webhook is not subscribed to release events, so `event: release` never triggersPeut-être pris @qsun l’a pris aujourd’hui. Ouverte
Difficulté 2/5 1-3 heures Accessibilité débutants 78/100
woodpecker-ci/woodpecker#7542 ·
Les mainteneurs répondent en général sous 1 jour
-
Difficulté 2/5 1-3 heures Accessibilité débutants 74/100
zilliztech/milvus-backup#1386 ·
Les mainteneurs répondent en général sous 1 jour
-
Pipelined flush no longer observes kill signals after #2042: flush backoffer is built with nil varsOuverte
Difficulté 2/5 1-3 heures Accessibilité débutants 78/100
Les mainteneurs répondent en général sous 1 jour
-
model:sonnet runtime:claude security size:S
Difficulté 2/5 1-3 heures Accessibilité débutants 78/100
FootprintAI/Containarium#3624 · 1 commentaire ·
Les mainteneurs répondent en général sous 1 jour
-
Difficulté 2/5 1-3 heures Accessibilité débutants 86/100
Les mainteneurs répondent en général sous 1 jour