{% extends "base.html" %} {% import "repo_tabs.html" as m %} {% block title %}Trust · {{ t.tag }} · {{ repo.owner }}/{{ repo.name }}{% endblock %} {% block bodyattrs %} data-repo="{{ repo.url }}"{% endblock %} {% block tabs %}{% call m::tabs(repo, "releases") %}{% endblock %} {% block mainclass %} class="wide"{% endblock %} {% block content %}

Trust release {{ t.tag }}{% if !t.title.is_empty() %} · {{ t.title }}{% endif %}

Export JSON

Who wrote what this release holds, how it is authenticated, what built each asset and from what, with every claim audited below.{% if let Some(p) = t.since %} Changes are counted since the previous release, {{ p }}.{% endif %} The export carries the signed receipts: check each with oxy receipt verify.

Audit {{ t.audit.len()|plural("check", "checks") }}

Graph

Authors → the tagged state → the jobs that built the assets → the assets. A lock marks what is signed and checked, ! what is not (unsigned, or uploaded by hand), ✘ what fails. A dashed line is a build from another state than the tag's. Hover a box for the details.

{{ graph|safe }}

Tag {{ t.tag }}

Signature
{% if t.tag_signature == "valid" %}✔ valid{% else if t.tag_signature == "unsigned" %}○ unsigned{% else %}✘ {{ t.tag_signature }}{% endif %}{% if let Some(k) = t.tag_signer %} · {% if let Some(a) = k.account %}{{ k.name }}{% else %}{{ k.name }}{% endif %} {{ k.key|short }}{% endif %}
State
{% for h in t.heads %}{{ h|short }} {% endfor %}

Authors {{ t.changes|plural("change", "changes") }}

{% for a in t.authors %}{% endfor %}
AuthorKeyChangesSignedSealedUnsignedProblems
{% if let Some(acc) = a.who.account %}{{ a.who.name }}{% else %}{{ a.who.name }}{% endif %}{{ a.who.key|short }}{{ a.changes }}{{ a.signed }}{{ a.sealed }}{% if a.unsigned > 0 %}{{ a.unsigned }}{% else %}0{% endif %}{% if a.invalid + a.revoked > 0 %}{{ a.invalid }} invalid, {{ a.revoked }} revoked{% else %}none{% endif %}

Assets

{% if t.assets.is_empty() %}

This release has no assets.

{% endif %} {% for a in t.assets %}

{{ a.name }} {% if let Some(b) = a.build %}{% if b.receipt.is_some() && b.receipt_problem.is_none() %}attested build{% else %}built, not attested{% endif %}{% else %}uploaded by hand{% endif %} {{ a.size|bytes }} · blake3 {{ a.blake3|short }}

{% if let Some(b) = a.build %}
Built by
run #{{ b.run }} job {{ b.job }}{% if let Some(c) = b.exit_code %}, exit {{ c }}{% endif %}
Runner
{% if let Some(r) = b.runner %}{{ r.name }} {{ r.key|short }}{% if b.runner_known %} runner key of this hub{% endif %}{% if b.runner_revoked %} revoked{% endif %}{% else %}no signed receipt{% endif %}
Receipt
{% if let Some(u) = b.receipt_url %}signed receipt{% if let Some(p) = b.receipt_problem %} {{ p }}{% else %} ✔ verifies{% endif %}{% else %}none kept{% endif %}
Environment
{{ b.runtime }} · rootfs {{ b.rootfs|short }} · environment {{ b.environment|short }}
Inputs
state {% for h in b.heads.split('+') %}{{ h|short }} {% endfor %}{% if b.same_state_as_tag %}the tagged state{% else %}not the tagged state{% endif %} · pipeline {{ b.pipeline_hash|short }} · scope {{ b.scope_tree_hash|short }}
{% else %}

No passed OxygenFlow job of this repository produced these bytes: uploaded by hand.

{% endif %} {% endfor %}
{% endblock %}