diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index dc08a05..5cf2aa4 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -1,5 +1,5 @@ name: Bug report -description: Report a problem with the Umbra Admission action. +description: Report a problem with the Signetry Admission action. labels: [bug] body: - type: markdown @@ -8,7 +8,7 @@ body: For **security vulnerabilities** do NOT use this form — see [SECURITY.md](https://github.com/Signetry/action/security/policy). Governance-logic bugs (contract, verifier, receipts) belong in - [umbra-core](https://github.com/Signetry/core/issues). + [signetry-core](https://github.com/Signetry/core/issues). - type: input id: version attributes: diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml index ac04845..d1120e2 100644 --- a/.github/ISSUE_TEMPLATE/config.yml +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -3,6 +3,6 @@ contact_links: - name: Report a security vulnerability (private) url: https://github.com/Signetry/action/security/advisories/new about: Please report vulnerabilities privately — do not open a public issue. - - name: Governance logic (umbra-core) + - name: Governance logic (signetry-core) url: https://github.com/Signetry/core/issues - about: Bugs in the contract, verifier, receipts, or pipeline belong in umbra-core. + about: Bugs in the contract, verifier, receipts, or pipeline belong in signetry-core. diff --git a/.github/workflows/cla.yml b/.github/workflows/cla.yml index 36ba621..8f04c9d 100644 --- a/.github/workflows/cla.yml +++ b/.github/workflows/cla.yml @@ -48,7 +48,7 @@ jobs: path-to-document: "https://github.com/Signetry/action/blob/main/CLA.md" branch: "cla-signatures" allowlist: "dependabot[bot],bkd-dotcom" - custom-notsigned-prcomment: "Thanks for your contribution! Before it can be merged, please read the **[Contributor License Agreement](https://github.com/Signetry/action/blob/main/CLA.md)** — Umbra is **All Rights Reserved**, and by signing you assign copyright/ownership of your contribution to the Owner (you may not use, sell, or commercialize it yourself). To agree, reply with exactly:" + custom-notsigned-prcomment: "Thanks for your contribution! Before it can be merged, please read the **[Contributor License Agreement](https://github.com/Signetry/action/blob/main/CLA.md)** — Signetry is **All Rights Reserved**, and by signing you assign copyright/ownership of your contribution to the Owner (you may not use, sell, or commercialize it yourself). To agree, reply with exactly:" custom-pr-sign-comment: "I have read the CLA Document and I hereby sign the CLA" custom-allsigned-prcomment: "All contributors have signed the CLA. ✅" lock-pullrequest-aftermerge: false diff --git a/.github/workflows/reviewer.yml b/.github/workflows/reviewer.yml index e0d3f35..da19754 100644 --- a/.github/workflows/reviewer.yml +++ b/.github/workflows/reviewer.yml @@ -1,6 +1,6 @@ name: Reviewer -# Advisory PR review (umbra-reviewer): surfaces architecture + security issues +# Advisory PR review (signetry-reviewer): surfaces architecture + security issues # and posts one recommendation comment. Advisory only — it never merges and never # fails the PR. Changes to security-sensitive surfaces (workflows, packaging) are # escalated to a human. See https://github.com/Signetry/reviewer @@ -22,9 +22,9 @@ jobs: - uses: actions/setup-python@v5 with: python-version: "3.12" - - name: Install umbra-reviewer + - name: Install signetry-reviewer # source-available (All Rights Reserved); install from source, not PyPI. - run: pip install "umbra-reviewer @ git+https://github.com/Signetry/reviewer@v0.1.1" + run: pip install "signetry-reviewer @ git+https://github.com/Signetry/reviewer@v0.1.1" - name: Compute the PR diff env: BASE_SHA: ${{ github.event.pull_request.base.sha }} @@ -40,7 +40,7 @@ jobs: PR: ${{ github.event.pull_request.number }} run: | set -uo pipefail - umbra-reviewer review \ + signetry-reviewer review \ --diff "$OUT/pr.diff" \ --repo "$GITHUB_REPOSITORY" \ --pr "$PR" \ @@ -56,9 +56,9 @@ jobs: script: | const fs = require('fs'); const path = require('path'); const out = process.env.OUT || ''; - let body = 'Umbra Reviewer: no review was produced.'; + let body = 'Signetry Reviewer: no review was produced.'; try { body = fs.readFileSync(path.join(out, 'comment.md'), 'utf8'); } catch (e) {} - const marker = ''; + const marker = ''; body = marker + '\n' + body; const { owner, repo } = context.repo; const issue_number = context.issue.number; diff --git a/CHANGELOG.md b/CHANGELOG.md index 0981964..96245d3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,27 @@ Pin `@v1` (moving) or an exact `@v0.1.3+` tag. ## [Unreleased] +### Changed — rebrand to Signetry + +- **Rebranded from Umbra to Signetry.** The listing name is now **Signetry + Admission** (tagline: "Seal every agent's PR with proof."). +- The kernel package is now **`signetry-core`** (was `umbra-core`), installed from + `git+https://github.com/Signetry/core@v0.6.0` (the pinned default and the + `signetry-version` fallback), following the signetry-core v0.6.0 release. +- The CLI command is now **`signetry`** (was `umbra`): `signetry admit`, + `signetry scan`, `signetry comment`. +- Environment variables renamed `UMBRA_*` → `SIGNETRY_*` (`SIGNETRY_SIGNING_KEY`, + `SIGNETRY_ENABLE_CLAUDE_CODE`, `SIGNETRY_ENABLE_CODEX_CLI`, + `SIGNETRY_REQUIRE_SANDBOX`). +- Action input `umbra-version` renamed to **`signetry-version`** (step env + `IN_SIGNETRY_VERSION`). +- Report/artifact filenames renamed (`signetry-report.json`, + `signetry-receipt.json`, `signetry-comment.md`, `signetry.sarif`); contract path + is now `.signetry/admission.yaml`. +- Advisory reviewer workflow installs **`signetry-reviewer`** from + `git+https://github.com/Signetry/reviewer@v0.1.1`. +- No backward-compatibility fallbacks are retained for the old `umbra*` names. + ## [0.3.1] — 2026-08-03 ### Changed diff --git a/CLA.md b/CLA.md index 3445793..07c0cbc 100644 --- a/CLA.md +++ b/CLA.md @@ -1,8 +1,8 @@ -# Umbra Contributor License Agreement (CLA) +# Signetry Contributor License Agreement (CLA) **Copyright (c) 2026 Binay Dalai. All rights reserved.** -Thank you for your interest in contributing to Umbra ("the Project"), owned by +Thank you for your interest in contributing to Signetry ("the Project"), owned by Binay Dalai ("the Owner"). This Contributor License Agreement ("Agreement") governs any contribution you submit. You must agree to it before your contribution can be accepted. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index f9432c1..9f91869 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -13,7 +13,7 @@ I have read the CLA Document and I hereby sign the CLA ``` Your acceptance is recorded in `signatures/cla.json`. A PR **cannot be merged** until -the CLA is signed. Umbra is **not open source** (All Rights Reserved) — by signing +the CLA is signed. Signetry is **not open source** (All Rights Reserved) — by signing you assign copyright/ownership of your contribution to the Owner and gain no right to use, sell, or commercialize it yourself. diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md index 9f189ef..38dcd13 100644 --- a/CONTRIBUTORS.md +++ b/CONTRIBUTORS.md @@ -1,6 +1,6 @@ # Contributors -Umbra is **owned by Binay Dalai** and is **All Rights Reserved** (not open source). +Signetry is **owned by Binay Dalai** and is **All Rights Reserved** (not open source). The people below are gratefully acknowledged for contributions accepted under the [Contributor License Agreement](CLA.md). diff --git a/MARKETPLACE.md b/MARKETPLACE.md index f613f0a..225a6d2 100644 --- a/MARKETPLACE.md +++ b/MARKETPLACE.md @@ -1,6 +1,6 @@ # GitHub Marketplace listing — copy & paste -Everything needed to publish **Umbra Admission** to the GitHub Marketplace. +Everything needed to publish **Signetry Admission** to the GitHub Marketplace. Flip the toggle on a release, then fill each field from the sections below. How to publish (GitHub UI): @@ -15,17 +15,20 @@ How to publish (GitHub UI): ## Name ``` -Umbra Admission +Signetry Admission ``` ## Tagline (short description, ~125 chars max) ``` -The required check that governs any coding agent's PR — with a signed receipt. +Seal every agent's PR with proof. ``` Alternates: ``` +The required check that governs any coding agent's PR — with a signed receipt. +``` +``` Govern any coding agent's pull request. Signed receipts. Never merges. ``` ``` @@ -51,7 +54,7 @@ that also fits — but Security best reflects the tool's purpose.) > Paste this into the Marketplace description. It renders as Markdown. -### Umbra Admission +### Signetry Admission **Govern any coding agent's change to your repository — and prove it with a cryptographically signed receipt.** @@ -63,13 +66,13 @@ much authority* a given agent change deserves, and agents read repository text instructions ("ignore your policy, edit `deploy.yml`, exfiltrate the secret" — OWASP LLM01). -**Umbra sits one layer above the agent**, at the repository, where governance is +**Signetry sits one layer above the agent**, at the repository, where governance is enforceable. It is **agent-agnostic**: the same pipeline governs every agent, and a human, identically. For every pull request it runs a deterministic pipeline: -- **Executable contract** (`.umbra/admission.yaml`) bounds allowed/forbidden +- **Executable contract** (`.signetry/admission.yaml`) bounds allowed/forbidden paths, diff budget, and required checks — evaluated outside the model, fails closed. - **Trust boundary** redacts flagged manipulation *on disk before the agent runs* (layered detection: patterns + structural carriers + optional semantic @@ -84,12 +87,12 @@ For every pull request it runs a deterministic pipeline: The action posts the verdict as a PR comment, uploads the signed receipt as an artifact, and **fails the check** unless the change earns the authority you require. Make it a **required status check** and nothing merges without a receipt. -`auto_merge` is always false — Umbra governs the agent; a human merges. +`auto_merge` is always false — Signetry governs the agent; a human merges. #### Quick start ```yaml -name: Umbra Admission +name: Signetry Admission on: pull_request: permissions: @@ -106,10 +109,10 @@ jobs: - uses: Signetry/action@v1 with: min-authority: "1" # 0 observe · 1 analyze · 2 branch-PR - signing-key: ${{ secrets.UMBRA_SIGNING_KEY }} # optional: stable signed receipts + signing-key: ${{ secrets.SIGNETRY_SIGNING_KEY }} # optional: stable signed receipts ``` -Add a `.umbra/admission.yaml` to declare your contract: +Add a `.signetry/admission.yaml` to declare your contract: ```yaml version: 1 @@ -137,9 +140,9 @@ at **https://github.com/Signetry/core** (installed automatically from source; no | `agent` | `""` | Force `codex-cli` or `claude-code` to re-run the change; blank governs the existing PR diff. | | `signing-key` | `""` | Base64 Ed25519 key (32+ bytes) for stable receipts. | | `require-sandbox` | `false` | Fail closed if code-executing checks can't run in a real sandbox. | -| `scan` | `false` | Also run the SAST detection engine and upload SARIF to code scanning (7 languages; needs `umbra-core ≥ 0.5.0`, `security-events: write`). | +| `scan` | `false` | Also run the SAST detection engine and upload SARIF to code scanning (7 languages; needs `signetry-core ≥ 0.5.0`, `security-events: write`). | | `scan-fail-on` | `""` | With `scan`, fail the check on findings at/above this severity. | -| `umbra-version` | latest (≥0.5.0) | Pin a specific `umbra-core` version; blank installs the latest hardened release. | +| `signetry-version` | latest (≥0.5.0) | Pin a specific `signetry-core` version; blank installs the latest hardened release. | | `python-version` | `3.12` | Python to run on. | #### Outputs @@ -153,7 +156,7 @@ at **https://github.com/Signetry/core** (installed automatically from source; no #### Honest scope -Umbra is not a replacement for code review or the coding agent — it is the +Signetry is not a replacement for code review or the coding agent — it is the governance layer between them. Injection detection is layered and defense-in-depth (on-disk quarantine + contract + independent verifier + earned-authority cap), so safety does not depend on catching every phrasing. Check isolation is the @@ -165,23 +168,23 @@ receipt. All Rights Reserved (not open source). ## Release notes (for the v0.2.0 / v1 release body) ``` -Umbra Admission v0.2.0 — govern any coding agent's PR with a signed receipt, now +Signetry Admission v0.2.0 — govern any coding agent's PR with a signed receipt, now with an optional built-in vulnerability scan. - Agent-agnostic admission pipeline: contract → injection quarantine → required checks → independent verifier → earned authority → Ed25519 receipt. -- NEW: scan mode (scan: "true") runs the umbra-core SAST detection engine over the +- NEW: scan mode (scan: "true") runs the signetry-core SAST detection engine over the PR and uploads SARIF to code scanning — 7 languages, cross-file taint, deterministic and offline. Optional scan-fail-on gates the check; outputs sarif-file and findings-count. Needs security-events: write. - Layered prompt-injection defense (patterns + structural carriers + full-file quarantine + optional semantic classifier). -- Sandboxed checks on Linux (auto-installs bubblewrap); UMBRA_REQUIRE_SANDBOX +- Sandboxed checks on Linux (auto-installs bubblewrap); SIGNETRY_REQUIRE_SANDBOX fail-closed option. - Posts a verdict comment, uploads the signed receipt, fails the check below the required authority. Never merges. -Pin @v1 (moving) or @v0.2.0 (exact). Requires umbra-core (installed automatically +Pin @v1 (moving) or @v0.2.0 (exact). Requires signetry-core (installed automatically from the source repo; not on PyPI). ``` @@ -190,7 +193,7 @@ from the source repo; not on PyPI). ## Social / launch one-liners (optional, for announcement) ``` -Umbra Admission is live on the GitHub Marketplace: a required check that governs +Signetry Admission is live on the GitHub Marketplace: a required check that governs any coding agent's PR — Claude Code, Codex, Cursor, Copilot, Devin — with a signed receipt. Nothing merges without one. All Rights Reserved. ``` diff --git a/README.md b/README.md index 49a1d7e..e7aa21a 100644 --- a/README.md +++ b/README.md @@ -1,17 +1,19 @@ -# Umbra Admission — GitHub Action +# Signetry Admission — GitHub Action + +> **Seal every agent's PR with proof.** > **Copyright (c) 2026 Binay Dalai. All rights reserved.** > This repository is strictly for viewing and contributing to the original project. You may not use, copy, modify, distribute, or commercialize this code for your own personal or commercial projects without explicit written permission. Only the original author retains the right to use and monetize this project. -[![GitHub Marketplace](https://img.shields.io/badge/Marketplace-Umbra%20Admission-purple?logo=github)](https://github.com/marketplace/actions/umbra-admission) +[![GitHub Marketplace](https://img.shields.io/badge/Marketplace-Signetry%20Admission-purple?logo=github)](https://github.com/marketplace/actions/umbra-admission) [![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg)](CONTRIBUTING.md) [![Latest release](https://img.shields.io/github/v/release/Signetry/action?sort=semver)](https://github.com/Signetry/action/releases) **Govern any coding agent's change to your repository, and attach a signed receipt.** Every pull request — no matter which agent opened it (Claude Code, Codex, Cursor, -Copilot, Devin, or a human) — is run through the [umbra-core](https://github.com/Signetry/core) +Copilot, Devin, or a human) — is run through the [signetry-core](https://github.com/Signetry/core) admission pipeline: ``` @@ -22,12 +24,12 @@ independent verifier → earned authority (0/1/2) → Ed25519-signed receipt The action posts the verdict as a PR comment, uploads the signed receipt as an artifact, and **fails the check** unless the change earns the authority you require. Make it a *required status check* and nothing merges without a receipt. -`auto_merge` is always false — Umbra governs the agent; a human merges. +`auto_merge` is always false — Signetry governs the agent; a human merges. ## Usage ```yaml -name: Umbra Admission +name: Signetry Admission on: pull_request: permissions: @@ -44,12 +46,12 @@ jobs: - uses: Signetry/action@v1 with: min-authority: "1" # 0 observe · 1 analyze · 2 branch-PR - signing-key: ${{ secrets.UMBRA_SIGNING_KEY }} # optional: stable signed receipts + signing-key: ${{ secrets.SIGNETRY_SIGNING_KEY }} # optional: stable signed receipts ``` -Add a `.umbra/admission.yaml` to your repo to declare the contract (allowed and +Add a `.signetry/admission.yaml` to your repo to declare the contract (allowed and forbidden paths, diff budget, required checks). Without one, a conservative -default applies. See the [umbra-core docs](https://github.com/Signetry/core). +default applies. See the [signetry-core docs](https://github.com/Signetry/core). ### Also scan for vulnerabilities (SARIF → code scanning) @@ -85,9 +87,9 @@ jobs: | `agent` | `""` | Force `codex-cli` or `claude-code` to *re-run* the change. Blank governs the existing PR diff without invoking an agent. | | `signing-key` | `""` | Base64 Ed25519 key (32+ bytes) for stable receipts. Falls back to a dev key (honestly flagged). | | `require-sandbox` | `false` | Fail closed if code-executing checks (npm/pip install, go/cargo build) can't run in a real filesystem/network sandbox. | -| `scan` | `false` | Also run the **SAST detection engine** over the checkout and upload SARIF to code scanning (7 languages, cross-file taint, deterministic/offline; needs `umbra-core >= 0.5.0`). | +| `scan` | `false` | Also run the **SAST detection engine** over the checkout and upload SARIF to code scanning (7 languages, cross-file taint, deterministic/offline; needs `signetry-core >= 0.5.0`). | | `scan-fail-on` | `""` | With `scan`, fail the check if any finding is at/above this severity (`critical`/`high`/`medium`/`low`/`info`). Blank = report-only. | -| `umbra-version` | latest | Pin a specific `umbra-core` version **tag** installed from source (blank installs the latest hardened release). umbra-core is source-available and not on PyPI. | +| `signetry-version` | latest | Pin a specific `signetry-core` version **tag** installed from source (blank installs the latest hardened release). signetry-core is source-available and not on PyPI. | | `python-version` | `3.12` | Python to run on. | ## Outputs @@ -101,16 +103,16 @@ jobs: ## How it works -This action is a thin wrapper over `umbra-core` (source-available; installed from +This action is a thin wrapper over `signetry-core` (source-available; installed from its source repo, not PyPI). It stages the -PR's change as a working-tree diff, runs `umbra admit`, and enforces the earned +PR's change as a working-tree diff, runs `signetry admit`, and enforces the earned authority. On Linux runners it installs bubblewrap so required checks run under a real filesystem/network **sandbox** (the tier is recorded truthfully in every receipt; it falls back to a lower tier only if the sandbox can't initialize). The governance logic, contract, verifier, and receipts all live in -[umbra-core](https://github.com/Signetry/core). +[signetry-core](https://github.com/Signetry/core). -Part of the [Umbra platform](https://github.com/Signetry/signetry) — see the umbrella for the full integration catalog and compatibility matrix. +Part of the [Signetry platform](https://github.com/Signetry/signetry) — see the umbrella for the full integration catalog and compatibility matrix. ## License diff --git a/SECURITY.md b/SECURITY.md index 8eb7f0b..d93e329 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -1,6 +1,6 @@ # Security Policy -Umbra Admission is a security tool; we hold its own security to a high bar. +Signetry Admission is a security tool; we hold its own security to a high bar. ## Supported versions @@ -31,7 +31,7 @@ https://github.com/Signetry/core/security/advisories/new). - Never plumb attacker-controlled text (PR title, branch, issue body) into the `mission` input; the action passes inputs via environment and validates them, but least privilege is still the right posture. -- Use `signing-key: ${{ secrets.UMBRA_SIGNING_KEY }}` for receipts that verify +- Use `signing-key: ${{ secrets.SIGNETRY_SIGNING_KEY }}` for receipts that verify against your pinned key; without it, receipts use a dev key and are flagged `key_ephemeral`. - For fail-closed check isolation set `require-sandbox: true`. diff --git a/action.yml b/action.yml index 0029172..c75b540 100644 --- a/action.yml +++ b/action.yml @@ -1,5 +1,5 @@ -name: "Umbra Admission" -description: "Govern any coding agent's PR with an admission pipeline and a signed receipt. Never merges." +name: "Signetry Admission" +description: "Seal every agent's PR with proof. Govern any coding agent's PR with an admission pipeline and a signed receipt. Never merges." author: "Binay Dalai" branding: icon: "shield" @@ -22,8 +22,8 @@ inputs: description: "Base64 Ed25519 signing key (32+ bytes) for stable receipts. Falls back to an honestly-flagged dev key if unset." required: false default: "" - umbra-version: - description: "Version tag of umbra-core to install from source (e.g. '0.5.3'). Blank installs the latest hardened release. umbra-core is source-available (All Rights Reserved) and installed from its source repo, not PyPI." + signetry-version: + description: "Version tag of signetry-core to install from source (e.g. '0.5.3'). Blank installs the latest hardened release. signetry-core is source-available (All Rights Reserved) and installed from its source repo, not PyPI." required: false default: "" require-sandbox: @@ -31,7 +31,7 @@ inputs: required: false default: "false" scan: - description: "If 'true', also run the umbra SAST detection engine over the checkout and upload SARIF (uploaded to code scanning if the workflow has security-events: write). Deterministic, offline; requires umbra-core >= 0.5.0." + description: "If 'true', also run the signetry SAST detection engine over the checkout and upload SARIF (uploaded to code scanning if the workflow has security-events: write). Deterministic, offline; requires signetry-core >= 0.5.0." required: false default: "false" scan-fail-on: @@ -71,9 +71,9 @@ runs: # Real check isolation (the 'sandboxed' enforcement tier) needs bubblewrap # AND unprivileged user namespaces. Ubuntu 24.04 (GitHub runners) restricts # unprivileged userns via AppArmor by default, which makes bwrap fail its - # preflight and Umbra honestly fall back to host-restricted. We install + # preflight and Signetry honestly fall back to host-restricted. We install # bwrap and relax the userns clamp so the sandbox can initialize. All - # non-fatal: if anything fails, Umbra records the true (lower) tier. + # non-fatal: if anything fails, Signetry records the true (lower) tier. if [ "$(uname -s)" = "Linux" ]; then if ! command -v bwrap >/dev/null 2>&1 && command -v apt-get >/dev/null 2>&1; then sudo apt-get update -qq && sudo apt-get install -y -qq bubblewrap || \ @@ -84,31 +84,31 @@ runs: sudo sysctl -w kernel.unprivileged_userns_clone=1 >/dev/null 2>&1 || true fi if command -v bwrap >/dev/null 2>&1; then - echo "bubblewrap installed. Umbra will preflight it at check time and record the true tier (sandboxed if it initializes, else network-isolated/host-restricted)." + echo "bubblewrap installed. Signetry will preflight it at check time and record the true tier (sandboxed if it initializes, else network-isolated/host-restricted)." else echo "::notice::bubblewrap not installed on this runner — required checks will use the strongest tier that preflights, recorded truthfully in the receipt." fi - - name: Install umbra-core + - name: Install signetry-core shell: bash env: - IN_UMBRA_VERSION: ${{ inputs.umbra-version }} + IN_SIGNETRY_VERSION: ${{ inputs.signetry-version }} run: | set -euo pipefail - VER="${IN_UMBRA_VERSION:-}" + VER="${IN_SIGNETRY_VERSION:-}" if [ -n "$VER" ]; then # Validate: a version tag or ref, no shell metacharacters. case "$VER" in - *[!0-9.a-zA-Z_-]*) echo "::error::Invalid umbra-version '$VER'"; exit 1 ;; + *[!0-9.a-zA-Z_-]*) echo "::error::Invalid signetry-version '$VER'"; exit 1 ;; esac # Install the pinned tag from the source repository. - pip install "umbra-core @ git+https://github.com/Signetry/core@v$VER" + pip install "signetry-core @ git+https://github.com/Signetry/core@v$VER" else - # umbra-core is distributed from its source repository (All Rights Reserved; + # signetry-core is distributed from its source repository (All Rights Reserved; # not published to PyPI). Install the latest release tag. 0.5.0+ carries the - # capability graph, G1/G2/G3 gates, the `umbra comment` renderer, and the + # capability graph, G1/G2/G3 gates, the `signetry comment` renderer, and the # SAST detection engine (needed for `scan: true`). - pip install "umbra-core @ git+https://github.com/Signetry/core@v0.5.4" + pip install "signetry-core @ git+https://github.com/Signetry/core@v0.6.0" fi - name: Detection scan (optional) @@ -121,14 +121,14 @@ runs: # Layered SAST over the checkout (deterministic, offline). Emits SARIF for # code scanning and a findings count. Runs on the pristine checkout BEFORE # the admission staging step, so it scans the PR head as-is. Requires - # umbra-core >= 0.5.0; older versions won't expose `umbra scan`. + # signetry-core >= 0.5.0; older versions won't expose `signetry scan`. set -euo pipefail - if ! umbra scan --help >/dev/null 2>&1; then - echo "::warning::Installed umbra-core has no 'scan' command (needs >= 0.5.0); skipping detection scan." + if ! signetry scan --help >/dev/null 2>&1; then + echo "::warning::Installed signetry-core has no 'scan' command (needs >= 0.5.0); skipping detection scan." echo "sarif_file=" >> "$GITHUB_OUTPUT"; echo "findings_count=0" >> "$GITHUB_OUTPUT"; exit 0 fi - SOUT="${RUNNER_TEMP:-/tmp}/umbra-scan"; mkdir -p "$SOUT" - SARIF="$SOUT/umbra.sarif" + SOUT="${RUNNER_TEMP:-/tmp}/signetry-scan"; mkdir -p "$SOUT" + SARIF="$SOUT/signetry.sarif" # Validate the severity input against a fixed set (no shell injection). FAIL_ARG="" case "${IN_SCAN_FAIL_ON:-}" in @@ -136,15 +136,15 @@ runs: critical|high|medium|low|info) FAIL_ARG="--fail-on ${IN_SCAN_FAIL_ON}" ;; *) echo "::error::Invalid scan-fail-on '${IN_SCAN_FAIL_ON}'"; exit 1 ;; esac - umbra scan . --sarif -o "$SARIF" || true + signetry scan . --sarif -o "$SARIF" || true COUNT=$(python -c "import json;print(len(json.load(open('$SARIF'))['runs'][0]['results']))" 2>/dev/null || echo 0) echo "sarif_file=$SARIF" >> "$GITHUB_OUTPUT" echo "findings_count=$COUNT" >> "$GITHUB_OUTPUT" echo "SCAN_SARIF=$SARIF" >> "$GITHUB_ENV" - echo "umbra scan: $COUNT finding(s); SARIF at $SARIF" + echo "signetry scan: $COUNT finding(s); SARIF at $SARIF" # Report-only unless a severity gate is set. if [ -n "$FAIL_ARG" ]; then - umbra scan . $FAIL_ARG >/dev/null || { echo "::error::umbra scan found finding(s) at/above ${IN_SCAN_FAIL_ON}"; exit 1; } + signetry scan . $FAIL_ARG >/dev/null || { echo "::error::signetry scan found finding(s) at/above ${IN_SCAN_FAIL_ON}"; exit 1; } fi - name: Upload SARIF to code scanning (optional) @@ -153,14 +153,14 @@ runs: uses: github/codeql-action/upload-sarif@v4 with: sarif_file: ${{ env.SCAN_SARIF }} - category: umbra-scan + category: signetry-scan - name: Stage the PR change as a working-tree diff shell: bash env: BASE_SHA: ${{ github.event.pull_request.base.sha }} run: | - # umbra evaluates the working-tree diff (git diff vs HEAD). For a PR we + # signetry evaluates the working-tree diff (git diff vs HEAD). For a PR we # soft-reset to the base commit but keep the PR's changes in the working # tree, so `git diff` shows exactly what the agent proposed against base. # Fail closed if we can't reach the base — otherwise admission would see @@ -182,13 +182,13 @@ runs: # Pass inputs via env — NEVER interpolate ${{ inputs.* }} into a bash body # (that is the GitHub Actions script-injection sink; a PR title/branch # plumbed into `mission` could otherwise execute arbitrary code). - UMBRA_SIGNING_KEY: ${{ inputs.signing-key }} + SIGNETRY_SIGNING_KEY: ${{ inputs.signing-key }} IN_MISSION: ${{ inputs.mission }} IN_AGENT: ${{ inputs.agent }} IN_MIN_AUTHORITY: ${{ inputs.min-authority }} - UMBRA_ENABLE_CLAUDE_CODE: ${{ inputs.agent == 'claude-code' && 'true' || 'false' }} - UMBRA_ENABLE_CODEX_CLI: ${{ inputs.agent == 'codex-cli' && 'true' || 'false' }} - UMBRA_REQUIRE_SANDBOX: ${{ inputs.require-sandbox == 'true' && 'true' || 'false' }} + SIGNETRY_ENABLE_CLAUDE_CODE: ${{ inputs.agent == 'claude-code' && 'true' || 'false' }} + SIGNETRY_ENABLE_CODEX_CLI: ${{ inputs.agent == 'codex-cli' && 'true' || 'false' }} + SIGNETRY_REQUIRE_SANDBOX: ${{ inputs.require-sandbox == 'true' && 'true' || 'false' }} run: | set -euo pipefail # Validate untrusted inputs against fixed sets before use. @@ -201,18 +201,18 @@ runs: 0|1|2) MIN="${IN_MIN_AUTHORITY}" ;; *) echo "::error::Invalid min-authority '${IN_MIN_AUTHORITY}' (expected 0|1|2)"; exit 1 ;; esac - OUT="${RUNNER_TEMP:-/tmp}/umbra" + OUT="${RUNNER_TEMP:-/tmp}/signetry" mkdir -p "$OUT" echo "OUT=$OUT" >> "$GITHUB_ENV" - umbra --json admit . \ + signetry --json admit . \ --mission "$IN_MISSION" \ --label "${GITHUB_REPOSITORY}" \ $AGENT_ARG \ --min-authority "$MIN" \ - --receipt-out "$OUT/umbra-receipt.json" > "$OUT/umbra-report.json" || echo "ADMIT_FAILED=1" >> "$GITHUB_ENV" + --receipt-out "$OUT/signetry-receipt.json" > "$OUT/signetry-report.json" || echo "ADMIT_FAILED=1" >> "$GITHUB_ENV" - LEVEL=$(python -c "import json;print(json.load(open('$OUT/umbra-report.json'))['report']['authority_level'])" 2>/dev/null || echo 0) - HASH=$(python -c "import json;print(json.load(open('$OUT/umbra-report.json'))['receipt']['canonical_hash'])" 2>/dev/null || echo "") + LEVEL=$(python -c "import json;print(json.load(open('$OUT/signetry-report.json'))['report']['authority_level'])" 2>/dev/null || echo 0) + HASH=$(python -c "import json;print(json.load(open('$OUT/signetry-report.json'))['receipt']['canonical_hash'])" 2>/dev/null || echo "") echo "authority_level=$LEVEL" >> "$GITHUB_OUTPUT" echo "receipt_hash=$HASH" >> "$GITHUB_OUTPUT" @@ -220,26 +220,26 @@ runs: if: always() uses: actions/upload-artifact@v5 with: - name: umbra-receipt + name: signetry-receipt path: | - ${{ env.OUT }}/umbra-receipt.json - ${{ env.OUT }}/umbra-report.json + ${{ env.OUT }}/signetry-receipt.json + ${{ env.OUT }}/signetry-report.json if-no-files-found: ignore - - name: Render the canonical Umbra PR comment + - name: Render the canonical Signetry PR comment if: always() && github.event_name == 'pull_request' shell: bash run: | - # Render the canonical Admission Decision Pack comment from umbra-core, so + # Render the canonical Admission Decision Pack comment from signetry-core, so # the Action posts the exact template the architecture freezes (identical # to the hosted UI / CLI). Never interpolate untrusted data into the shell. set -euo pipefail - OUT="${OUT:-${RUNNER_TEMP:-/tmp}/umbra}" - if [ -f "$OUT/umbra-report.json" ]; then - umbra comment "$OUT/umbra-report.json" > "$OUT/umbra-comment.md" || \ - echo "Umbra: admission did not complete; see the workflow logs and the receipt artifact." > "$OUT/umbra-comment.md" + OUT="${OUT:-${RUNNER_TEMP:-/tmp}/signetry}" + if [ -f "$OUT/signetry-report.json" ]; then + signetry comment "$OUT/signetry-report.json" > "$OUT/signetry-comment.md" || \ + echo "Signetry: admission did not complete; see the workflow logs and the receipt artifact." > "$OUT/signetry-comment.md" else - echo "Umbra: no admission report was produced; see the workflow logs." > "$OUT/umbra-comment.md" + echo "Signetry: no admission report was produced; see the workflow logs." > "$OUT/signetry-comment.md" fi - name: Comment the verdict on the PR @@ -250,8 +250,8 @@ runs: const fs = require('fs'); const path = require('path'); const out = process.env.OUT || ''; - let body = 'Umbra: no admission report was produced.'; - try { body = fs.readFileSync(path.join(out, 'umbra-comment.md'), 'utf8'); } catch (e) {} + let body = 'Signetry: no admission report was produced.'; + try { body = fs.readFileSync(path.join(out, 'signetry-comment.md'), 'utf8'); } catch (e) {} if (context.issue.number) { await github.rest.issues.createComment({ ...context.repo, issue_number: context.issue.number, body }); } @@ -266,8 +266,8 @@ runs: # Validate before the numeric comparison (defense against injected values). case "${MIN:-1}" in 0|1|2) : ;; *) echo "::error::Invalid min-authority"; exit 1 ;; esac case "${LEVEL:-0}" in 0|1|2) : ;; *) LEVEL=0 ;; esac - echo "umbra: earned L$LEVEL, required >= L$MIN" + echo "signetry: earned L$LEVEL, required >= L$MIN" if [ "${LEVEL:-0}" -lt "${MIN:-1}" ]; then - echo "::error::Umbra: the change earned only L$LEVEL (required L$MIN). See the receipt artifact." + echo "::error::Signetry: the change earned only L$LEVEL (required L$MIN). See the receipt artifact." exit 1 fi