{% extends "curb_base.html" %} {# Projects › Commits: each agent's signing key, and which key signed each commit. #} {% block scope %}{{ k.picker(project) }}{% endblock %} {% block part %}
{% call k.head("See which commits an agent signed, and with which key.", "Read from git in each project. A signature shows which key signed, not who wrote the code.") %} {% if unsigned %}{{ k.act("Set up signing for " ~ unsigned | join(" and "), "signing", "btn-primary") }}{% endif %} {% endcall %} {% if keys %}
Signing keys {{ ico.icon('devices', 12) }} This machine kept in your operating system's credential store
AgentKeyKnown toReplace by
{% for row in keys %}
{{ row.label }} {% if row.fingerprint %} {{ row.fingerprint }} {{ row.known }} Replace by {{ day(row.replace_by) }} {% if row.due %}Due{% endif %} {{ k.act("Replace", "replace", "btn-sm", "&key=" ~ row.agent) }} {% else %} {{ k.st("quiet", "No key yet") }} {% endif %}
{% endfor %}
{% endif %} {% if not projects %} {% call empty.state("project", "No projects yet") %}

Curb reads the commits of the projects on your Projects page. Add one there first.

New project {% endcall %} {% else %}
Commits {{ k.tally() }} {% call k.tools("Search commits", {"project": project}) %} {% endcall %}
{% if view.error %} {% elif not revision %}

The newest 15 commits of {{ "this project" if one else "each project" }}. Enter a commit or a range, such as main..HEAD, to see others.

{% endif %} {% for line in view.problems %}{% endfor %}
CommitSubject{% if not one %}Project{% endif %}Signed by
{% for row in table.rows %}
{{ row.sha }} {{ row.subject }} {% if not one %}{{ row.project }}{% endif %} {{ row.label }}{{ row.who }}
{% endfor %} {{ k.foot("No commit matches that.") }}
{% endif %}
{{ k.terminal("Add the keys to GitHub, so it shows the commits as verified", "It runs your own gh command, with your GitHub login.", "flanner curb attribution --setup --github") }} {{ k.terminal("Fetch your organization's newest key list", "The web UI never contacts your organization. The terminal does, and this page then uses the list it saved.", "flanner curb verify main..HEAD") }}
{% call k.explain("What a signature tells you", "Which key signed a commit. Not who wrote the code.") %}

Each agent gets its own signing key, so its commits can be told apart from yours. You, or anything running as you, can still sign inside an agent's session.

Agent key
The commit was signed by a key your organization lists for an agent.
Not trusted
The key was revoked. This holds even offline.
Cannot tell
The commit is signed, but this machine has no fresh key list.
{{ k.cmd("flanner curb verify main..HEAD") }} {% endcall %}
{% endblock %} {% block reviews %} {% call k.review_box("signing", "Set up commit signing?", "/curb/projects/commits/signing") %}

Curb gives each agent a signing key of its own, kept in your operating system's credential store.

Curb backs up each settings file for 7 days. Undo is under Fixes.

{% endcall %} {% set who = {"claude": "Claude Code", "codex": "Codex"}.get(key, "this agent") %} {% call k.review_box("replace", "Replace the " ~ who ~ " key?", "/curb/projects/commits/signing", {"replace": key}) %}

This cannot be undone: the old key is deleted.

{% endcall %} {% endblock %}